Video APIv1 Home OpenAPI spec

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
NameInTypeDescription
limitqueryinteger
nextTokenquerystring

From the previous page

metadata.<key>querystring

Filter by metadata value (up to 5 filters; dynamic parameter name)

Responses
200A page of videos
application/json object
{
  "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 VideoSummary
    • videoIdstring
    • fileNamestring
    • cameraFileNamestring
    • createdAtinteger

      Unix time

    • sizeBytesinteger
    • statestring

      Call GET /videos/{id} for live status

      one of "UPLOADING", "READY_TO_START", "SUBMITTED"
    • redactionsinteger
    • originalDeletedboolean
    • clipsinteger

      Present for edits

    • reprocessOfstring
    • trimTrim

      Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.

      • startnumber
        min 0 · default 0
      • endnumber

        null = to the end

    • metadataMetadata

      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.

    • captionsboolean

      Made with captions

    • embeddableboolean

      The embeddable player is on

    • outcomestring

      How processing ended; absent while it runs

      one of "SUCCEEDED", "FAILED", "TIMED_OUT", "ABORTED"
    • endedAtnumber

      Unix time processing ended

    • durationSecondsnumber

      The output's length (SUCCEEDED only)

    • heightinteger

      The top quality's short side, e.g. 1080 (SUCCEEDED only)

  • nextTokenstring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
dryRunqueryboolean

Validate only: nothing is created or started (answers 200 with valid: true)

Idempotency-Keyheaderstring

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
One of:
UploadRequest
  • fileNamestringrequired
  • sizeBytesinteger

    Required unless streaming

  • maxHeightinteger

    Highest output quality; never upscales

    one of 720, 1080, 1440, 2160 · default 1080
  • cameraobject

    Optional second file shown picture-in-picture over the first (screen + camera)

    • fileNamestring
    • sizeBytesinteger
  • layoutstring | object

    Screen + 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:
    string
    object
    • typestringrequired
      one of "pip", "side-by-side"
    • positionstring

      pip only (default bottom-right)

      one of "bottom-right", "bottom-left", "top-right", "top-left"
    • sizestring

      pip only (default medium)

      one of "small", "medium", "large"
    • screenstring

      side-by-side only (default left)

      one of "left", "right"
  • streamingboolean

    Size unknown yet (e.g. still recording); parts are signed per size

  • prestartboolean

    With streaming

  • metadataMetadata

    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.

ImportRequest
  • sourceUrlstring (uri)required

    HTTPS 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 length 2048
  • fileNamestring

    Display name (default: last URL path segment). 1–200 characters.

  • maxHeightinteger

    Highest output quality; never upscales

    one of 720, 1080, 1440, 2160 · default 1080
  • trimTrim

    Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.

    • startnumber
      min 0 · default 0
    • endnumber

      null = to the end

  • redactionsarray of Redaction

    Regions to blur or black out

    max items 20
    • typestringrequired

      box = solid black bar

      one of "blur", "box"
    • shapestring
      one of "rect", "ellipse" · default "rect"
    • xnumber

      Fraction of the final frame width

      min 0 · max 1
    • ynumber
      min 0 · max 1
    • wnumber
      min 0 · max 1
    • hnumber
      min 0 · max 1
    • startnumber

      Seconds

      default 0
    • endnumber

      Seconds; null = until the end

    • trackarray of object

      Keyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)

      max items 50
      • timenumberrequired

        Seconds on the output timeline

        min 0
      • xnumberrequired
        min 0 · max 1
      • ynumberrequired
        min 0 · max 1
      • wnumberrequired
        min 0 · max 1
      • hnumberrequired
        min 0 · max 1
  • deleteOriginalboolean

    Delete the imported file once the output is published

  • 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.

    One of:
    boolean
    object
    • languagestring
  • metadataMetadata

    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.

EditRequest
  • editobjectrequired
    • clipsarray of Cliprequired
      max items 50
      • videoIdstringrequired

        One of your finished (SUCCEEDED) videos; may repeat

        pattern "^[a-f0-9]{32}$"
      • startnumber

        Seconds into that video

        min 0 · default 0
      • endnumber

        Seconds into that video; null = to its end

      • transitionobject

        How this clip starts from the previous one (hard cut if omitted; not on the first clip)

        • typestring
          one of "fade", "fadeblack" · default "fade"
        • secondsnumber
          min 0.1 · max 3 · default 0.5
  • fileNamestring

    Display name (default: Edit of N clips)

  • maxHeightinteger
    one of 720, 1080, 1440, 2160 · default 1080
  • redactionsarray of Redaction

    On the edit's own timeline

    max items 20
    • typestringrequired

      box = solid black bar

      one of "blur", "box"
    • shapestring
      one of "rect", "ellipse" · default "rect"
    • xnumber

      Fraction of the final frame width

      min 0 · max 1
    • ynumber
      min 0 · max 1
    • wnumber
      min 0 · max 1
    • hnumber
      min 0 · max 1
    • startnumber

      Seconds

      default 0
    • endnumber

      Seconds; null = until the end

    • trackarray of object

      Keyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)

      max items 50
      • timenumberrequired

        Seconds on the output timeline

        min 0
      • xnumberrequired
        min 0 · max 1
      • ynumberrequired
        min 0 · max 1
      • wnumberrequired
        min 0 · max 1
      • hnumberrequired
        min 0 · max 1
  • 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.

    One of:
    boolean
    object
    • languagestring
  • metadataMetadata

    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.

