Reference

API reference

Every endpoint, field and value. For a guided walkthrough, start with the Quickstart.

Basics

TopicDetails
Base URLhttps://api.manimotion.dev
AuthenticationHeader x-api-key: chalk_live_sk_v1_…, from Settings → API keys
FormatJSON request bodies with Content-Type: application/json; JSON responses
Errors4xx/5xx with {"detail": "…"}. See Errors
EndpointPurpose
POST /video/requestStart a video
GET /video/status/{job_id}Progress and result
GET /modelsSupported models and your access
GET /healthUptime check, no key needed

POST /video/request

Starts a video and returns right away with a job_id. Checks run in order (key, model, storage, plan limit), and a request that fails any of them is rejected without counting toward your limit.

request.sh
curl -sS -X POST "$MANIMOTION_API/video/request" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $MANIMOTION_KEY" \
  -d '{
    "prompt": "Explain Bayes theorem with a medical testing example",
    "style": "auto"
  }'
RESPONSEresponse.json
{
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "queued",
  "cached": false,
  "video_url": null,
  "eta_seconds": 150,
  "eta_display": "~2–3 min",
  "message": "Queued…",
  "tier": "tier2",
  "model": "anthropic/claude-haiku-5.5",
  "key_source": "platform"
}

Body

FieldTypeDescription
promptstringWhat the lecture is about. 10–2000 characters. Name the audience and the visual you want for best results.
modeloptionalModel id, e.g. anthropic/claude-sonnet-5.5. Defaults to Claude Haiku 5.5, or to your connected AI key’s default model. See Models.
llmoptional{ "provider", "api_key" }: run this video on your own AI key. Provider is openrouter, anthropic, openai or gemini. Not stored. See Bring your own key.
styleoptionalauto (default), math or graphics. See Styles.
durationoptionalTarget length in seconds, 15–180. A soft target; leave it out to let the lesson set its own length (usually 20–120).
tieroptionaltier1 (fastest, ~1–2 min), tier2 (default, ~2–3 min) or tier3 (most detailed, ~4–5 min).
storageoptional{ "integration_id" } for a saved bucket, or { "inline": {…} } for per-request credentials. Leave it out to use your most recent saved bucket. See Storage.

Response

FieldDescription
job_idId to pass to GET /video/status
statusqueued, or completed when cached is true
cachedtrue if an identical recent request was reused; video_url is then already set
eta_secondsRough time to finish; eta_display is the same, for humans
modelThe model that will write the lesson
key_sourcebyok (your AI key) or platform (ours)
tierThe tier the job runs at

GET /video/status/{job_id}

Returns the job’s progress, then its result. Poll every 2–3 seconds. You can only read jobs created with your own account’s keys.

status.sh
curl -sS "$MANIMOTION_API/video/status/$JOB_ID" \
  -H "x-api-key: $MANIMOTION_KEY"
RESPONSEresponse.json
{
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "completed",
  "video_url": "https://cdn.example.com/videos/a1b2c3d4.mp4",
  "error": null,
  "error_code": null,
  "model": "anthropic/claude-haiku-5.5",
  "key_source": "platform",
  "cached": false,
  "style": "math",
  "duration": 54.2,
  "phase": "completed",
  "message": "Done!",
  "eta_seconds": 0,
  "tier": "tier2"
}

Response

FieldDescription
statusWhere the job is; see below
messageHuman-readable progress, e.g. “Generating narration…”
eta_secondsEstimated seconds left, while in progress
video_urlThe MP4, once completed
durationVideo length in seconds
stylemath or graphics: the style that was used
errorWhy it failed, when failed. Safe to show to users
error_codeMachine-readable reason, when failed. See job failure codes
modelThe model that wrote the lesson
key_sourcebyok or platform

Status values

statusMeaning
queuedAccepted, about to start
processing planning generating_audio generating_code merging uploadingWorking. Each step updates message and eta_seconds
completedDone. Use video_url
failedStopped. Read error and error_code

GET /models

The model catalog. Send your API key and each model includes available and via (byok, platform or null), and providers shows which AI keys you’ve connected. Full example on the Models page.

GET /health

Returns {"status": "ok", "service": "manimotion"} when the API is up. No key needed; use it for uptime checks.

Limits

PlanVideosOutput
Free3 per day720p, watermarked
Hobby40 per month1080p
Pro80 per month1080p

Videos are counted per API key. Daily limits reset at midnight UTC, monthly ones on the 1st. Separately, each IP address can send up to 20 video requests per 10 minutes. Over either limit you get 429.

Errors

Status codes, job failure codes and retry advice are on the Errors page.