Documentation

API reference

Asynchronous video generation over HTTP: submit a task, poll or receive a webhook, fetch a signed asset URL. This page covers the request shapes, routing parameters, error handling and metering behaviour that matter in production.

Version 1 · Last updated November 2026

Overview

Every generation is a task. You submit a task with a prompt, input assets and an output envelope; the API returns a task identifier immediately. You then poll the task, or receive a webhook, until it reaches a terminal state and returns asset URLs.

  • Transport: HTTPS, JSON request and response bodies
  • Model: asynchronous tasks with durable state — a dropped connection never loses a render
  • Outputs: MP4 delivered over time-limited signed URLs
  • Retries: pass an idempotency_key so a retried request does not create a second billable task
Base URL and credentials are issued with your access package. Hosts are region-specific; the examples below use the standard form.

Authentication

Authenticate with a bearer token. Keys are scoped to an account and an environment; production and test keys are separate and non-interchangeable.

Authorization: Bearer $TSC_API_KEY
  • Store keys in a secret manager, never in client-side code
  • Rotate on a schedule; old keys remain valid for a short grace window
  • Missing, revoked or wrong-environment keys return 401

Quickstart

Submit a ten-second clip at quality tier, then read the task until it succeeds.

POST /v1/generations
{
  "prompt": "Dolly-in on a rain-slick alley, neon reflections, 35mm",
  "quality": "flagship",
  "aspect_ratio": "16:9",
  "resolution": "1080p",
  "duration": 10,
  "idempotency_key": "ord_8f21"
}

Response:

{
  "id": "gen_5c1e94a7",
  "status": "queued",
  "tier": "quality",
  "created_at": 1762905600
}

Create a generation

Required fields are prompt and the output envelope. Everything else has a documented default.

FieldTypeDescription
promptstringNatural-language instruction; long prompts are supported
qualitystringflagship, balanced, throughput
resolutionstring480p, 720p, 1080p, 4k (tier dependent)
durationintegerSeconds; supported range depends on tier
aspect_ratiostring16:9, 9:16, 1:1, 4:3
input_imagesarrayReference and first/last-frame images by URL
input_videostringMotion or continuation reference
seedintegerReuse a seed for comparable output across runs
webhook_urlstringDestination for terminal-state events
idempotency_keystringDeduplicates retries for 24 hours

Supplying a video input changes the metering basis and may change the eligible tier — the platform validates the combination before scheduling work, so an unsupported combination fails fast instead of after a long queue wait.

Poll status

GET /v1/generations/{id}

Status values: queued, running, succeeded, failed, cancelled. On success the response includes asset URLs; on failure a machine-readable error.code and the stage at which it failed.

  • Poll with exponential backoff starting around 2 seconds
  • Prefer webhooks for long-running or high-volume pipelines
  • Asset URLs are time-limited — copy to your own storage on receipt

Webhooks

Register a webhook_url per request or per project. Events are signed with an HMAC header over the raw body; verify the signature before acting on it.

  • Delivered at least once — deduplicate on event_id
  • Retried with backoff for up to 24 hours on non-2xx responses
  • Include the terminal state and asset URLs so no follow-up call is needed

Routing tiers

TierOptimised forTypical durationTypical resolution
flagshipFidelity and instruction followingup to 30 s1080p
balancedCost per finished asset4 – 15 s480p – 4K
throughputIteration speed and volume4 – 15 s480p – 720p

Pin a specific model only when you need reproducible characteristics: pinning trades routing flexibility for determinism. The current model set and its identifiers are listed in your access package.

Errors

HTTPCodeMeaning
400invalid_requestMalformed body or unsupported parameter combination
401unauthorizedMissing, revoked or wrong-environment key
402quota_exhaustedPrepaid balance or monthly cap reached
404not_foundUnknown task or project
429rate_limitedConcurrency or request-rate ceiling reached
451content_policyInput or output rejected by moderation
5xxupstream_errorProvider-side failure; retried automatically, not billed

Metering

Usage is metered per successful task and depends on tier, resolution, duration and whether a video input is included. Failed or policy-rejected tasks are not billed. Usage events are queryable per project, which is what makes cost attribution possible without building your own ledger.

Limits

Concurrency is the primary control, not requests per minute: each account has a number of simultaneous render slots per tier. Reserved capacity is available under committed-volume agreements. If you need to burst, describe the workload shape — a campaign launch and steady-state catalog work need different provisioning.

Support

Integration questions go to [email protected]; commercial terms to [email protected]. Include the task id, timestamp and, where relevant, the idempotency_key — it shortens the loop considerably.