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.