Upload Destinations
When you include an upload field in your render request, you specify a destination object that tells the system where to send the rendered video. This page documents the configuration for each supported destination.
Every destination object requires a type field. The remaining fields depend on the destination type.
Amazon S3
Upload rendered videos directly to an S3 bucket. Supports two authentication methods: AWS access keys or bucket policy.
Using access keys
{
"upload": {
"extension": "mp4",
"destination": {
"type": "s3",
"bucket": "my-videos",
"filename": "renders/welcome.mp4",
"aws_access_key_id": "AKIAIOSFODNN7EXAMPLE",
"aws_secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
}
}
Using a bucket policy
Instead of providing AWS keys, you can grant upload permissions to ImpossibleFX via a bucket policy. Set the policy to allow the following actions for the canonical user ID 1ea9f667f8ec65aa76ca17cbacfda01ba70493b59f7124a810823def30e10216:
s3:AbortMultipartUploads3:ListMultipartUploadPartss3:PutObjects3:PutObjectAcl
Then use aws_use_policy instead of keys:
{
"upload": {
"extension": "mp4",
"destination": {
"type": "s3",
"bucket": "my-videos",
"filename": "renders/welcome.mp4",
"aws_use_policy": true
}
}
}
See the full S3 bucket policy example for a ready-to-use policy you can paste into the AWS Console.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
type | String | Yes | — | Must be "s3". |
bucket | String | Yes | — | S3 bucket name. |
filename | String | Yes | — | Object key (path and filename) in the bucket. |
aws_access_key_id | String | No | — | AWS access key ID. Not needed if using bucket policy. |
aws_secret_access_key | String | No | — | AWS secret access key. Not needed if using bucket policy. |
aws_use_policy | Boolean | No | false | Use bucket policy authentication instead of access keys. |
s3host | String | No | — | S3 endpoint host. Required for Signature V4 regions (e.g., eu-central-1). |
acl | String | No | "public-read" | Access control: "private", "public-read", "public-read-write", or "authenticated-read". |
contenttype | String | No | "application/octet-stream" | MIME type of the uploaded file (e.g., "video/mp4"). |
contentdisposition | String | No | — | Content-Disposition header value. |
cachecontrol | String | No | — | Cache-Control header value. |
secure | Boolean | No | false | Return HTTPS URLs in the response. |
reduced_redundancy | Boolean | No | false | Use reduced redundancy storage class. |
metadata | Object | No | — | Custom metadata key-value pairs (set as x-amz-meta-* headers). |
Response
Returns the public S3 URL of the uploaded file:
{
"token": "v2:eu-west-1:abc123",
"upload": "https://my-videos.s3.amazonaws.com/renders/welcome.mp4"
}
Microsoft Azure Blob Storage
Upload to an Azure storage account.
{
"upload": {
"extension": "mp4",
"destination": {
"type": "azureblob",
"account": "mystorageaccount",
"key": "your-storage-key",
"container": "videos",
"filename": "renders/welcome.mp4",
"contenttype": "video/mp4"
}
}
}
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
type | String | Yes | — | Must be "azureblob". |
account | String | Yes | — | Azure storage account name. |
key | String | Yes | — | Azure storage account key. |
filename | String | Yes | — | Destination blob name. |
container | String | No | — | Storage container name. |
contenttype | String | No | "application/octet-stream" | MIME type of the uploaded file. |
YouTube
Upload rendered videos directly to a YouTube channel.
YouTube enforces upload rate limits — typically around 400 videos per day, sometimes as low as 50 per hour per channel. These limits are set by YouTube and can change without notice.
{
"upload": {
"extension": "mp4",
"destination": {
"type": "youtube",
"title": "Welcome, Alex!",
"description": "A personalized welcome video.",
"category": "22",
"status": "unlisted",
"tags": ["personalized", "welcome"],
"oauth_access_token": "ya29.your-oauth-token"
}
}
}
Authorization
Upload to a user’s channel: Obtain an OAuth 2.0 access token via Google’s standard OAuth flow and pass it as oauth_access_token.
Upload to your own channel: Visit https://oauth.impossible.io/google/youtube/ to authorize ImpossibleFX. This gives you an auth_secret you can use instead of an OAuth token.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
type | String | Yes | — | Must be "youtube". |
title | String | Yes | — | Video title. |
description | String | Yes | — | Video description. |
category | String | Yes | — | YouTube category ID (e.g., "22" for People & Blogs). See category list below. |
status | String | No | "public" | Privacy: "public", "private", or "unlisted". |
oauth_access_token | String | No | — | Google OAuth 2.0 access token with YouTube upload scope. |
auth_secret | String | No | — | ImpossibleFX auth secret for uploading to your own channel. |
tags | Array | No | — | List of tag strings. |
playlistid | String | No | — | Add the video to this playlist (use the playlist ID, not the name). |
notifySubscribers | Boolean | No | true | Notify channel subscribers about the upload. |
mimetype | String | No | "video/mp4" | MIME type of the video file. |
YouTube category IDs
| ID | Category | ID | Category |
|---|---|---|---|
| 1 | Film & Animation | 20 | Gaming |
| 2 | Autos & Vehicles | 22 | People & Blogs |
| 10 | Music | 23 | Comedy |
| 15 | Pets & Animals | 24 | Entertainment |
| 17 | Sports | 25 | News & Politics |
| 18 | Short Movies | 26 | Howto & Style |
| 19 | Travel & Events | 27 | Education |
| 28 | Science & Technology | 44 | Trailers |
Category availability varies by country. Use “22” (People & Blogs) as a safe default.
Upload videos to a Facebook page or profile.
{
"upload": {
"extension": "mp4",
"destination": {
"type": "facebook",
"title": "Welcome Video",
"description": "A personalized welcome.",
"oauth_access_token": "your-facebook-token"
}
}
}
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
type | String | Yes | — | Must be "facebook". |
title | String | Yes | — | Video title. |
description | String | Yes | — | Video description. |
oauth_access_token | String | No | — | Facebook OAuth token with publish permission. |
caption | String | No | — | Video caption. |
name | String | No | — | Name for the video. |
message | String | No | — | Text to display in the post. |
endpoint | String | No | "https://graph.facebook.com" | Facebook API endpoint. |
Dropbox
Upload to a Dropbox account.
{
"upload": {
"extension": "mp4",
"destination": {
"type": "dropbox",
"filename": "Videos/welcome.mp4",
"auth_secret": "your-auth-secret"
}
}
}
Authorization
Upload to a user’s Dropbox: Obtain an OAuth 2.0 token via Dropbox’s OAuth flow and pass it as oauth_token.
Upload to your own Dropbox: Visit https://oauth.impossible.io/dropbox/authorize/ to get an auth_secret.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
type | String | Yes | — | Must be "dropbox". |
filename | String | Yes | — | Destination path and filename in Dropbox. |
oauth_token | String | No | — | Dropbox OAuth 2.0 token with upload permission. |
auth_secret | String | No | — | ImpossibleFX auth secret for uploading to your own Dropbox. |
HTTP Server
Upload via HTTP POST or PUT to any server endpoint.
{
"upload": {
"extension": "mp4",
"destination": {
"type": "http",
"url": "https://your-server.com/api/videos",
"filename": "welcome.mp4",
"method": "POST",
"headers": {
"Authorization": "Bearer your-api-token"
}
}
}
}
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
type | String | Yes | — | Must be "http". |
url | String | Yes | — | Upload endpoint URL. |
filename | String | Yes | — | Filename for the uploaded file. |
method | String | No | "POST" | HTTP method: "POST" or "GET". |
user | String | No | — | Username for HTTP Basic authentication. |
password | String | No | — | Password for HTTP Basic authentication. |
fileid | String | No | "file" | Form field name for the file in multipart uploads. |
fields | Object | No | {} | Additional form fields to include in the request. |
headers | Object | No | {} | Custom HTTP headers to include in the request. |
FTP Server
Upload via FTP.
{
"upload": {
"extension": "mp4",
"destination": {
"type": "ftp",
"host": "ftp.example.com",
"filename": "/videos/welcome.mp4",
"user": "ftpuser",
"password": "ftppass"
}
}
}
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
type | String | Yes | — | Must be "ftp". |
host | String | Yes | — | FTP server hostname. |
filename | String | Yes | — | Full destination path and filename on the FTP server. |
user | String | No | — | FTP username. |
password | String | No | — | FTP password. |
passive | Boolean | No | false | Use PASSIVE mode for the FTP connection. |
epsv | Boolean | No | false | Use Extended Passive (EPSV) mode. |