Overview and quickstart
Generate a whiteboard explainer video with one API call. Authenticate with a Bearer key, POST a prompt, and poll for the finished video and its editable scene graph.
Animations turns a prompt or a document into a whiteboard explainer video, and hands you back both the rendered video and its editable scene graph. This is the reference for the HTTP API, the CLI, the TypeScript SDK, and the MCP server.
Get an API key ➜What you get back
There is one generation endpoint behind four front doors: the HTTP API, the TypeScript SDK, the CLI, and an MCP server your agent can call as a tool. Whichever you use, a finished generation hands back two things: the rendered video, and the scene graph it was drawn from.
The scene graph is the part worth integrating against. It is JSON, every scene in it is addressable, and you can send an edit for a single scene and re-render only that scene. One wrong sentence in scene three costs you scene three, not the whole video.
API access is included on every paid plan. Create an API key from Settings in the app once you are on a plan. API generations draw from your plan minutes at the same rate as the app. There is no separate API price.
Authentication
Every request is authenticated with your API key as a Bearer token. Create a key in the app under Settings, then send it on the Authorization header:
Authorization: Bearer sk_...The key is shown once, at creation. Keep it secret. The base URL for every endpoint is:
https://animations.snow66.com/apiQuickstart
1. Create an explainer
Send your topic as input and an optional target length as length (a friendly "M:SS" string like "0:30" or "1:00", in 30-second steps). Omit length for automatic length.
curl -X POST https://animations.snow66.com/api/v1/explainer \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "input": "Explain how DNS resolves a domain name", "length": "0:30" }'The call returns 202 Accepted immediately with a queued record. Rendering runs in the background and takes a few minutes.
{
"id": "10f00eee-d2d6-4a1b-b708-f0391faaa85b",
"status": "queued",
"prompt": "Explain how DNS resolves a domain name",
"lengthSeconds": 30,
"voice": "animations:sulafat",
"language": "en",
"aspect": "16:9",
"videoUrl": null,
"sceneGraph": null
}2. Poll for the result
Fetch the explainer by id until its status reaches a terminal state. The lifecycle is queued then generating then rendering then ready (done) or failed.
curl https://animations.snow66.com/api/v1/explainer/10f00eee-d2d6-4a1b-b708-f0391faaa85b \
-H "Authorization: Bearer sk_..."When it is ready, the record carries the video URL and the editable scene graph:
{
"id": "10f00eee-d2d6-4a1b-b708-f0391faaa85b",
"status": "ready",
"videoUrl": "https://animations.snow66.com/media/....mp4",
"sceneGraph": { "scenes": [ ... ] }
}Friendly and classic field names. input and length are the friendly request fields. The older prompt (string) and lengthSeconds (a number, a positive multiple of 30) are still accepted as aliases, so existing integrations keep working. When both are sent, the friendly field wins.
Where to go next
animations command line and the @animations/sdk TypeScript client./docs/cli