Output Destinations & Integrations
By default, rendered videos are stored on the iLoveVideoEditor CDN and are available through a signed download URL. You can also deliver outputs directly to your own storage: S3-compatible buckets (AWS S3, Cloudflare R2, Backblaze B2, Wasabi), Google Cloud Storage, Azure Blob Storage, or Google Drive.
Concepts
- Workspace integration — a saved storage configuration for your workspace (credentials, bucket, path prefix). Stored server-side; secrets are encrypted.
- Default destination — the integration marked
isDefault: true. Used automatically when a render does not specify destinations. - Per-render destination — a
destinationsarray insidevideoJSONthat overrides the default for a single render job.
Supported providers
| Provider | Type | How credentials work |
|---|---|---|
s3 | S3-compatible | Access key + secret for an AWS S3 bucket |
r2 | S3-compatible | Access key + secret + custom endpoint for Cloudflare R2 |
b2 | S3-compatible | Access key + secret + custom endpoint for Backblaze B2 |
wasabi | S3-compatible | Access key + secret + optional endpoint for Wasabi |
gcs | Native | Google Cloud service account JSON key |
azure | Native | Azure Blob account name + account key + container name |
drive | Native | Google Drive OAuth 2.0 (refresh token) |
Configure integrations
You can manage integrations in the dashboard under Account > Integrations or through the REST API.
List integrations
curl https://api.ilovevideoeditor.com/v1/integrations \
-H "Authorization: Bearer YOUR_JWT"Create an S3/R2 integration
curl -X POST https://api.ilovevideoeditor.com/v1/integrations \
-H "Authorization: Bearer YOUR_JWT" \
-H "Content-Type: application/json" \
-d '{
"provider": "r2",
"name": "Marketing R2",
"isActive": true,
"isDefault": true,
"config": {
"endpoint": "https://<account>.r2.cloudflarestorage.com",
"region": "auto",
"bucket": "ilovevideoeditor-outputs",
"accessKeyId": "<access-key>",
"secretAccessKey": "<secret-key>",
"publicUrl": "https://cdn.example.com",
"pathPrefix": "renders/"
}
}'Provider configuration reference
S3-compatible (s3, r2, b2, wasabi)
| Field | Required | Description |
|---|---|---|
bucket | yes | Bucket name |
accessKeyId | yes | Provider access key |
secretAccessKey | yes | Provider secret key |
endpoint | for R2/B2 | S3-compatible endpoint URL |
region | sometimes | Region, e.g. us-east-1 or auto |
publicUrl | no | Public base URL used for returned links. Auto-derived for AWS S3 when no endpoint is set. |
pathPrefix | no | Prepended to every output key. Trailing slash is added automatically. |
Google Cloud Storage (gcs)
| Field | Required | Description |
|---|---|---|
bucket | yes | GCS bucket name |
gcsServiceAccountJson | yes | Full JSON service account key |
gcsProjectId | no | GCP project ID (auto-read from the key if omitted) |
publicUrl | no | Defaults to https://storage.googleapis.com/<bucket> |
pathPrefix | no | Output prefix |
Azure Blob Storage (azure)
| Field | Required | Description |
|---|---|---|
azureAccountName | yes | Storage account name |
azureAccountKey | yes | Storage account key |
azureContainerName | yes | Container name |
publicUrl | no | Defaults to https://<account>.blob.core.windows.net/<container> |
pathPrefix | no | Output prefix |
Google Drive (drive)
Google Drive uses OAuth instead of static credentials. The flow is handled by the dashboard, but you can also trigger it from the API:
- Request an authorization URL:
curl https://api.ilovevideoeditor.com/v1/integrations/drive/auth-url \
-H "Authorization: Bearer YOUR_JWT"- Open the returned
urlin a browser and authorize the app. - The callback completes the flow and creates or updates the
driveintegration for your workspace.
Optional config.driveFolderId can be set to upload into a specific Drive folder.
Use destinations in a render
Add a destinations array to your videoJSON. Each entry references a workspace integration by ID:
{
"name": "Product Promo",
"layers": [ ... ],
"destinations": [
{
"integrationId": "018f...",
"provider": "r2",
"pathPrefix": "campaigns/summer-2026/"
}
]
}Rules:
integrationIdmust belong to an active integration in the caller workspace.providermust match the integration's provider.pathPrefixis optional and overrides the integration's default prefix for this render.- If
destinationsis omitted, the API falls back to the workspace's default integration, or to the platform CDN if none is configured. - When authenticated only with an API key, the key must be linked to a workspace so destinations can be resolved.
Outputs and status
When a render completes, the status response includes an outputs array describing every destination that received the file:
{
"id": "018f...",
"status": "completed",
"url": "https://cdn.ilovevideoeditor.com/.../render.mp4",
"outputs": [
{
"provider": "r2",
"outputKey": "renders/campaigns/summer-2026/render.mp4",
"outputUrl": "https://cdn.example.com/renders/campaigns/summer-2026/render.mp4",
"outputSizeBytes": 2457600,
"status": "completed"
}
]
}The top-level url always points to the iLoveVideoEditor CDN copy. External destinations appear in outputs.
Test an integration
curl -X POST https://api.ilovevideoeditor.com/v1/integrations/018f.../test \
-H "Authorization: Bearer YOUR_JWT"This writes and deletes a small test file using the stored credentials and reports success or failure.
Backwards-compatible default destination
The API still supports the older single-destination endpoints:
GET /v1/destination— returns the default destinationPUT /v1/destination— creates or replaces the default destinationPOST /v1/destination/test— tests the default destinationDELETE /v1/destination— removes the default integration
These map to the same workspace_integrations table and are preserved for existing integrations.