Skip to main content
Send a Lichess round id and the two players, and Sigmora writes a fact-checked analysis, verifies the board positions, narrates it and renders the video.

How it works

  1. GET /v1/video/options lists the current chess formats, audiences, duration bounds and whether board verification is available.
  2. POST /v1/projects creates a project with videoPath: "chess-video", unless you already have one.
  3. POST /v1/video/render submits the game with domain: "chess".
  4. GET /v1/jobs/{jobId} is polled until the job is terminal.
  5. A finished job carries the video plus evidence of its quality checks: artifacts.scriptReview (the script review) and artifacts.runJson (the signed run manifest).

Render a game

Send only the Lichess id as videoId, with the players in chessWhite and chessBlack. The combined round:white:black form is rejected.

Script review

Before narration, the script is reviewed against the game for factual accuracy, source fidelity, audience fit, spoken delivery, visual editability and pacing. job.artifacts.scriptReview is a URL to that review. If the review blocks the script, the job ends as qa_failed before any narration or render cost — read the review, adjust the request, and submit again.

Complete example client

Download the runnable Node.js client, chess-video.mjs. It checks your choices against the live options, creates or reuses a project, derives a stable idempotency key, polls safely, validates the quality evidence, downloads the video, review and run manifest, and prints a receipt.
Set SIGMORA_PROJECT_ID to reuse an existing project. If the process stops after submitting, nothing is lost: run it again with the same project, or resume polling GET /v1/jobs/{jobId}. The deterministic idempotency key means the same game is never charged twice. For unattended production, send callbackUrl and callbackSecret with the render and keep polling as the fallback. See Webhooks.

Other video types

Lessons, how-to videos, stories, UGC and catalogue entries follow the same steps; only the source and the type-specific fields change. Read GET /v1/video/options instead of hard-coding values, and use GET /v1/video/catalog/{domain} to find catalogue ids.