This page is the single source for Content API prices. Other pages link here instead of repeating the numbers.
Test keys never spend anything: priced routes answer with canned content and charge 0. With a live key, Content API calls spend the TutorFlow organization's normal AI Credit balance, the same balance shown in TutorFlow Billing and spent by the TutorFlow editor. The prices are the same as in the editor. Agent Platform credits (/v1/platform/**) are a separate balance and are never used as a fallback.
Price list
| Call | Credits | Scope |
|---|---|---|
Every read (GET), including GET /v1/content/credits | 0 | content:read |
| Create, update, and delete of modules, courses, chapters, lessons, videos, scenes, slides, tests, games, and simulations, with content you supply | 0 | content:write |
| Module copy into a course | 0 | content:write |
| Game or simulation version restore | 0 | content:write |
| Expansion job, any outputs (editable drafts; no model is called) | 0 | content:generate |
| Asset upload URL and upload | 0 | content:write |
| Test generation | 3 | content:generate |
| Module generation | 3 | content:generate |
| Course generation: outline | 3 | content:generate |
| Course generation: each lesson | 3 | content:generate |
| Slide deck generation: outline | 0 | content:generate |
| Slide deck generation: each text page | 1 | content:generate |
| Slide deck generation: each image page (every fourth page from the first) | 3 | content:generate |
| Game brief | 1 | content:generate |
| Game build | 40 | content:generate |
| Game revision | 40 | content:generate |
| Simulation brief | 1 | content:generate |
Simulation build or revision, 2D plan (representation: "2d-canvas") | 20 | content:generate |
Simulation build or revision, 3D plan (representation: "3d-three") | 30 | content:generate |
Video scene narration (TTS from the scene script), per scene | 1 | content:generate |
| Video render to mp4 | 5 | content:generate |
| Video render cancel | 0 | content:generate |
Expansion jobs are free: they turn your source JSON into editable drafts (a module with your text, an empty video, a test with your topic) without calling a model. Before 2026-09-30 each output was priced at 3, 1, and 3 credits. A game's metadata.dimension does not change its price; a simulation's price follows the representation its brief settled, so read it after the brief and before the build.
When the charge happens
| Call | Balance check | Charge |
|---|---|---|
| Game or simulation brief, build, revise | Checked before the stream opens, or before the 202 in async mode. Not enough returns 402. | Charged once, after the new version is stored. A run that fails, or a stream you hang up on, costs nothing. |
| Video render | Checked when the render starts. Not enough returns 402. | Charged when the render starts. A render that later fails is not refunded. A video with a scene that has no narration audio is refused with 400 before any charge, unless the request sets generateMissingNarration: then the balance check covers the narration (1 credit per scene) and the render together, and the narration is charged as each scene is narrated. |
| Scene narration | The total for every scene to narrate is checked before the first one. Not enough returns 402. | Charged per scene as it is narrated. |
| Test, module, course, or slide deck generation | estimatedCredits is checked before the 202. A course checks again before each lesson, and a deck before each batch. Not enough returns 402 before the run starts, or fails the run partway. | A test or module is charged when it is saved. A course is charged 3 for the outline, then 3 as each lesson is saved. A slide deck is charged per batch of four pages as it is written (6 for a full batch). What was written before a failure stays charged. See Credits. |
Every check also applies the key's monthly credit limit, when it has one.
Retrying with the same Idempotency-Key never charges twice: async generation and render requests replay their first response, and expansions return the existing job. See Idempotency.
Check the balance
curl "$TUTORFLOW_API_BASE_URL/v1/content/credits" \
-H "Authorization: Bearer $TUTORFLOW_CONTENT_API_KEY"{
"credit": 500,
"overdraftCredit": 0,
"overdraftLimit": 100,
"availableCredit": 500,
"isPaymentFailed": false,
"livemode": true
}| Field | Meaning |
|---|---|
credit | The organization's credit balance. |
overdraftCredit, overdraftLimit | Overdraft used and allowed. Overdraft applies only to postpaid plans that are not canceled. |
availableCredit | What a priced call can spend now, after payment status and any overdraft allowance. Compare this with the price before a batch. |
isPaymentFailed | true when the organization has a failed payment. Priced calls then return 402 content_payment_failed until it is resolved in TutorFlow Billing. |
livemode | true for a live key. A test key gets false and a fixed sandbox balance instead of the organization's. |
Per-key monthly limits
An admin can cap what one key spends in a UTC calendar month with monthlyCreditLimit. The key still spends the organization's balance; the limit only stops it from spending more than its share. A priced call that would take the key over its limit answers 402 content_key_budget_exceeded before any charge. The limit is checked when each action or step starts, so work already running can finish past it. See Monthly credit limit.
What was spent
GET /v1/content/credits/history lists every charge, refund, and adjustment, with the key that made each charge. See Credit history.
Payment errors
| Status | error.code | What to do |
|---|---|---|
402 | content_payment_required | Add credits in TutorFlow Billing, then retry with the same Idempotency-Key. |
402 | content_payment_failed | Resolve the failed payment in TutorFlow Billing, then retry. |
402 | content_key_budget_exceeded | The key reached its monthly limit. Wait until error.resetsAt, or ask an admin to raise the limit. |
Retrying a 402 without changing the balance returns 402 again. See Errors.