Responses
201Created
application/json object
{
  "videoId": "string",
  "partSize": 0,
  "partCount": 0,
  "camera": {
    "partSize": 0,
    "partCount": 0
  },
  "clips": 0,
  "status": "UPLOADING"
}
Schema
  • videoIdstring
  • partSizeinteger

    Uploads only. Bytes per part (last part may be smaller)

  • partCountinteger

    Uploads only

  • cameraobject
    • partSizeinteger
    • partCountinteger
  • clipsinteger

    Edits only

  • statusstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403Plan does not allow this feature (e.g. streaming, 4K, screen recording) or plan limit reached (free tier only)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404Edit: a clip's videoId is not yours
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409Edit: a clip's video has not finished processing
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429Rate limit or daily video limit
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId createVideo

GET/videos/{videoId}Status, timing and (when finished) download, playback and streaming links
Parameters
NameInTypeDescription
videoIdrequiredpathstring
linkTtlqueryinteger

Seconds the playback and streaming links last (default max(1800, 2x the video's length), at most 86400)

Responses
200Current state
application/json object
{
  "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
  • videoIdstring
  • statusstring
    one of "UPLOADING", "READY_TO_START", "RUNNING", "SUCCEEDED", "FAILED", "TIMED_OUT", "ABORTED", "PENDING_REDRIVE", "HISTORY_UNAVAILABLE"
  • readyAtnumber

    Unix time the output was published

  • downloadUrlstring

    Pre-signed MP4 link (SUCCEEDED only)

  • posterUrlstring

    Pre-signed still frame for thumbnails (SUCCEEDED only): the automatic frame, or the one chosen with POST /videos/{videoId}/thumbnail

  • thumbnailobject

    Present once a thumbnail has been chosen or uploaded

    • sourcestring
      one of "auto", "candidate", "custom"
    • indexinteger
    • timenumber

      Seconds into the video

    • updatedAtinteger
  • playbackUrlstring

    Signed, 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

  • posterPlaybackUrlstring

    The poster frame through the same signed link

  • playbackExpiresAtnumber

    Unix time the playback links expire

  • embedEmbed
    • videoIdstring
    • enabledboolean
    • urlstring

      https://<site>/embed/<videoId>?t=<token>; add autoplay=1, loop=1, cc=1, start=<seconds>

    • iframestring

      Ready-to-paste <iframe> code

  • streamUrlstring

    HLS master playlist link (Pro and Scale plans only); same lifetime and domain lock as playbackUrl

  • streamExpiresAtnumber

    Unix time the streaming link expires

  • captionsobject

    Only for videos made with captions. The video is published first; captions follow.

    • statusstring
      one of "processing", "ready", "skipped", "failed"
    • languagestring

      Spoken language (detected unless requested)

    • reasonstring

      Why captions were skipped

    • vttUrlstring

      WebVTT file (valid 15 minutes)

    • srtUrlstring

      SubRip file (valid 15 minutes)

    • txtUrlstring

      Plain-text transcript (valid 15 minutes)

  • startedAtnumber

    Unix time processing started

  • stoppedAtnumber
  • progressobject
    • plannedboolean
    • chunksTotalinteger
    • chunksDoneinteger
    • audioDoneboolean
    • videoSecondsnumber
    • topRenditionstring
  • downloadExpiresInSecondsinteger
  • resultobject

    SUCCEEDED only - publication status

    • jobIdstring
    • downloadAvailableboolean
    • streamAvailableboolean

      Whether a playable streaming link exists

404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId getVideo

PATCH/videos/{videoId}Update video metadata (keys to null to remove them)
Parameters
NameInTypeDescription
videoIdrequiredpathstring
Request body required
application/json object
{
  "metadata": {
    "courseId": "algebra-2",
    "archived": null
  }
}
Schema
  • metadataobjectrequired
Responses
200Updated
application/json object
{
  "videoId": "string",
  "metadata": {}
}
Schema
  • videoIdstring
  • metadataMetadata

    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.

400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409IDEMPOTENCY_KEY_REUSED, IDEMPOTENCY_IN_PROGRESS, or other conflict
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
videoIdrequiredpathstring
Responses
200Deleted
application/json object
{
  "videoId": "string",
  "deleted": true,
  "originalDeleted": false,
  "freedBytes": 0
}
Schema
  • videoIdstring
  • deletedboolean
  • originalDeletedboolean

    Whether the original upload was also removed

  • freedBytesinteger

    Total bytes removed from storage

400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
videoIdrequiredpathstring
Request body required
application/json object
{
  "enabled": false
}
Schema
  • enabledbooleanrequired
Responses
200The embed state
application/json Embed
{
  "videoId": "string",
  "enabled": false,
  "url": "string",
  "iframe": "string"
}
Schema
  • videoIdstring
  • enabledboolean
  • urlstring

    https://<site>/embed/<videoId>?t=<token>; add autoplay=1, loop=1, cc=1, start=<seconds>

  • iframestring

    Ready-to-paste <iframe> code

400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
videoIdrequiredpathstring
Responses
200OK
application/json object
{
  "videoId": "string",
  "current": {
    "source": "auto",
    "index": 0,
    "time": 0
  },
  "posterUrl": "string",
  "linkExpiresInSeconds": 900,
  "candidates": [
    {
      "index": 2,
      "time": 24.0,
      "url": "string"
    }
  ]
}
Schema
  • videoIdstring
  • currentobject
    • sourcestring
      one of "auto", "candidate", "custom"
    • indexinteger
    • timenumber
  • posterUrlstring
  • linkExpiresInSecondsinteger
  • candidatesarray of object
    • indexinteger
    • timenumber
    • urlstring
409The video isn't ready yet (NOT_READY)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
videoIdrequiredpathstring
Request body required
application/json object | object
{
  "candidate": 2
}
Schema
One of:
object
  • candidateintegerrequired
object
  • imagestringrequired

    The image file's bytes

  • contentTypestringrequired
    one of "image/jpeg", "image/png"
Responses
200The new thumbnail
application/json object
{
  "videoId": "string",
  "current": {
    "source": "auto",
    "index": 0,
    "time": 0
  },
  "posterUrl": "string"
}
Schema
  • videoIdstring
  • currentobject
    • sourcestring
      one of "auto", "candidate", "custom"
    • indexinteger
    • timenumber
  • posterUrlstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409Not ready yet (NOT_READY), or made before thumbnail choices existed (NO_CANDIDATES)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
413The image is larger than 2 MB (TOO_LARGE)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "expiresIn": 3600,
  "maxBytes": 0,
  "maxSeconds": 0,
  "maxHeight": 720,
  "captions": false,
  "metadata": {}
}
Schema
  • expiresIninteger

    Seconds to start the upload; once started, the token works for it for 24 hours

    min 60 · max 86400 · default 3600
  • maxBytesinteger

    Largest upload (default: the account's upload limit)

  • maxSecondsinteger

    The video is trimmed to this length

    min 5 · max 28800
  • maxHeightinteger
    one of 720, 1080, 1440, 2160
  • 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.

    One of:
    boolean
    object
    • languagestring
  • metadataMetadata

    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.

Responses
201The token (shown once; only its hash is stored)
application/json object
{
  "uploadToken": "vpu_…",
  "tokenId": "string",
  "expiresAt": 0,
  "policy": {}
}
Schema
  • uploadTokenstring
  • tokenIdstring
  • expiresAtinteger
  • policyobject
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403PLAN_UPGRADE_REQUIRED (captions) or UPLOAD_TOKEN_SCOPE (a token can't make tokens)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "videoIds": [
    "string"
  ],
  "expiresIn": 900,
  "maxSeconds": 0,
  "title": "string",
  "metadata": {}
}
Schema
  • videoIdsarray of stringrequired

    Your finished videos the editor may use

    max items 20
  • expiresIninteger

    Seconds the token works; once its edit is created it works for that video's status for 24 hours

    min 60 · max 86400 · default 900
  • maxSecondsinteger

    The longest the result may be (after crossfades)

    min 1 · max 28800
  • titlestring

    The new video's name (the browser can't change it)

    max length 200
  • metadataMetadata

    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.

Responses
201The token (shown once; only its hash is stored)
application/json object
{
  "token": "vpe_…",
  "expiresAt": 0,
  "videoIds": [
    "string"
  ]
}
Schema
  • tokenstring
  • expiresAtinteger
  • videoIdsarray of string
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403EDIT_TOKEN_SCOPE or UPLOAD_TOKEN_SCOPE (a token can't make tokens)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: a video isn't yours (details name each one)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409EDIT_SOURCE_NOT_READY: a video hasn't finished processing
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "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 object
    • videoIdstring
    • durationSecondsnumber
    • widthinteger
    • heightinteger
    • playbackUrlstring
    • posterUrlstring
    • thumbnailsarray of object
      • timenumber
      • urlstring
  • maxSecondsinteger
  • titlestring
  • refreshInSecondsinteger
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403EDIT_TOKEN_SCOPE (not an edit token)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404The token's videos are no longer available
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
videoIdrequiredpathstring
Request body required
application/json object
{
  "partNumbers": [
    1,
    2
  ],
  "file": "source",
  "parts": [
    {
      "partNumber": 0,
      "sizeBytes": 0
    }
  ]
}
Schema
  • partNumbersarray of integer

    For normal uploads (1-100 per call)

  • filestring
    one of "source", "camera" · default "source"
  • partsarray of object

    For streaming uploads, each part with its exact size (>= 5 MiB except the last)

    • partNumberinteger
    • sizeBytesinteger
Responses
200URLs valid for 15 minutes; PUT the bytes with exactly sizeBytes as Content-Length
application/json object
{
  "parts": [
    {
      "partNumber": 0,
      "sizeBytes": 0,
      "url": "string"
    }
  ],
  "expiresInSeconds": 0
}
Schema
  • partsarray of object
    • partNumberinteger
    • sizeBytesinteger
    • urlstring
  • expiresInSecondsinteger
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId getPartUrls

POST/videos/{videoId}/completeFinish the upload and start processing (optionally with redactions)
Parameters
NameInTypeDescription
dryRunqueryboolean

Validate only: nothing is created or started (answers 200 with valid: true)

videoIdrequiredpathstring
Idempotency-Keyheaderstring

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
application/json object
{
  "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 Redaction
    max items 20
    • typestringrequired

      box = solid black bar

      one of "blur", "box"
    • shapestring
      one of "rect", "ellipse" · default "rect"
    • xnumber

      Fraction of the final frame width

      min 0 · max 1
    • ynumber
      min 0 · max 1
    • wnumber
      min 0 · max 1
    • hnumber
      min 0 · max 1
    • startnumber

      Seconds

      default 0
    • endnumber

      Seconds; null = until the end

    • trackarray of object

      Keyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)

      max items 50
      • timenumberrequired

        Seconds on the output timeline

        min 0
      • xnumberrequired
        min 0 · max 1
      • ynumberrequired
        min 0 · max 1
      • wnumberrequired
        min 0 · max 1
      • hnumberrequired
        min 0 · max 1
  • deleteOriginalboolean

    Delete the unredacted upload after the output is published

  • trimTrim

    Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.

    • startnumber
      min 0 · default 0
    • endnumber

      null = to the end

  • 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.

    One of:
    boolean
    object
    • languagestring
  • sourceobject

    Streaming uploads only

    • sizeBytesinteger
    • partCountinteger
  • cameraobject

    Streaming uploads only

    • sizeBytesinteger
    • partCountinteger
Responses
202Accepted; poll GET /videos/{videoId}
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403Plan does not allow this feature (e.g. redaction) or plan limit reached (free tier only)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409Upload incomplete or sizes don't match
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId completeUpload

POST/videos/{videoId}/abortCancel an unfinished upload (deletes uploaded parts and the record)
Parameters
NameInTypeDescription
videoIdrequiredpathstring
Responses
200Cancelled
409Upload already completed
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
videoIdrequiredpathstring
Responses
200OK
409Not an unfinished streaming upload with prestart
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
videoIdrequiredpathstring
Responses
200Stopped; includes terminatedJobs
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
dryRunqueryboolean

Validate only: nothing is created or started (answers 200 with valid: true)

videoIdrequiredpathstring
Idempotency-Keyheaderstring

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
application/json object
{
  "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
  • maxHeightinteger
    one of 720, 1080, 1440, 2160
  • redactionsarray of Redaction
    max items 20
    • typestringrequired

      box = solid black bar

      one of "blur", "box"
    • shapestring
      one of "rect", "ellipse" · default "rect"
    • xnumber

      Fraction of the final frame width

      min 0 · max 1
    • ynumber
      min 0 · max 1
    • wnumber
      min 0 · max 1
    • hnumber
      min 0 · max 1
    • startnumber

      Seconds

      default 0
    • endnumber

      Seconds; null = until the end

    • trackarray of object

      Keyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)

      max items 50
      • timenumberrequired

        Seconds on the output timeline

        min 0
      • xnumberrequired
        min 0 · max 1
      • ynumberrequired
        min 0 · max 1
      • wnumberrequired
        min 0 · max 1
      • hnumberrequired
        min 0 · max 1
  • deleteOriginalboolean

    Uploads only

  • trimTrim

    Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.

    • startnumber
      min 0 · default 0
    • endnumber

      null = to the end

  • 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.

    One of:
    boolean
    object
    • languagestring
  • metadataMetadata

    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.

Responses
201New video created; poll its status
application/json object
{
  "videoId": "string",
  "reprocessOf": "string"
}
Schema
  • videoIdstring
  • reprocessOfstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
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
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409Original never completed or was deleted
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
NameInTypeDescription
monthquerystring

YYYY-MM (default: current month)

Responses
200Usage summary
application/json object
{
  "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
  • monthstring
  • completeboolean

    Whether the month is complete (now >= month end)

  • processingobject
    • videosinteger

      Count of videos that finished processing

    • outputMinutesnumber

      Sum of output duration (after trim/edit)

    • billableMinutesnumber

      max(60

  • storageobject
    • gbMonthsnumber

      Byte-time (bytes × time) for bytes kept

    • storedGbnumber

      What is stored right now

    • notestring
  • deliveryobject
    • gbnumber

      Gigabytes 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)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "email": "user@example.com",
  "intent": "signin"
}
Schema
  • emailstringrequired
  • intentstring

    Optional; accepted but never changes the response, so this endpoint does not reveal whether an account exists.

    one of "signin", "signup"
Responses
200Code sent
application/json object
{
  "sent": false,
  "expiresInSeconds": 0
}
Schema
  • sentboolean
  • expiresInSecondsinteger
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429Rate limited
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "email": "user@example.com",
  "code": "123456",
  "acceptTerms": false,
  "intent": "signin",
  "profile": {
    "fullName": "string",
    "company": "string",
    "role": "string",
    "useCase": "string",
    "country": "string"
  }
}
Schema
  • emailstringrequired
  • codestringrequired
    pattern "^\\d{6}$"
  • acceptTermsboolean

    Required to create an account

  • intentstring

    Optional; see above

    one of "signin", "signup"
  • profileobject

    With intent signup: saved on the new account. fullName is required.

    • fullNamestring
      max length 100
    • companystring
      max length 100
    • rolestring
    • useCasestring
    • countrystring
      max length 60
Responses
200Verified
application/json object
{
  "sessionToken": "vps_...",
  "expiresAt": 0,
  "created": false,
  "account": {
    "email": "string",
    "plan": "string",
    "user": "string"
  }
}
Schema
  • sessionTokenstring
  • expiresAtinteger

    Unix time

  • createdboolean

    True if a new account was created

  • accountobject
    • emailstring
    • planstring
    • userstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404intent signin and no account for this email (NO_ACCOUNT)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429Rate limited
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId verifySignIn

POST/auth/signoutEnd a session (session token only)
Responses
200Signed out
application/json object
{
  "signedOut": false
}
Schema
  • signedOutboolean
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId signOut

GET/accountYour account info, plan and this month's usage
Responses
200Account details
application/json object
{
  "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
  • emailstring
  • userstring
  • planstring
  • planNamestring
  • createdAtstring (date-time)
  • profileCompleteboolean

    Whether the account's profile (name) has been filled in

  • profileProfile

    The account's "about you" answers (empty strings when not given).

    • fullNamestring
    • companystring
    • rolestring
    • useCasestring
    • countrystring
    • completedAtstring (date-time)
  • limitsobject
    • minutesinteger

      Monthly processing minutes (billable)

    • storageGbinteger

      Monthly storage in GB

    • maxHeightinteger
      one of 720, 1080, 1440, 2160
    • featuresarray of string
    • videosPerDayinteger
    • apiKeysinteger

      Max simultaneous API keys

    • overageboolean

      Whether overage is billed

  • usageobject
    • monthstring
    • billableMinutesnumber
    • videosinteger
    • storedGbnumber
    • gbMonthsnumber
  • sessionboolean

    True if authenticated with a session token

  • allowedDomainsarray of string

    Playback links only play on these sites (empty: any site)

  • billingobject
    • customerboolean

      Has a Stripe customer ID

401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId getAccount

GET/account/keysList your API keys (never the keys themselves)
Responses
200API keys
application/json object
{
  "keys": [
    {
      "keyId": "string",
      "label": "string",
      "createdAt": "string",
      "revoked": false,
      "prefix": "string"
    }
  ]
}
Schema
  • keysarray of object
    • keyIdstring
    • labelstring
    • createdAtstring (date-time)
    • revokedboolean
    • prefixstring

      First 8 chars of the key

401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId listApiKeys

POST/account/keysCreate an API key (session token only)
Request body required
application/json object
{
  "label": "string"
}
Schema
  • labelstring

    Optional label for the key

    max length 60
Responses
201Key created
application/json object
{
  "key": "string",
  "keyId": "string",
  "label": "string",
  "note": "string"
}
Schema
  • keystring

    The full key (shown only once)

  • keyIdstring
  • labelstring
  • notestring

    Copy it now: it can't be shown again

401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403Session required or plan limit reached
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId createApiKey

DELETE/account/keys/{keyId}Revoke an API key (session token only)
Parameters
NameInTypeDescription
keyIdrequiredpathstring
Responses
200Revoked
application/json object
{
  "keyId": "string",
  "revoked": false
}
Schema
  • keyIdstring
  • revokedboolean
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403Session required
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404NOT_FOUND: no such video for this user (wrong ID or someone else's)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "fullName": "string",
  "company": "string",
  "role": "",
  "useCase": "",
  "country": "string"
}
Schema
  • fullNamestringrequired
    max length 100
  • companystring
    max length 100
  • rolestring
    one of "", "Developer", "Product/Design", "Founder/Executive", "Marketing/Content", "Other"
  • useCasestring
    one of "", "Product videos/onboarding", "User-generated content", "Courses/education", "Marketing", "Internal tools", "Other"
  • countrystring
    max length 60
Responses
200Saved
application/json Profile
{
  "fullName": "string",
  "company": "string",
  "role": "string",
  "useCase": "string",
  "country": "string",
  "completedAt": "string"
}
Schema
  • fullNamestring
  • companystring
  • rolestring
  • useCasestring
  • countrystring
  • completedAtstring (date-time)
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "domains": [
    "*.example.com"
  ]
}
Schema
  • domainsarray of stringrequired

    Hostnames; *.example.com matches subdomains. [] allows any site.

    max items 20
Responses
200Saved (cleaned list)
application/json object
{
  "domains": [
    "string"
  ]
}
Schema
  • domainsarray of string
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
403Session required
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "plan": "starter"
}
Schema
  • planstringrequired
    one of "starter", "pro", "scale"
