Docs › API reference
API reference
Every operation, grouped like the spec. Open one to see its parameters, request body and responses, each with an example and the full schema. Load openapi.json or openapi.yaml into Postman, Insomnia or a code generator.
Videos
Create, list, check and delete videos (uploads and edits).
GET/videosList my videos (newest first)
Filter by metadata: include up to 5 parameters like metadata.lessonId=123. Filters are AND'd together.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
nextToken | query | string | From the previous page |
metadata.<key> | query | string | Filter by metadata value (up to 5 filters; dynamic parameter name) |
Responses
200A page of videos
{
"videos": [
{
"videoId": "string",
"fileName": "string",
"cameraFileName": "string",
"createdAt": 0,
"sizeBytes": 0,
"state": "UPLOADING",
"redactions": 0,
"originalDeleted": false,
"clips": 0,
"reprocessOf": "string",
"trim": {
"start": 0,
"end": 0
},
"metadata": {},
"captions": false,
"embeddable": false,
"outcome": "SUCCEEDED",
"endedAt": 0,
"durationSeconds": 0,
"height": 0
}
],
"nextToken": "string"
}Schema
videosarray of VideoSummaryvideoIdstringfileNamestringcameraFileNamestringcreatedAtintegerUnix time
sizeBytesintegerstatestringCall GET /videos/{id} for live status
one of"UPLOADING","READY_TO_START","SUBMITTED"redactionsintegeroriginalDeletedbooleanclipsintegerPresent for edits
reprocessOfstringtrimTrimKeep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.
startnumbermin0· default0endnumbernull = to the end
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
captionsbooleanMade with captions
embeddablebooleanThe embeddable player is on
outcomestringHow processing ended; absent while it runs
one of"SUCCEEDED","FAILED","TIMED_OUT","ABORTED"endedAtnumberUnix time processing ended
durationSecondsnumberThe output's length (SUCCEEDED only)
heightintegerThe top quality's short side, e.g. 1080 (SUCCEEDED only)
nextTokenstring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId listVideos
POST/videosCreate a video (an upload, or an edit of finished videos)
Send an upload request, or an edit (no upload) to cut, join and splice your finished videos.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
dryRun | query | boolean | Validate only: nothing is created or started (answers 200 with valid: true) |
Idempotency-Key | header | string | Unique key for idempotent requests: POST /videos, POST /videos/{id}/complete, POST /videos/{id}/reprocess. Same key with same request = replay of first response. Stored 24 hours. |
Request body required
{
"fileName": "lesson1.mp4",
"sizeBytes": 104857600,
"maxHeight": 1080,
"camera": {
"fileName": "string",
"sizeBytes": 0
},
"layout": "pip",
"streaming": false,
"prestart": false,
"metadata": {}
}Schema
fileNamestringrequiredsizeBytesintegerRequired unless streaming
maxHeightintegerHighest output quality; never upscales
one of720,1080,1440,2160· default1080cameraobjectOptional second file shown picture-in-picture over the first (screen + camera)
fileNamestringsizeBytesinteger
layoutstring | objectScreen + camera only: how the two are combined. "pip" (camera bottom-right, medium) and "side-by-side" (screen left) are shorthands; the object form picks the corner and size, or which side the screen is on.
One of:stringobjecttypestringrequiredone of"pip","side-by-side"positionstringpip only (default bottom-right)
one of"bottom-right","bottom-left","top-right","top-left"sizestringpip only (default medium)
one of"small","medium","large"screenstringside-by-side only (default left)
one of"left","right"
streamingbooleanSize unknown yet (e.g. still recording); parts are signed per size
prestartbooleanWith streaming
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
sourceUrlstring (uri)requiredHTTPS URL (public internet addresses only; no username/password) with the video file. At most 3 redirects, each checked. The server must answer 200; file size is checked against the upload limit.
max length2048fileNamestringDisplay name (default: last URL path segment). 1–200 characters.
maxHeightintegerHighest output quality; never upscales
one of720,1080,1440,2160· default1080trimTrimKeep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.
startnumbermin0· default0endnumbernull = to the end
redactionsarray of RedactionRegions to blur or black out
max items20typestringrequiredbox = solid black bar
one of"blur","box"shapestringone of"rect","ellipse"· default"rect"xnumberFraction of the final frame width
min0· max1ynumbermin0· max1wnumbermin0· max1hnumbermin0· max1startnumberSeconds
default0endnumberSeconds; null = until the end
trackarray of objectKeyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)
max items50timenumberrequiredSeconds on the output timeline
min0xnumberrequiredmin0· max1ynumberrequiredmin0· max1wnumberrequiredmin0· max1hnumberrequiredmin0· max1
deleteOriginalbooleanDelete the imported file once the output is published
captionsCaptionsOptionPro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
One of:booleanobjectlanguagestring
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
editobjectrequired- max items
50videoIdstringrequiredOne of your finished (SUCCEEDED) videos; may repeat
pattern"^[a-f0-9]{32}$"startnumberSeconds into that video
min0· default0endnumberSeconds into that video; null = to its end
transitionobjectHow this clip starts from the previous one (hard cut if omitted; not on the first clip)
typestringone of"fade","fadeblack"· default"fade"secondsnumbermin0.1· max3· default0.5
fileNamestringDisplay name (default: Edit of N clips)
maxHeightintegerone of720,1080,1440,2160· default1080redactionsarray of RedactionOn the edit's own timeline
max items20typestringrequiredbox = solid black bar
one of"blur","box"shapestringone of"rect","ellipse"· default"rect"xnumberFraction of the final frame width
min0· max1ynumbermin0· max1wnumbermin0· max1hnumbermin0· max1startnumberSeconds
default0endnumberSeconds; null = until the end
trackarray of objectKeyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)
max items50timenumberrequiredSeconds on the output timeline
min0xnumberrequiredmin0· max1ynumberrequiredmin0· max1wnumberrequiredmin0· max1hnumberrequiredmin0· max1
captionsCaptionsOptionPro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
One of:booleanobjectlanguagestring
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
Responses
201Created
{
"videoId": "string",
"partSize": 0,
"partCount": 0,
"camera": {
"partSize": 0,
"partCount": 0
},
"clips": 0,
"status": "UPLOADING"
}Schema
videoIdstringpartSizeintegerUploads only. Bytes per part (last part may be smaller)
partCountintegerUploads only
cameraobjectpartSizeintegerpartCountinteger
clipsintegerEdits only
statusstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403Plan does not allow this feature (e.g. streaming, 4K, screen recording) or plan limit reached (free tier only)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404Edit: a clip's videoId is not yours
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409Edit: a clip's video has not finished processing
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429Rate limit or daily video limit
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId createVideo
GET/videos/{videoId}Status, timing and (when finished) download, playback and streaming links
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string | |
linkTtl | query | integer | Seconds the playback and streaming links last (default max(1800, 2x the video's length), at most 86400) |
Responses
200Current state
{
"videoId": "string",
"status": "UPLOADING",
"readyAt": 0,
"downloadUrl": "string",
"posterUrl": "string",
"thumbnail": {
"source": "auto",
"index": 0,
"time": 0,
"updatedAt": 0
},
"playbackUrl": "string",
"posterPlaybackUrl": "string",
"playbackExpiresAt": 0,
"embed": {
"videoId": "string",
"enabled": false,
"url": "string",
"iframe": "string"
},
"streamUrl": "string",
"streamExpiresAt": 0,
"captions": {
"status": "processing",
"language": "string",
"reason": "string",
"vttUrl": "string",
"srtUrl": "string",
"txtUrl": "string"
},
"startedAt": 0,
"stoppedAt": 0,
"progress": {
"planned": false,
"chunksTotal": 0,
"chunksDone": 0,
"audioDone": false,
"videoSeconds": 0,
"topRendition": "1080p"
},
"downloadExpiresInSeconds": 0,
"result": {
"jobId": "string",
"downloadAvailable": false,
"streamAvailable": false
}
}Schema
videoIdstringstatusstringone of"UPLOADING","READY_TO_START","RUNNING","SUCCEEDED","FAILED","TIMED_OUT","ABORTED","PENDING_REDRIVE","HISTORY_UNAVAILABLE"readyAtnumberUnix time the output was published
downloadUrlstringPre-signed MP4 link (SUCCEEDED only)
posterUrlstringPre-signed still frame for thumbnails (SUCCEEDED only): the automatic frame, or the one chosen with POST /videos/{videoId}/thumbnail
thumbnailobjectPresent once a thumbnail has been chosen or uploaded
sourcestringone of"auto","candidate","custom"indexintegertimenumberSeconds into the video
updatedAtinteger
playbackUrlstringSigned, seekable MP4 link for players (every plan). Lasts max(30 min, 2x the length), at most 24 h, or linkTtl; locked to the account's allowed domains
posterPlaybackUrlstringThe poster frame through the same signed link
playbackExpiresAtnumberUnix time the playback links expire
embedEmbedvideoIdstringenabledbooleanurlstringhttps://<site>/embed/<videoId>?t=<token>; add autoplay=1, loop=1, cc=1, start=<seconds>
iframestringReady-to-paste <iframe> code
streamUrlstringHLS master playlist link (Pro and Scale plans only); same lifetime and domain lock as playbackUrl
streamExpiresAtnumberUnix time the streaming link expires
captionsobjectOnly for videos made with captions. The video is published first; captions follow.
statusstringone of"processing","ready","skipped","failed"languagestringSpoken language (detected unless requested)
reasonstringWhy captions were skipped
vttUrlstringWebVTT file (valid 15 minutes)
srtUrlstringSubRip file (valid 15 minutes)
txtUrlstringPlain-text transcript (valid 15 minutes)
startedAtnumberUnix time processing started
stoppedAtnumberprogressobjectplannedbooleanchunksTotalintegerchunksDoneintegeraudioDonebooleanvideoSecondsnumbertopRenditionstring
downloadExpiresInSecondsintegerresultobjectSUCCEEDED only - publication status
jobIdstringdownloadAvailablebooleanstreamAvailablebooleanWhether a playable streaming link exists
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId getVideo
PATCH/videos/{videoId}Update video metadata (keys to null to remove them)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Request body required
{
"metadata": {
"courseId": "algebra-2",
"archived": null
}
}Schema
metadataobjectrequired
Responses
200Updated
{
"videoId": "string",
"metadata": {}
}Schema
videoIdstringmetadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409IDEMPOTENCY_KEY_REUSED, IDEMPOTENCY_IN_PROGRESS, or other conflict
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId updateVideo
DELETE/videos/{videoId}Remove a video (irreversible; stops billing its storage)
Cancels any running processing, removes outputs and work files. The original upload is removed unless another video was reprocessed from it and still exists. Usage records are kept for billing history.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Responses
200Deleted
{
"videoId": "string",
"deleted": true,
"originalDeleted": false,
"freedBytes": 0
}Schema
videoIdstringdeletedbooleanoriginalDeletedbooleanWhether the original upload was also removed
freedBytesintegerTotal bytes removed from storage
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId deleteVideo
PUT/videos/{videoId}/embedTurn the embeddable player on or off for a video
On: makes a random token and returns the embed URL and <iframe> code (calling it again keeps the same code). Off: deletes the token; turning it on again makes a new code, so a leaked one can be revoked. The embed page plays the video with the <video-piper> player, keeps its links fresh, and only appears inside the account's allowed domains if set (CSP frame-ancestors). Pages are cached up to 5 minutes.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Request body required
{
"enabled": false
}Schema
enabledbooleanrequired
Responses
200The embed state
{
"videoId": "string",
"enabled": false,
"url": "string",
"iframe": "string"
}Schema
videoIdstringenabledbooleanurlstringhttps://<site>/embed/<videoId>?t=<token>; add autoplay=1, loop=1, cc=1, start=<seconds>
iframestringReady-to-paste <iframe> code
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId setEmbed
GET/videos/{videoId}/thumbnailsThumbnail choices for a finished video
The candidate frames saved when the video was published (index 0 is the automatic poster; up to six more are spread through the video) with pre-signed links valid for 15 minutes, plus the current choice. Videos published before thumbnail choices existed return no candidates; you can still upload your own image.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Responses
200OK
{
"videoId": "string",
"current": {
"source": "auto",
"index": 0,
"time": 0
},
"posterUrl": "string",
"linkExpiresInSeconds": 900,
"candidates": [
{
"index": 2,
"time": 24.0,
"url": "string"
}
]
}Schema
videoIdstringcurrentobjectsourcestringone of"auto","candidate","custom"indexintegertimenumber
posterUrlstringlinkExpiresInSecondsintegercandidatesarray of objectindexintegertimenumberurlstring
409The video isn't ready yet (NOT_READY)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId listThumbnails
POST/videos/{videoId}/thumbnailChoose the video's thumbnail, or upload your own
Send either a candidate index from GET /videos/{videoId}/thumbnails (0 goes back to the automatic poster), or your own JPEG or PNG image, base64-encoded (at most 2 MB, 16-8192 pixels per side; the content is checked, not just the declared type). The choice replaces posterUrl everywhere: status, listings and webhooks.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Request body required
{
"candidate": 2
}Schema
candidateintegerrequired
imagestringrequiredThe image file's bytes
contentTypestringrequiredone of"image/jpeg","image/png"
Responses
200The new thumbnail
{
"videoId": "string",
"current": {
"source": "auto",
"index": 0,
"time": 0
},
"posterUrl": "string"
}Schema
videoIdstringcurrentobjectsourcestringone of"auto","candidate","custom"indexintegertimenumber
posterUrlstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409Not ready yet (NOT_READY), or made before thumbnail choices existed (NO_CANDIDATES)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
413The image is larger than 2 MB (TOO_LARGE)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId chooseThumbnail
POST/upload-tokensA short-lived token a browser can use to upload one video (no API key in the page)
Call from your server (API key) and pass the token to the page, e.g. <video-piper-recorder upload-token=...>. The token can create one video by upload, upload its parts, complete or abort it, send heartbeats and read its status; anything else answers 403 UPLOAD_TOKEN_SCOPE, and a second video 409 UPLOAD_TOKEN_USED (aborting frees it for a retake). Its settings are applied on the server whatever the browser sends.
Request body
{
"expiresIn": 3600,
"maxBytes": 0,
"maxSeconds": 0,
"maxHeight": 720,
"captions": false,
"metadata": {}
}Schema
expiresInintegerSeconds to start the upload; once started, the token works for it for 24 hours
min60· max86400· default3600maxBytesintegerLargest upload (default: the account's upload limit)
maxSecondsintegerThe video is trimmed to this length
min5· max28800maxHeightintegerone of720,1080,1440,2160captionsCaptionsOptionPro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
One of:booleanobjectlanguagestring
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
Responses
201The token (shown once; only its hash is stored)
{
"uploadToken": "vpu_…",
"tokenId": "string",
"expiresAt": 0,
"policy": {}
}Schema
uploadTokenstringtokenIdstringexpiresAtintegerpolicyobject
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403PLAN_UPGRADE_REQUIRED (captions) or UPLOAD_TOKEN_SCOPE (a token can't make tokens)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId createUploadToken
POST/edit-tokensA short-lived token a browser can use to edit some of your videos into one new video (no API key in the page)
Call from your server (API key, or a signed-in session) and pass the token to the page, e.g. <video-piper-editor token=...>. Every video must be yours and finished. With Authorization: Bearer vpe_... the browser may only read the allowed videos' lengths, signed playback links, posters and filmstrip frames (GET /edit-session), create ONE edit whose clips are those videos only (POST /videos with edit; at most maxSeconds long; a second edit answers 409 EDIT_TOKEN_USED), and read the status of the video it made (GET /videos/{videoId}). Anything else, including making tokens, answers 403 EDIT_TOKEN_SCOPE. The token's title and metadata are applied on the server whatever the browser sends; the new video is processed and billed like any edit made with your key, on whichever plan allows edits. An edit token can't be used with an upload token's or an API key's routes, and counts toward your key's rate limits.
Request body required
{
"videoIds": [
"string"
],
"expiresIn": 900,
"maxSeconds": 0,
"title": "string",
"metadata": {}
}Schema
videoIdsarray of stringrequiredYour finished videos the editor may use
max items20expiresInintegerSeconds the token works; once its edit is created it works for that video's status for 24 hours
min60· max86400· default900maxSecondsintegerThe longest the result may be (after crossfades)
min1· max28800titlestringThe new video's name (the browser can't change it)
max length200metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
Responses
201The token (shown once; only its hash is stored)
{
"token": "vpe_…",
"expiresAt": 0,
"videoIds": [
"string"
]
}Schema
tokenstringexpiresAtintegervideoIdsarray of string
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403EDIT_TOKEN_SCOPE or UPLOAD_TOKEN_SCOPE (a token can't make tokens)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: a video isn't yours (details name each one)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409EDIT_SOURCE_NOT_READY: a video hasn't finished processing
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId createEditToken
GET/edit-sessionWhat the editor needs to open (edit tokens only)
Only with an edit token (vpe_...); anything else answers 403 EDIT_TOKEN_SCOPE. Returns just the token's videos, in the token's order: length, size, a signed MP4 link (locked to your allowed domains), the poster and the filmstrip frames, and the token's maxSeconds and title. No names, metadata or other account data. Links last a few minutes to half an hour: ask again after refreshInSeconds.
Responses
200The videos
{
"videos": [
{
"videoId": "string",
"durationSeconds": 0,
"width": 0,
"height": 0,
"playbackUrl": "string",
"posterUrl": "string",
"thumbnails": [
{
"time": 0,
"url": "string"
}
]
}
],
"maxSeconds": 0,
"title": "string",
"refreshInSeconds": 0
}Schema
videosarray of objectvideoIdstringdurationSecondsnumberwidthintegerheightintegerplaybackUrlstringposterUrlstringthumbnailsarray of objecttimenumberurlstring
maxSecondsintegertitlestringrefreshInSecondsinteger
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403EDIT_TOKEN_SCOPE (not an edit token)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404The token's videos are no longer available
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId getEditSession
Uploads
Send a file's bytes in parts with pre-signed URLs, then complete or abort the upload.
POST/videos/{videoId}/partsGet pre-signed upload URLs for parts
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Request body required
{
"partNumbers": [
1,
2
],
"file": "source",
"parts": [
{
"partNumber": 0,
"sizeBytes": 0
}
]
}Schema
partNumbersarray of integerFor normal uploads (1-100 per call)
filestringone of"source","camera"· default"source"partsarray of objectFor streaming uploads, each part with its exact size (>= 5 MiB except the last)
partNumberintegersizeBytesinteger
Responses
200URLs valid for 15 minutes; PUT the bytes with exactly sizeBytes as Content-Length
{
"parts": [
{
"partNumber": 0,
"sizeBytes": 0,
"url": "string"
}
],
"expiresInSeconds": 0
}Schema
partsarray of objectpartNumberintegersizeBytesintegerurlstring
expiresInSecondsinteger
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId getPartUrls
POST/videos/{videoId}/completeFinish the upload and start processing (optionally with redactions)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
dryRun | query | boolean | Validate only: nothing is created or started (answers 200 with valid: true) |
videoIdrequired | path | string | |
Idempotency-Key | header | string | Unique key for idempotent requests: POST /videos, POST /videos/{id}/complete, POST /videos/{id}/reprocess. Same key with same request = replay of first response. Stored 24 hours. |
Request body
{
"redactions": [
{
"type": "blur",
"shape": "rect",
"x": 0,
"y": 0,
"w": 0,
"h": 0,
"start": 0,
"end": 0,
"track": [
{
"time": 0,
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
]
}
],
"deleteOriginal": false,
"trim": {
"start": 0,
"end": 0
},
"captions": false,
"source": {
"sizeBytes": 0,
"partCount": 0
},
"camera": {
"sizeBytes": 0,
"partCount": 0
}
}Schema
redactionsarray of Redactionmax items20typestringrequiredbox = solid black bar
one of"blur","box"shapestringone of"rect","ellipse"· default"rect"xnumberFraction of the final frame width
min0· max1ynumbermin0· max1wnumbermin0· max1hnumbermin0· max1startnumberSeconds
default0endnumberSeconds; null = until the end
trackarray of objectKeyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)
max items50timenumberrequiredSeconds on the output timeline
min0xnumberrequiredmin0· max1ynumberrequiredmin0· max1wnumberrequiredmin0· max1hnumberrequiredmin0· max1
deleteOriginalbooleanDelete the unredacted upload after the output is published
trimTrimKeep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.
startnumbermin0· default0endnumbernull = to the end
captionsCaptionsOptionPro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
One of:booleanobjectlanguagestring
sourceobjectStreaming uploads only
sizeBytesintegerpartCountinteger
cameraobjectStreaming uploads only
sizeBytesintegerpartCountinteger
Responses
202Accepted; poll GET /videos/{videoId}
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403Plan does not allow this feature (e.g. redaction) or plan limit reached (free tier only)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409Upload incomplete or sizes don't match
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId completeUpload
POST/videos/{videoId}/abortCancel an unfinished upload (deletes uploaded parts and the record)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Responses
200Cancelled
409Upload already completed
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId abortUpload
POST/videos/{videoId}/heartbeatKeep a pre-started recording job waiting (send every ~10 s while recording)
If heartbeats stop for 2 minutes the waiting job gives up. To cancel on purpose, call abort.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Responses
200OK
409Not an unfinished streaming upload with prestart
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId sendHeartbeat
Processing
Stop processing, or process a finished video again with new options.
POST/videos/{videoId}/cancelStop processing (the workflow and any of its queued or running jobs)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
videoIdrequired | path | string |
Responses
200Stopped; includes terminatedJobs
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId cancelProcessing
POST/videos/{videoId}/reprocessProcess a video again as a new video (new quality, trim and/or redactions)
Reuses the original upload (nothing is re-sent); for an edit, renders the same clips again. Options are not inherited. Not available after deleteOriginal.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
dryRun | query | boolean | Validate only: nothing is created or started (answers 200 with valid: true) |
videoIdrequired | path | string | |
Idempotency-Key | header | string | Unique key for idempotent requests: POST /videos, POST /videos/{id}/complete, POST /videos/{id}/reprocess. Same key with same request = replay of first response. Stored 24 hours. |
Request body
{
"maxHeight": 720,
"redactions": [
{
"type": "blur",
"shape": "rect",
"x": 0,
"y": 0,
"w": 0,
"h": 0,
"start": 0,
"end": 0,
"track": [
{
"time": 0,
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
]
}
],
"deleteOriginal": false,
"trim": {
"start": 0,
"end": 0
},
"captions": false,
"metadata": {}
}Schema
maxHeightintegerone of720,1080,1440,2160redactionsarray of Redactionmax items20typestringrequiredbox = solid black bar
one of"blur","box"shapestringone of"rect","ellipse"· default"rect"xnumberFraction of the final frame width
min0· max1ynumbermin0· max1wnumbermin0· max1hnumbermin0· max1startnumberSeconds
default0endnumberSeconds; null = until the end
trackarray of objectKeyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)
max items50timenumberrequiredSeconds on the output timeline
min0xnumberrequiredmin0· max1ynumberrequiredmin0· max1wnumberrequiredmin0· max1hnumberrequiredmin0· max1
deleteOriginalbooleanUploads only
trimTrimKeep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.
startnumbermin0· default0endnumbernull = to the end
captionsCaptionsOptionPro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
One of:booleanobjectlanguagestring
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
Responses
201New video created; poll its status
{
"videoId": "string",
"reprocessOf": "string"
}Schema
videoIdstringreprocessOfstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403Plan does not allow the requested quality or feature, or plan limit reached (free tier only); reprocessing at a lower quality if the plan allows
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409Original never completed or was deleted
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId reprocessVideo
Usage
Processing minutes and storage for billing.
GET/usageUsage for a calendar month (for billing)
Returns processing time and storage for a month, against the plan. Month defaults to the current UTC month.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
month | query | string | YYYY-MM (default: current month) |
Responses
200Usage summary
{
"month": "2026-10",
"complete": false,
"processing": {
"videos": 0,
"outputMinutes": 0,
"billableMinutes": 0
},
"storage": {
"gbMonths": 0,
"storedGb": 0,
"note": "string"
},
"delivery": {
"gb": 0,
"note": "string"
}
}Schema
monthstringcompletebooleanWhether the month is complete (now >= month end)
processingobjectvideosintegerCount of videos that finished processing
outputMinutesnumberSum of output duration (after trim/edit)
billableMinutesnumbermax(60
storageobjectgbMonthsnumberByte-time (bytes × time) for bytes kept
storedGbnumberWhat is stored right now
notestring
deliveryobjectgbnumberGigabytes sent to viewers this month (download links and streaming), from access logs; trails real time by up to a few hours
notestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId getUsage
Authentication
Sign up and sign in with email, create sessions and API keys, manage your account.
POST/auth/startEmail a sign-in code (public; no auth required)
Sends a 6-digit code to the email address. 5 attempts per code, 10 minute expiry. Rate limited 5 per email per hour, 30 per IP per hour.
Request body required
{
"email": "user@example.com",
"intent": "signin"
}Schema
emailstringrequiredintentstringOptional; accepted but never changes the response, so this endpoint does not reveal whether an account exists.
one of"signin","signup"
Responses
200Code sent
{
"sent": false,
"expiresInSeconds": 0
}Schema
sentbooleanexpiresInSecondsinteger
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429Rate limited
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId startSignIn
POST/auth/verifyVerify a sign-in code (public; no auth required)
Returns a session token valid for 30 days. Without intent, an email with no account gets one created (acceptTerms must be true). With intent: signup, a new account is created with profile (validated like PUT /v1/account/profile, name required) saved in the same write; an email that already has an account is just signed in and its saved profile is left alone (created is false). With intent: signin, an email with no account gets 404 NO_ACCOUNT and nothing is created (the code stays valid).
Request body required
{
"email": "user@example.com",
"code": "123456",
"acceptTerms": false,
"intent": "signin",
"profile": {
"fullName": "string",
"company": "string",
"role": "string",
"useCase": "string",
"country": "string"
}
}Schema
emailstringrequiredcodestringrequiredpattern"^\\d{6}$"acceptTermsbooleanRequired to create an account
intentstringOptional; see above
one of"signin","signup"profileobjectWith intent signup: saved on the new account. fullName is required.
fullNamestringmax length100companystringmax length100rolestringuseCasestringcountrystringmax length60
Responses
200Verified
{
"sessionToken": "vps_...",
"expiresAt": 0,
"created": false,
"account": {
"email": "string",
"plan": "string",
"user": "string"
}
}Schema
sessionTokenstringexpiresAtintegerUnix time
createdbooleanTrue if a new account was created
accountobjectemailstringplanstringuserstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404intent signin and no account for this email (NO_ACCOUNT)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429Rate limited
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId verifySignIn
POST/auth/signoutEnd a session (session token only)
Responses
200Signed out
{
"signedOut": false
}Schema
signedOutboolean
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId signOut
GET/accountYour account info, plan and this month's usage
Responses
200Account details
{
"email": "string",
"user": "string",
"plan": "string",
"planName": "string",
"createdAt": "string",
"profileComplete": false,
"profile": {
"fullName": "string",
"company": "string",
"role": "string",
"useCase": "string",
"country": "string",
"completedAt": "string"
},
"limits": {
"minutes": 0,
"storageGb": 0,
"maxHeight": 720,
"features": [
"string"
],
"videosPerDay": 0,
"apiKeys": 0,
"overage": false
},
"usage": {
"month": "2026-10",
"billableMinutes": 0,
"videos": 0,
"storedGb": 0,
"gbMonths": 0
},
"session": false,
"allowedDomains": [
"string"
],
"billing": {
"customer": false
}
}Schema
emailstringuserstringplanstringplanNamestringcreatedAtstring (date-time)profileCompletebooleanWhether the account's profile (name) has been filled in
profileProfileThe account's "about you" answers (empty strings when not given).
fullNamestringcompanystringrolestringuseCasestringcountrystringcompletedAtstring (date-time)
limitsobjectminutesintegerMonthly processing minutes (billable)
storageGbintegerMonthly storage in GB
maxHeightintegerone of720,1080,1440,2160featuresarray of stringvideosPerDayintegerapiKeysintegerMax simultaneous API keys
overagebooleanWhether overage is billed
usageobjectmonthstringbillableMinutesnumbervideosintegerstoredGbnumbergbMonthsnumber
sessionbooleanTrue if authenticated with a session token
allowedDomainsarray of stringPlayback links only play on these sites (empty: any site)
billingobjectcustomerbooleanHas a Stripe customer ID
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId getAccount
GET/account/keysList your API keys (never the keys themselves)
Responses
200API keys
{
"keys": [
{
"keyId": "string",
"label": "string",
"createdAt": "string",
"revoked": false,
"prefix": "string"
}
]
}Schema
keysarray of objectkeyIdstringlabelstringcreatedAtstring (date-time)revokedbooleanprefixstringFirst 8 chars of the key
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId listApiKeys
POST/account/keysCreate an API key (session token only)
Request body required
{
"label": "string"
}Schema
labelstringOptional label for the key
max length60
Responses
201Key created
{
"key": "string",
"keyId": "string",
"label": "string",
"note": "string"
}Schema
keystringThe full key (shown only once)
keyIdstringlabelstringnotestringCopy it now: it can't be shown again
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403Session required or plan limit reached
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId createApiKey
DELETE/account/keys/{keyId}Revoke an API key (session token only)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
keyIdrequired | path | string |
Responses
200Revoked
{
"keyId": "string",
"revoked": false
}Schema
keyIdstringrevokedboolean
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403Session required
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId revokeApiKey
PUT/account/profileSave your profile (the "about you" form)
Only the name is required. Text is trimmed and control characters removed; role and use must be one of the listed values (or empty). The name also appears in the owner's user list.
Request body required
{
"fullName": "string",
"company": "string",
"role": "",
"useCase": "",
"country": "string"
}Schema
fullNamestringrequiredmax length100companystringmax length100rolestringone of"","Developer","Product/Design","Founder/Executive","Marketing/Content","Other"useCasestringone of"","Product videos/onboarding","User-generated content","Courses/education","Marketing","Internal tools","Other"countrystringmax length60
Responses
200Saved
{
"fullName": "string",
"company": "string",
"role": "string",
"useCase": "string",
"country": "string",
"completedAt": "string"
}Schema
fullNamestringcompanystringrolestringuseCasestringcountrystringcompletedAtstring (date-time)
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId setProfile
PUT/account/allowed-domainsLock playback and streaming links to your own sites (session token only)
The CDN then only serves a link's files to requests whose Origin or Referer is one of these hostnames, so other sites can't embed your videos. Applies to links made after the change. Requests with no Origin or Referer (some native apps) are refused for locked links. Hotlink protection, not DRM.
Request body required
{
"domains": [
"*.example.com"
]
}Schema
domainsarray of stringrequiredHostnames; *.example.com matches subdomains. [] allows any site.
max items20
Responses
200Saved (cleaned list)
{
"domains": [
"string"
]
}Schema
domainsarray of string
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
403Session required
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId setAllowedDomains
POST/billing/checkoutStart a paid plan (signed-in account session only)
Returns the URL of a Stripe Checkout page. Subscriptions renew on the 1st of each month (UTC); the first month is prorated.
Request body required
{
"plan": "starter"
}Schema
planstringrequiredone of"starter","pro","scale"
Responses
200Checkout page
{
"url": "string"
}Schema
urlstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409Already subscribed (ALREADY_SUBSCRIBED)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId startCheckout
POST/billing/portalManage card, invoices and cancellation in Stripe's Customer Portal (signed-in account session only)
Responses
200Portal page
{
"url": "string"
}Schema
urlstring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409Never subscribed (NO_BILLING_ACCOUNT)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId openBillingPortal
POST/billing/planSwitch paid plan, or cancel to Free at the end of the period (signed-in account session only)
Upgrades are charged now for the rest of the month; downgrades credit the next invoice.
Request body required
{
"plan": "free"
}Schema
planstringrequiredone of"free","starter","pro","scale"
Responses
200The billing state
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
409No subscription yet (NO_SUBSCRIPTION) or no change
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId changePlan
Webhooks
Set up an endpoint to receive events when videos finish, fail, or you reach usage thresholds. Each account has one webhook. Events are signed with Standard Webhooks. Events: video.ready (processing succeeded), video.failed, video.canceled, video.deleted, usage.threshold (80% and 100% of plan limits). Each event envelope contains id, type, createdAt and data. Signature verification uses HMAC-SHA256 of "id.timestamp.body" with the base64-decoded secret after "whsec_".
GET/webhookGet your webhook configuration
Responses
200Webhook config
{
"configured": false,
"url": "string",
"events": [
"video.ready"
],
"enabled": false,
"secret": "string",
"createdAt": "string",
"updatedAt": "string"
}Schema
configuredbooleanurlstringeventsarray of stringenabledbooleansecretstringwhsec_-prefixed signing secret
createdAtstring (date-time)updatedAtstring (date-time)
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId getWebhookConfig
PUT/webhookSet or update your webhook endpoint
Request body required
{
"url": "string",
"events": [
"video.ready"
],
"enabled": false
}Schema
urlstring (uri)requiredHTTPS only, public addresses only
eventsarray of stringDefaults to all events if omitted
enabledbooleanDefaults to true
Responses
200Saved
{
"configured": false,
"url": "string",
"events": [
"string"
],
"enabled": false,
"secret": "string",
"createdAt": "string",
"updatedAt": "string"
}Schema
configuredbooleanurlstringeventsarray of stringenabledbooleansecretstringcreatedAtstring (date-time)updatedAtstring (date-time)
400INVALID_REQUEST: invalid body or parameter (the message names the field)
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId setWebhookConfig
DELETE/webhookRemove your webhook endpoint
Responses
200Deleted
{
"configured": false
}Schema
configuredboolean
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId deleteWebhookConfig
POST/webhook/rotateGenerate a new signing secret (keep the URL)
Responses
200New secret
{
"configured": false,
"url": "string",
"events": [
"string"
],
"enabled": false,
"secret": "string",
"createdAt": "string",
"updatedAt": "string"
}Schema
configuredbooleanurlstringeventsarray of stringenabledbooleansecretstringNew whsec_-prefixed secret; old one stops working immediately
createdAtstring (date-time)updatedAtstring (date-time)
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404No webhook is set up yet
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId rotateWebhookSecret
POST/webhook/testSend a test event and report the result immediately
Responses
200Test sent and one attempt reported
{
"ok": false,
"status": 0,
"ms": 0,
"error": "string",
"response": "string",
"eventId": "string"
}Schema
okbooleanstatusintegerHTTP status code from the endpoint
msintegerMilliseconds to respond (or error)
errorstringError message if not ok
responsestringFirst 500 bytes of the response body
eventIdstringThe test event ID
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
404No webhook is set up yet
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId testWebhook
GET/webhook/deliveriesRecent webhook delivery attempts (kept for 30 days)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer |
Responses
200Delivery log
{
"deliveries": [
{
"eventId": "string",
"type": "string",
"attempt": 0,
"ok": false,
"status": 0,
"ms": 0,
"error": "string",
"response": "string",
"at": 0,
"final": false
}
]
}Schema
deliveriesarray of objecteventIdstringtypestringattemptintegerokbooleanstatusintegermsintegerMilliseconds taken
errorstringresponsestringFirst 500 bytes of response
atintegerUnix time
finalbooleanWhether retries will stop
401UNAUTHORIZED: missing, unknown or revoked API key
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
503UNAVAILABLE: temporary failure; retry with backoff
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Schema
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
operationId listWebhookDeliveries
Schemas
Profileobject
The account's "about you" answers (empty strings when not given).
fullNamestringcompanystringrolestringuseCasestringcountrystringcompletedAtstring (date-time)
{
"fullName": "string",
"company": "string",
"role": "string",
"useCase": "string",
"country": "string",
"completedAt": "string"
}Errorobject
Every error response (from the API and from API Gateway). Program against error; show message.
messagestringrequiredHuman-readable; wording may change
errorstringrequiredStable machine-readable code (new codes may be added; fall back to the HTTP status)
one of"INVALID_REQUEST","UNAUTHORIZED","MISSING_AUTHENTICATION","FORBIDDEN","REQUEST_REJECTED","NOT_FOUND","ROUTE_NOT_FOUND","METHOD_NOT_ALLOWED","UPLOAD_INCOMPLETE","ALREADY_COMPLETED","ORIGINAL_UNAVAILABLE","EDIT_SOURCE_NOT_READY","NOT_AN_UPLOAD","IDEMPOTENCY_KEY_REUSED","IDEMPOTENCY_IN_PROGRESS","NOT_READY","NO_CANDIDATES","ALREADY_SUBSCRIBED","NO_SUBSCRIPTION","NO_BILLING_ACCOUNT","INVALID_STATE","TOO_LARGE","RATE_LIMITED","QUOTA_EXCEEDED","DAILY_LIMIT","VIDEOS_PAUSED","PLAN_UPGRADE_REQUIRED","PLAN_LIMIT_REACHED","OVERAGE_CAP_REACHED","INVALID_CODE","TERMS_REQUIRED","NO_ACCOUNT","SESSION_REQUIRED","UPLOAD_TOKEN_SCOPE","UPLOAD_TOKEN_USED","EDIT_TOKEN_SCOPE","EDIT_TOKEN_USED","EDIT_TOO_LONG","NOT_WAITING","ACCOUNT_DISABLED","EMAIL_NOT_CONFIGURED","EMAIL_FAILED","BILLING_ERROR","INVALID_SIGNATURE","BILLING_NOT_CONFIGURED","BILLING_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE"requestIdstringrequiredQuote this when reporting a problem
detailsarray of objectValidation errors only (400 INVALID_REQUEST) - every problem found, with its field path
fieldstringmessagestring
{
"message": "Daily limit reached (50 videos per 24 hours); try again later",
"error": "DAILY_LIMIT",
"requestId": "string",
"details": [
{
"field": "edit.clips[0].end",
"message": "80s is past the end of video …, which is 60.0s (1:00); use null for \"to the end\""
}
]
}Metadataobject
Customer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
{}UploadRequestobject
fileNamestringrequiredsizeBytesintegerRequired unless streaming
maxHeightintegerHighest output quality; never upscales
one of720,1080,1440,2160· default1080cameraobjectOptional second file shown picture-in-picture over the first (screen + camera)
fileNamestringsizeBytesinteger
layoutstring | objectScreen + camera only: how the two are combined. "pip" (camera bottom-right, medium) and "side-by-side" (screen left) are shorthands; the object form picks the corner and size, or which side the screen is on.
One of:stringobjecttypestringrequiredone of"pip","side-by-side"positionstringpip only (default bottom-right)
one of"bottom-right","bottom-left","top-right","top-left"sizestringpip only (default medium)
one of"small","medium","large"screenstringside-by-side only (default left)
one of"left","right"
streamingbooleanSize unknown yet (e.g. still recording); parts are signed per size
prestartbooleanWith streaming
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
{
"fileName": "lesson1.mp4",
"sizeBytes": 104857600,
"maxHeight": 1080,
"camera": {
"fileName": "string",
"sizeBytes": 0
},
"layout": "pip",
"streaming": false,
"prestart": false,
"metadata": {}
}ImportRequestobject
Import a video from a public HTTPS URL instead of uploading. The URL is downloaded by the API.
sourceUrlstring (uri)requiredHTTPS URL (public internet addresses only; no username/password) with the video file. At most 3 redirects, each checked. The server must answer 200; file size is checked against the upload limit.
max length2048fileNamestringDisplay name (default: last URL path segment). 1–200 characters.
maxHeightintegerHighest output quality; never upscales
one of720,1080,1440,2160· default1080trimTrimKeep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.
startnumbermin0· default0endnumbernull = to the end
redactionsarray of RedactionRegions to blur or black out
max items20typestringrequiredbox = solid black bar
one of"blur","box"shapestringone of"rect","ellipse"· default"rect"xnumberFraction of the final frame width
min0· max1ynumbermin0· max1wnumbermin0· max1hnumbermin0· max1startnumberSeconds
default0endnumberSeconds; null = until the end
trackarray of objectKeyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)
max items50timenumberrequiredSeconds on the output timeline
min0xnumberrequiredmin0· max1ynumberrequiredmin0· max1wnumberrequiredmin0· max1hnumberrequiredmin0· max1
deleteOriginalbooleanDelete the imported file once the output is published
captionsCaptionsOptionPro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
One of:booleanobjectlanguagestring
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
{
"sourceUrl": "string",
"fileName": "string",
"maxHeight": 1080,
"trim": {
"start": 0,
"end": 0
},
"redactions": [
{
"type": "blur",
"shape": "rect",
"x": 0,
"y": 0,
"w": 0,
"h": 0,
"start": 0,
"end": 0,
"track": [
{
"time": 0,
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
]
}
],
"deleteOriginal": false,
"captions": false,
"metadata": {}
}EditRequestobject
A new video from clips of your finished videos, played in order (trim, stitch, splice).
editobjectrequired- max items
50videoIdstringrequiredOne of your finished (SUCCEEDED) videos; may repeat
pattern"^[a-f0-9]{32}$"startnumberSeconds into that video
min0· default0endnumberSeconds into that video; null = to its end
transitionobjectHow this clip starts from the previous one (hard cut if omitted; not on the first clip)
typestringone of"fade","fadeblack"· default"fade"secondsnumbermin0.1· max3· default0.5
fileNamestringDisplay name (default: Edit of N clips)
maxHeightintegerone of720,1080,1440,2160· default1080redactionsarray of RedactionOn the edit's own timeline
max items20typestringrequiredbox = solid black bar
one of"blur","box"shapestringone of"rect","ellipse"· default"rect"xnumberFraction of the final frame width
min0· max1ynumbermin0· max1wnumbermin0· max1hnumbermin0· max1startnumberSeconds
default0endnumberSeconds; null = until the end
trackarray of objectKeyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)
max items50timenumberrequiredSeconds on the output timeline
min0xnumberrequiredmin0· max1ynumberrequiredmin0· max1wnumberrequiredmin0· max1hnumberrequiredmin0· max1
captionsCaptionsOptionPro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
One of:booleanobjectlanguagestring
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
{
"edit": {
"clips": [
{
"videoId": "string",
"start": 0,
"end": 0,
"transition": {
"type": "fade",
"seconds": 0.5
}
}
]
},
"fileName": "string",
"maxHeight": 1080,
"redactions": [
{
"type": "blur",
"shape": "rect",
"x": 0,
"y": 0,
"w": 0,
"h": 0,
"start": 0,
"end": 0,
"track": [
{
"time": 0,
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
]
}
],
"captions": false,
"metadata": {}
}Clipobject
videoIdstringrequiredOne of your finished (SUCCEEDED) videos; may repeat
pattern"^[a-f0-9]{32}$"startnumberSeconds into that video
min0· default0endnumberSeconds into that video; null = to its end
transitionobjectHow this clip starts from the previous one (hard cut if omitted; not on the first clip)
typestringone of"fade","fadeblack"· default"fade"secondsnumbermin0.1· max3· default0.5
{
"videoId": "string",
"start": 0,
"end": 0,
"transition": {
"type": "fade",
"seconds": 0.5
}
}Embedobject
videoIdstringenabledbooleanurlstringhttps://<site>/embed/<videoId>?t=<token>; add autoplay=1, loop=1, cc=1, start=<seconds>
iframestringReady-to-paste <iframe> code
{
"videoId": "string",
"enabled": false,
"url": "string",
"iframe": "string"
}CaptionsOptionboolean | object
Pro and Scale. Speech-to-text subtitles: true detects the spoken language, or {"language": "es"} sets it (ISO 639-1 code). Adds WebVTT/SRT/text files and a subtitle track to the HLS stream. Each captioned minute counts as 2 extra processing minutes (minimum 1). At most 4 hours of video, and 1,200 captioned minutes per account per day.
languagestring
falseTrimobject
Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.
startnumbermin0· default0endnumbernull = to the end
{
"start": 0,
"end": 0
}VideoSummaryobject
videoIdstringfileNamestringcameraFileNamestringcreatedAtintegerUnix time
sizeBytesintegerstatestringCall GET /videos/{id} for live status
one of"UPLOADING","READY_TO_START","SUBMITTED"redactionsintegeroriginalDeletedbooleanclipsintegerPresent for edits
reprocessOfstringtrimTrimKeep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.
startnumbermin0· default0endnumbernull = to the end
metadataMetadataCustomer key-value pairs (up to 20 keys, 4 KB total). Keys are 1-40 [A-Za-z0-9_.-]; values are strings up to 500 chars.
captionsbooleanMade with captions
embeddablebooleanThe embeddable player is on
outcomestringHow processing ended; absent while it runs
one of"SUCCEEDED","FAILED","TIMED_OUT","ABORTED"endedAtnumberUnix time processing ended
durationSecondsnumberThe output's length (SUCCEEDED only)
heightintegerThe top quality's short side, e.g. 1080 (SUCCEEDED only)
{
"videoId": "string",
"fileName": "string",
"cameraFileName": "string",
"createdAt": 0,
"sizeBytes": 0,
"state": "UPLOADING",
"redactions": 0,
"originalDeleted": false,
"clips": 0,
"reprocessOf": "string",
"trim": {
"start": 0,
"end": 0
},
"metadata": {},
"captions": false,
"embeddable": false,
"outcome": "SUCCEEDED",
"endedAt": 0,
"durationSeconds": 0,
"height": 0
}Redactionobject
A fixed box (x, y, w, h) or a moving one (track). Not both.
typestringrequiredbox = solid black bar
one of"blur","box"shapestringone of"rect","ellipse"· default"rect"xnumberFraction of the final frame width
min0· max1ynumbermin0· max1wnumbermin0· max1hnumbermin0· max1startnumberSeconds
default0endnumberSeconds; null = until the end
trackarray of objectKeyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)
max items50timenumberrequiredSeconds on the output timeline
min0xnumberrequiredmin0· max1ynumberrequiredmin0· max1wnumberrequiredmin0· max1hnumberrequiredmin0· max1
{
"type": "blur",
"shape": "rect",
"x": 0,
"y": 0,
"w": 0,
"h": 0,
"start": 0,
"end": 0,
"track": [
{
"time": 0,
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
]
}