Skip to content
Videos

Create a direct or multipart video upload

POST/api/v1alpha1/videos

Opens a server-selected direct or multipart upload session. The request contains only the original filename and exact file_size; the server determines content type from the filename and measures duration during processing. Video bytes go directly to storage and never pass through this API. Files up to 200 MiB use one PUT, and larger files use 10 MiB multipart chunks. The response reports the selected strategy.

  • Access: an alpha-enabled API key with the UPLOAD_VIDEOS permission.
  • Size: file_size is required and must be exact. The maximum is 10 GiB.
  • Strategy: upload selection is always automatic; callers cannot submit a strategy preference.
  • Retries: send an Idempotency-Key to safely retry session creation.

After the storage upload, record multipart ETags with PUT /api/v1alpha1/videos/{video_id}/upload/parts, then call POST /api/v1alpha1/videos/{video_id}/upload/complete. Poll GET /api/v1alpha1/videos/{video_id} for processing status.

AuthorizationBearer <token>

In: header

Header Parameters

Idempotency-Key?string

Optional key for safe retry of this POST. The key is retained for 24 hours and compared with the request payload and concrete path parameters.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X POST "https://example.com/api/v1alpha1/videos" \  -H "Authorization: Bearer $DEEPFRAME_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "file_size": 157286400,    "filename": "warehouse-inspection-2026-08-08.mp4"  }'
{  "chunk_size": 10485760,  "completed_parts": 2,  "expires_at": "2026-08-08T10:15:00.000Z",  "file_size": 157286400,  "received_parts": [    1,    3  ],  "reported_bytes": 20971520,  "state": "open",  "strategy": "direct",  "target": {    "expires_at": "2026-08-08T10:15:00.000Z",    "headers": {},    "method": "put",    "part_number": 2,    "url": "https://s3.example.test/upload"  },  "targets": [    {      "expires_at": "2026-08-08T10:15:00.000Z",      "headers": {},      "method": "put",      "part_number": 2,      "url": "https://s3.example.test/upload"    }  ],  "total_chunks": 16,  "uploaded_bytes": 10485760,  "verified_bytes": 0,  "video_id": "vid_0190b5d4-7e1f-7a2b-9c3d-1234567890ab"}