Skip to content

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 destinations array inside videoJSON that overrides the default for a single render job.

Supported providers

ProviderTypeHow credentials work
s3S3-compatibleAccess key + secret for an AWS S3 bucket
r2S3-compatibleAccess key + secret + custom endpoint for Cloudflare R2
b2S3-compatibleAccess key + secret + custom endpoint for Backblaze B2
wasabiS3-compatibleAccess key + secret + optional endpoint for Wasabi
gcsNativeGoogle Cloud service account JSON key
azureNativeAzure Blob account name + account key + container name
driveNativeGoogle 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

bash
curl https://api.ilovevideoeditor.com/v1/integrations \
  -H "Authorization: Bearer YOUR_JWT"

Create an S3/R2 integration

bash
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)

FieldRequiredDescription
bucketyesBucket name
accessKeyIdyesProvider access key
secretAccessKeyyesProvider secret key
endpointfor R2/B2S3-compatible endpoint URL
regionsometimesRegion, e.g. us-east-1 or auto
publicUrlnoPublic base URL used for returned links. Auto-derived for AWS S3 when no endpoint is set.
pathPrefixnoPrepended to every output key. Trailing slash is added automatically.

Google Cloud Storage (gcs)

FieldRequiredDescription
bucketyesGCS bucket name
gcsServiceAccountJsonyesFull JSON service account key
gcsProjectIdnoGCP project ID (auto-read from the key if omitted)
publicUrlnoDefaults to https://storage.googleapis.com/<bucket>
pathPrefixnoOutput prefix

Azure Blob Storage (azure)

FieldRequiredDescription
azureAccountNameyesStorage account name
azureAccountKeyyesStorage account key
azureContainerNameyesContainer name
publicUrlnoDefaults to https://<account>.blob.core.windows.net/<container>
pathPrefixnoOutput 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:

  1. Request an authorization URL:
bash
curl https://api.ilovevideoeditor.com/v1/integrations/drive/auth-url \
  -H "Authorization: Bearer YOUR_JWT"
  1. Open the returned url in a browser and authorize the app.
  2. The callback completes the flow and creates or updates the drive integration 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:

json
{
  "name": "Product Promo",
  "layers": [ ... ],
  "destinations": [
    {
      "integrationId": "018f...",
      "provider": "r2",
      "pathPrefix": "campaigns/summer-2026/"
    }
  ]
}

Rules:

  • integrationId must belong to an active integration in the caller workspace.
  • provider must match the integration's provider.
  • pathPrefix is optional and overrides the integration's default prefix for this render.
  • If destinations is 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:

json
{
  "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

bash
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 destination
  • PUT /v1/destination — creates or replaces the default destination
  • POST /v1/destination/test — tests the default destination
  • DELETE /v1/destination — removes the default integration

These map to the same workspace_integrations table and are preserved for existing integrations.

Released under the MIT License.