Skip to main content
All video work follows the same pattern: send a request with a projectId and an Idempotency-Key, receive a jobId, and poll GET /v1/jobs/{jobId} until it is done. See Jobs & polling.

Choose an operation

Discover video options

GET /v1/video/options returns everything POST /v1/video/render and the 3D operations accept right now: narration providers, models and voices; lesson workflows, teaching capabilities and templates; chess formats and audiences; renderer readiness; short-form platforms; and artifact kinds. Read it instead of hard-coding these values. It is free.

Edit your own footage

Give Sigmora your raw clips and a brief, and it produces an edited long-form cut and, if you ask, short-form clips — removing false starts, tightening pacing and packaging the result.
1

Add the footage to the project

Import each clip from a public HTTPS URL with POST /v1/assets/import, or upload files from disk with the upload operations (POST /v1/assets/upload/prepare, then POST /v1/assets/upload/complete). Each returns an asset; its contentId is the clip id the editor takes.
Before editing, poll GET /v1/assets/{assetId}/ingest?projectId=... until ready is true; its contentId is the value to pass in clipIds.
2

Submit the edit

shootId is any stable id you choose to group the clips of one shoot. clipIds are the assets’ contentId values. Set shortsCount for short-form outputs, and reviewCuts: true to approve the cuts before anything renders.
Footage edits are priced per output, the long cut and each short. A source longer than 20 minutes adds one more unit per started 20 minutes beyond the first (45 minutes adds 2). The quote (x-sigmora-quote-only) includes it.
3

Collect the outputs

Poll the job ids with GET /v1/jobs/{jobId}. Without reviewCuts, the edit renders straight through to done. With it, the parent job stops at awaiting_review — continue below.

Review the cuts before rendering

A review-mode edit stops at awaiting_review with a proposal: the cuts it wants to make, the topics it found, and the moments that would stand alone as shorts. Nothing renders until the cut is approved.
  1. Page through the proposal with GET /v1/jobs/{jobId}/proposal, using after and page.nextAfter (see Pagination).
  2. Approve the cuts you want with POST /v1/video/edit/approve. You can also drop whole topics, or pick specific topics and moments to cut as shorts.
appliedCutIds takes only ids from the stored proposal; an empty list keeps all the footage. The approval starts the renders and returns their job ids to poll.

Generate 3D

Describe an object, or send a photo of one, and receive an animated 3D render. Both operations are asynchronous and need GPU capacity — check available in GET /v1/capabilities first; when they cannot run, the call is refused with 503 capability_unavailable before you are charged.
POST /v1/3d/from-image takes assetUrl — a public or signed URL of the photo — instead of prompt. Presets are turntable, orbit, dolly_in, float_bob and beauty. When the job is done, download the result from artifacts.download with your API key, following the redirect (see Jobs & polling).

Draft renders

Set draft: true on POST /v1/video/render for a low-cost 480p review copy. When you are happy, finalize it with POST /v1/jobs/{jobId}/finalize and the draft’s projectId: the same video renders at full quality as a new job, and reuses the draft’s script and narration. Each accepted render is charged; the same Idempotency-Key returns the same final job and is never charged twice. A job that is not a draft answers 409 conflict.
offlineSlots: true fills visuals without external image providers, for fully deterministic output. It cannot be combined with renderer: "blender".

Release checks

Before narration, each render’s script is reviewed against its source for accuracy, fidelity, audience fit and pacing. If the review blocks the script, the job ends as qa_failed before any narration or render cost — read job.artifacts.scriptReview to see the evidence, fix the input, and submit again rather than retrying unchanged.

Retries and ownership

  • Send a stable Idempotency-Key with every POST, and reuse it only with the same body.
  • Accepted async work may answer 200 or 202. Branch on the body — the jobId and status — not on that difference.
  • A job from another workspace answers 404 not_found.
  • A temporary outage reading a job answers 503 upstream_unavailable; retry. It is never reported as a missing job.

More video workflows

Chess videos

Render a full analysis of a Lichess game.

Content intelligence

Analyze a reference video and turn it into a production brief.