Responses
200Checkout page
application/json object
{
  "url": "string"
}
Schema
  • urlstring
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409Already subscribed (ALREADY_SUBSCRIBED)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId startCheckout

POST/billing/portalManage card, invoices and cancellation in Stripe's Customer Portal (signed-in account session only)
Responses
200Portal page
application/json object
{
  "url": "string"
}
Schema
  • urlstring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409Never subscribed (NO_BILLING_ACCOUNT)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "plan": "free"
}
Schema
  • planstringrequired
    one of "free", "starter", "pro", "scale"
Responses
200The billing state
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
409No subscription yet (NO_SUBSCRIPTION) or no change
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

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
application/json object
{
  "configured": false,
  "url": "string",
  "events": [
    "video.ready"
  ],
  "enabled": false,
  "secret": "string",
  "createdAt": "string",
  "updatedAt": "string"
}
Schema
  • configuredboolean
  • urlstring
  • eventsarray of string
  • enabledboolean
  • secretstring

    whsec_-prefixed signing secret

  • createdAtstring (date-time)
  • updatedAtstring (date-time)
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId getWebhookConfig

PUT/webhookSet or update your webhook endpoint
Request body required
application/json object
{
  "url": "string",
  "events": [
    "video.ready"
  ],
  "enabled": false
}
Schema
  • urlstring (uri)required

    HTTPS only, public addresses only

  • eventsarray of string

    Defaults to all events if omitted

  • enabledboolean

    Defaults to true

