Guides
Connect an API key from OpenRouter, Anthropic, OpenAI or Google Gemini, and your videos run on your account with that provider. It works on every plan, including Free.
| Provider | Runs | Default model |
|---|---|---|
| Every model, including any model id on OpenRouter | Claude Sonnet 5.5 | |
| Claude models | Claude Sonnet 5.5 | |
| GPT models | GPT-6.1 Sol | |
| Gemini models | Gemini 3.1 Pro |
“Default model” is what runs when you don’t pass model and that key is the one in use.
You can keep one key per provider. Replace a key by saving a new one, use the refresh button to re-check it, or remove it at any time. Changes apply to the next video you start.
For one-off jobs, or if you’d rather not store a key with us, send it in the llm field. It’s checked with the provider, used for that one video, and never saved.
| Field | Type | Notes |
|---|---|---|
llm.provider | string | openrouter, anthropic, openai or gemini |
llm.api_key | string | Your key for that provider |
curl -sS -X POST "$MANIMOTION_API/video/request" \
-H "Content-Type: application/json" \
-H "x-api-key: $MANIMOTION_KEY" \
-d '{
"prompt": "Explain eigenvectors visually",
"model": "anthropic/claude-opus-5.5",
"llm": {
"provider": "anthropic",
"api_key": "'"$ANTHROPIC_API_KEY"'"
}
}'{
"job_id": "f0e1d2c3-b4a5-6789-0abc-def123456789",
"status": "queued",
"model": "anthropic/claude-opus-5.5",
"key_source": "byok",
…
}const video = await manimotion.videos.generate({
prompt: "Explain eigenvectors visually",
model: "anthropic/claude-opus-5.5",
llm: { provider: "anthropic", apiKey: process.env.ANTHROPIC_API_KEY },
});
console.log(video.keySource); // "byok"For each request, the first match wins:
llm field.The response’s key_source tells you which one ran: "byok" for your key, "platform" for ours. Once a video starts on your key, every AI step of that video uses your key.
Problems are reported as early as possible, with a message that names the provider and says what to fix.
| When | What you see |
|---|---|
| The key in llm is wrong | The request is rejected with 400. No job is created and nothing counts toward your limit. |
| The key can’t run the model | 400, telling you which provider’s key the model needs. |
| The provider rejects the key mid-video | The job fails with error_code: "llm_auth". A saved key is flagged in Settings → AI providers. |
| Your provider account is out of credits | llm_quota. Top up with your provider and retry. |
| Your provider is rate-limiting you | llm_rate_limit. Wait a minute and retry. |
| The provider doesn’t know the model id | llm_model. Check the id, or pick another model. |
Every code is listed on the Errors page.
sk-ant-…x9Qa. No page or API returns the full key.llm are used for that one video and never stored.