Start here
Overview and quickstart
Everything you can do in the Chasca app, you can do over HTTP: create a narrated whiteboard explainer from a prompt or a document, wait for it, and change one thing at a time or edit its scene graph. The SDK, the CLI and the MCP server are thin layers over the same API.
https://app.trychasca.com/api 1. Get an API key
In the app, open Settings → API keys and create a key. Keys look like
chk_live_… and are shown once, so store yours somewhere safe (an environment variable is perfect).
- API access is included on Plus and above. Compare plans.
- Videos made with an API key, through the API, the SDK and CLI or the key-based MCP server, use your plan minutes at 2x: a 1-minute video uses 2 minutes. The connector for Claude and other assistants, which signs in to your account, works on every plan and counts like the app.
2. Authenticate
Send the key as a bearer token on every request:
Authorization: Bearer chk_live_...
All request and response bodies are JSON. The API lives at https://app.trychasca.com/api.
3. Create an explainer
Send what you want explained as input: a topic, a question or the full text of a document. Pick a
length in 30-second steps up to 30:00, or leave it out and Chasca chooses.
curl -X POST https://app.trychasca.com/api/v1/explainer \
-H "Authorization: Bearer $CHASCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "Explain how vaccines train the immune system",
"length": "1:00",
"aspect": "16:9",
"preset": "marker"
}' The API answers 202 Accepted straight away with the queued record. Generation runs in the background.
{
"id": "0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60",
"status": "queued",
"stage": null,
"progress": 0,
"prompt": "Explain how vaccines train the immune system",
"lengthSeconds": 60,
"voice": "chasca:sulafat",
"language": "en",
"aspect": "16:9",
"preset": "marker",
"videoUrl": null,
"createdVia": "api",
"createdAt": "2026-09-23T09:14:02.118Z"
} 4. Wait for it
Poll the explainer until status is ready. It moves through
queued → generating → rendering → ready (or failed, with a readable
error). Most videos are ready in under a minute. If you’d rather not poll, subscribe to the
event stream.
curl https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60 \
-H "Authorization: Bearer $CHASCA_API_KEY"
A ready explainer carries videoUrl, posterUrl and subtitlesUrl, plus the full
editable sceneGraph, every version and per-scene timings. Media links are signed and expire after
about a week; fetch the explainer again for fresh ones.
5. Change one thing
Send one change, and everything else stays exactly as it was. Subtitles, board style, music, watermark, logo and credit line make a free new version of the same video, with the same narration. A new voice or format makes a separate video from the same script and drawings, charged like a new one.
curl -X POST https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/change \
-H "Authorization: Bearer $CHASCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "kind": "captions", "captions": true, "captionStyle": "bold" }'
To change the words or the drawings, send the explainer’s sceneGraph back with your edits to
edit: only the scenes that changed are drawn again. Undo either with
revert.
Prefer TypeScript?
The SDK wraps all of this, including waiting, retries and typed responses. See CLI and SDK. To let Claude, Cursor or another agent drive Chasca, see MCP setup.
import { ChascaClient } from '@chasca/sdk';
const chasca = new ChascaClient({ apiKey: process.env.CHASCA_API_KEY! });
const job = await chasca.createExplainer({ input: 'How compound interest snowballs', length: '1:00' });
const video = await chasca.waitForExplainer(job.id);
console.log(video.videoUrl); Limits at a glance
- Generation, change and edit requests: 20 per minute. Everything else: 200 per minute.
- Video length: 30 seconds to 30 minutes, in 30-second steps. Past 6 minutes a video is told in chapters, and your minutes left have to cover the length you ask for.
-
Errors always look the same:
{ "error": true, "code": "...", "message": "...", "status": 400 }. See errors.