Responses
200Saved
application/json object
{
  "configured": false,
  "url": "string",
  "events": [
    "string"
  ],
  "enabled": false,
  "secret": "string",
  "createdAt": "string",
  "updatedAt": "string"
}
Schema
  • configuredboolean
  • urlstring
  • eventsarray of string
  • enabledboolean
  • secretstring
  • createdAtstring (date-time)
  • updatedAtstring (date-time)
400INVALID_REQUEST: invalid body or parameter (the message names the field)
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId setWebhookConfig

DELETE/webhookRemove your webhook endpoint
Responses
200Deleted
application/json object
{
  "configured": false
}
Schema
  • configuredboolean
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId deleteWebhookConfig

POST/webhook/rotateGenerate a new signing secret (keep the URL)
Responses
200New secret
application/json object
{
  "configured": false,
  "url": "string",
  "events": [
    "string"
  ],
  "enabled": false,
  "secret": "string",
  "createdAt": "string",
  "updatedAt": "string"
}
Schema
  • configuredboolean
  • urlstring
  • eventsarray of string
  • enabledboolean
  • secretstring

    New whsec_-prefixed secret; old one stops working immediately

  • createdAtstring (date-time)
  • updatedAtstring (date-time)
401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404No webhook is set up yet
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId rotateWebhookSecret

