Skip to content

Popular guides

↑↓ Navigate↵ Openesc Close
Developer API

Video workflows

Choose a workflow and follow your video from creation through rendering.

On this page

Choose output_mode: "video" to generate and render automatically. Choose "draft" to stop when the timeline is ready, review it in Kinema, and request a render later.

QueuedGeneratingReadyRenderingCompleted

A draft stops at ready. A finished-video request continues to rendering. A job may also finish as failed or cancelled. Check the returned status instead of relying on a fixed delay.

YTA and avatar videos

Both use POST /videos. Set production_mode to standard or pro, choose sources, and enable music, graphics, and captions as needed. Add an avatar object for a presenter, using standard or premium. Voice model choices are standard and expressive. Supported presenter screen time is 25% or 45%; avatar generation is charged on actual generated presenter minutes.

Optional presenter settings
{
  "avatar": {
    "id": "AVATAR_ID_FROM_AVATARS",
    "model": "premium",
    "coverage": 25
  },
  "voice": {
    "id": "VOICE_ID_FROM_VOICES"
  },
  "sources": {
    "stock_video": true,
    "web_video": false,
    "ai_video": true,
    "stock_images": true,
    "web_images": false,
    "ai_images": true
  },
  "music": false
}

Read GET /catalog for supported capabilities. Use GET /voices, GET /avatars, and GET /brand-profiles for resources available to your workspace. Do not guess voice, avatar, or theme IDs. The API reference lists request defaults and optional voice settings.

Render, resume, cancel

POST /videos/{id}/render renders a ready draft. Use /resume for an eligible failed generation. Use /cancel to request cancellation; charges already incurred may remain. These operations require an idempotency key, and the API rejects actions that do not fit the video’s current state.

Download and pagination

When a video is completed, call GET /videos/{id}/download. Treat returned download links as temporary secrets and request a fresh link if one expires. List responses use data and next_cursor; pass it unchanged as the cursor query parameter to fetch the next page. For example: GET /videos?limit=20&cursor=NEXT_CURSOR.