POST/webhook/testSend a test event and report the result immediately
Responses
200Test sent and one attempt reported
application/json object
{
  "ok": false,
  "status": 0,
  "ms": 0,
  "error": "string",
  "response": "string",
  "eventId": "string"
}
Schema
  • okboolean
  • statusinteger

    HTTP status code from the endpoint

  • msinteger

    Milliseconds to respond (or error)

  • errorstring

    Error message if not ok

  • responsestring

    First 500 bytes of the response body

  • eventIdstring

    The test event ID

401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
404No webhook is set up yet
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId testWebhook

GET/webhook/deliveriesRecent webhook delivery attempts (kept for 30 days)
Parameters
NameInTypeDescription
limitqueryinteger
Responses
200Delivery log
application/json object
{
  "deliveries": [
    {
      "eventId": "string",
      "type": "string",
      "attempt": 0,
      "ok": false,
      "status": 0,
      "ms": 0,
      "error": "string",
      "response": "string",
      "at": 0,
      "final": false
    }
  ]
}
Schema
  • deliveriesarray of object
    • eventIdstring
    • typestring
    • attemptinteger
    • okboolean
    • statusinteger
    • msinteger

      Milliseconds taken

    • errorstring
    • responsestring

      First 500 bytes of response

    • atinteger

      Unix time

    • finalboolean

      Whether retries will stop

401UNAUTHORIZED: missing, unknown or revoked API key
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
429RATE_LIMITED (retry with backoff), QUOTA_EXCEEDED, DAILY_LIMIT or VIDEOS_PAUSED
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
503UNAVAILABLE: temporary failure; retry with backoff
application/json Error
{
  "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
  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring

operationId listWebhookDeliveries

Schemas

Profileobject

The account's "about you" answers (empty strings when not given).

  • fullNamestring
  • companystring
  • rolestring
  • useCasestring
  • countrystring
  • completedAtstring (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.

  • messagestringrequired

    Human-readable; wording may change

  • errorstringrequired

    Stable 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"
  • requestIdstringrequired

    Quote this when reporting a problem

  • detailsarray of object

    Validation errors only (400 INVALID_REQUEST) - every problem found, with its field path

    • fieldstring
    • messagestring
{
  "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
  • fileNamestringrequired
  • sizeBytesinteger

    Required unless streaming

  • maxHeightinteger

    Highest output quality; never upscales

    one of 720, 1080, 1440, 2160 · default 1080
  • cameraobject

    Optional second file shown picture-in-picture over the first (screen + camera)

    • fileNamestring
    • sizeBytesinteger
  • layoutstring | object

    Screen + 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:
    string
    object
    • typestringrequired
      one of "pip", "side-by-side"
    • positionstring

      pip only (default bottom-right)

      one of "bottom-right", "bottom-left", "top-right", "top-left"
    • sizestring

      pip only (default medium)

      one of "small", "medium", "large"
    • screenstring

      side-by-side only (default left)

      one of "left", "right"
  • streamingboolean

    Size unknown yet (e.g. still recording); parts are signed per size

  • prestartboolean

    With streaming

  • metadataMetadata

    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.

{
  "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)required

    HTTPS 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 length 2048
  • fileNamestring

    Display name (default: last URL path segment). 1–200 characters.

  • maxHeightinteger

    Highest output quality; never upscales

    one of 720, 1080, 1440, 2160 · default 1080
  • trimTrim

    Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.

    • startnumber
      min 0 · default 0
    • endnumber

      null = to the end

  • redactionsarray of Redaction

    Regions to blur or black out

    max items 20
    • typestringrequired

      box = solid black bar

      one of "blur", "box"
    • shapestring
      one of "rect", "ellipse" · default "rect"
    • xnumber

      Fraction of the final frame width

      min 0 · max 1
    • ynumber
      min 0 · max 1
    • wnumber
      min 0 · max 1
    • hnumber
      min 0 · max 1
    • startnumber

      Seconds

      default 0
    • endnumber

      Seconds; null = until the end

    • trackarray of object

      Keyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)

      max items 50
      • timenumberrequired

        Seconds on the output timeline

        min 0
      • xnumberrequired
        min 0 · max 1
      • ynumberrequired
        min 0 · max 1
      • wnumberrequired
        min 0 · max 1
      • hnumberrequired
        min 0 · max 1
  • deleteOriginalboolean

    Delete the imported file once the output is published

  • 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.

    One of:
    boolean
    object
    • languagestring
  • metadataMetadata

    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.

{
  "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
    • clipsarray of Cliprequired
      max items 50
      • videoIdstringrequired

        One of your finished (SUCCEEDED) videos; may repeat

        pattern "^[a-f0-9]{32}$"
      • startnumber

        Seconds into that video

        min 0 · default 0
      • endnumber

        Seconds into that video; null = to its end

      • transitionobject

        How this clip starts from the previous one (hard cut if omitted; not on the first clip)

        • typestring
          one of "fade", "fadeblack" · default "fade"
        • secondsnumber
          min 0.1 · max 3 · default 0.5
  • fileNamestring

    Display name (default: Edit of N clips)

  • maxHeightinteger
    one of 720, 1080, 1440, 2160 · default 1080
  • redactionsarray of Redaction

    On the edit's own timeline

    max items 20
    • typestringrequired

      box = solid black bar

      one of "blur", "box"
    • shapestring
      one of "rect", "ellipse" · default "rect"
    • xnumber

      Fraction of the final frame width

      min 0 · max 1
    • ynumber
      min 0 · max 1
    • wnumber
      min 0 · max 1
    • hnumber
      min 0 · max 1
    • startnumber

      Seconds

      default 0
    • endnumber

      Seconds; null = until the end

    • trackarray of object

      Keyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)

      max items 50
      • timenumberrequired

        Seconds on the output timeline

        min 0
      • xnumberrequired
        min 0 · max 1
      • ynumberrequired
        min 0 · max 1
      • wnumberrequired
        min 0 · max 1
      • hnumberrequired
        min 0 · max 1
  • 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.

    One of:
    boolean
    object
    • languagestring
  • metadataMetadata

    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.

{
  "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
  • videoIdstringrequired

    One of your finished (SUCCEEDED) videos; may repeat

    pattern "^[a-f0-9]{32}$"
  • startnumber

    Seconds into that video

    min 0 · default 0
  • endnumber

    Seconds into that video; null = to its end

  • transitionobject

    How this clip starts from the previous one (hard cut if omitted; not on the first clip)

    • typestring
      one of "fade", "fadeblack" · default "fade"
    • secondsnumber
      min 0.1 · max 3 · default 0.5
{
  "videoId": "string",
  "start": 0,
  "end": 0,
  "transition": {
    "type": "fade",
    "seconds": 0.5
  }
}
Embedobject
  • videoIdstring
  • enabledboolean
  • urlstring

    https://<site>/embed/<videoId>?t=<token>; add autoplay=1, loop=1, cc=1, start=<seconds>

  • iframestring

    Ready-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.

One of:
boolean
object
  • languagestring
false
Trimobject

Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.

  • startnumber
    min 0 · default 0
  • endnumber

    null = to the end

{
  "start": 0,
  "end": 0
}
VideoSummaryobject
  • videoIdstring
  • fileNamestring
  • cameraFileNamestring
  • createdAtinteger

    Unix time

  • sizeBytesinteger
  • statestring

    Call GET /videos/{id} for live status

    one of "UPLOADING", "READY_TO_START", "SUBMITTED"
  • redactionsinteger
  • originalDeletedboolean
  • clipsinteger

    Present for edits

  • reprocessOfstring
  • trimTrim

    Keep only part of the upload (frame-accurate, no extra encode). Redaction times are on the trimmed timeline.

    • startnumber
      min 0 · default 0
    • endnumber

      null = to the end

  • metadataMetadata

    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.

  • captionsboolean

    Made with captions

  • embeddableboolean

    The embeddable player is on

  • outcomestring

    How processing ended; absent while it runs

    one of "SUCCEEDED", "FAILED", "TIMED_OUT", "ABORTED"
  • endedAtnumber

    Unix time processing ended

  • durationSecondsnumber

    The output's length (SUCCEEDED only)

  • heightinteger

    The 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.

  • typestringrequired

    box = solid black bar

    one of "blur", "box"
  • shapestring
    one of "rect", "ellipse" · default "rect"
  • xnumber

    Fraction of the final frame width

    min 0 · max 1
  • ynumber
    min 0 · max 1
  • wnumber
    min 0 · max 1
  • hnumber
    min 0 · max 1
  • startnumber

    Seconds

    default 0
  • endnumber

    Seconds; null = until the end

  • trackarray of object

    Keyframes for moving content, in time order; the region glides between them (instead of x, y, w, h)

    max items 50
    • timenumberrequired

      Seconds on the output timeline

      min 0
    • xnumberrequired
      min 0 · max 1
    • ynumberrequired
      min 0 · max 1
    • wnumberrequired
      min 0 · max 1
    • hnumberrequired
      min 0 · max 1
{
  "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
    }
  ]
}