Developer API
Guide · Video · Responses · Messages · Billing & Ink
Ink is Loopling's unit of work. Every price on this surface is in Ink, and Ink is the same wallet the app spends:
Prices are published per unit in Ink — per second of video, per million tokens of text. A request is billed as its Ink rate times the usage the vendor reports, rounded up once per request. Cache reads are billed at the cache-read rate and cache writes at the 1-hour cache-write rate (the vendor's receipt does not say which tier a write belongs to, so the longer one applies); long-context tokens at their own rate.
Every request is two ledger moves:
402 insufficient_ink_error and nothing else happens.What each product reserves and settles on:
| Product | Reserves | Settles on |
|---|---|---|
| Video | The requested duration at the requested resolution | The delivered duration the vendor reports (never more than requested) at the requested resolution |
| Responses | The prompt (input, instructions and tools, counted as cache writes at the tier) plus max_output_tokens, floored at 32,768 | The usage the vendor reports: input, output, cache read, cache write — or the hold itself when Loopling stopped the reply at the visible-output cap |
| Messages | The prompt as cache writes at the tier plus max_tokens | The usage the vendor reports, with cache buckets at their own rates |
A generation lane holds the requested amount and refunds the difference — a 30-second request that the vendor delivers as 29 seconds is charged for 29. A text call whose reply stops well under the cap is charged only for the tokens that came back. ink_reserved on a fresh generation and ink_charged on a finished one show both sides.
One rule above all: if the vendor never reports usage, the hold stays until we reconcile it; it is never silently charged. A lost reply, a vendor error after dispatch, or a stream that ends without a receipt keeps the reservation in place, visible as ink_reserved in Settings → API, until the vendor's invoice says what happened — and then it is settled or released from that record.
Ink per second of video; the 5-second column is what a clip actually charges, because rounding happens once per clip.
| Model | Resolution | Ink / s | 5 s clip |
|---|---|---|---|
| Seedance 2.5 | 480p | 10.2 | 52 ($0.52) |
| Seedance 2.5 | 720p | 22.9 | 115 ($1.15) |
| Seedance 2.5 | 1080p | 56.8 | 284 ($2.84) |
| Seedance 2.0 | 480p | 6.9 | 35 ($0.35) |
| Seedance 2.0 | 720p | 15.1 | 76 ($0.76) |
| Seedance 2.0 | 1080p | 37.6 | 189 ($1.89) |
| Seedance 2.0 Fast | 480p | 5.6 | 29 ($0.29) |
| Seedance 2.0 Fast | 720p | 12.1 | 61 ($0.61) |
Ink per million tokens for text:
| Model | Input | Output | Cache read | Cache write |
|---|---|---|---|---|
Astra (gpt-6-astra) | 375 | 1,875 | 38 | 469 |
Claude Fable 5.1 (claude-fable-5-1) | 1,063 | 5,313 | 27 | 2,125 |
Claude Opus 5 (claude-opus-5) | 532 | 2,657 | 54 | 1,063 |
Claude Sonnet 5 (claude-sonnet-5) | 213 | 1,063 | 22 | 425 |
Astra above 272,000 input tokens uses its long-context tier:
| Input | Output | Cache read | Cache write |
|---|---|---|---|
| 750 | 2,813 | 75 | 938 |
GET /v1/models returns these same figures as pricing.ink and, at the pay-as-you-go face value, pricing.usd_payg.
A 5-second 1080p Seedance 2.5 clip. 56.8 Ink per second × 5 s, rounded up once: 284 Ink, about $2.84 in pay-as-you-go Ink.
A 10-second 720p Seedance 2.0 Fast clip. 121 Ink ($1.21).
An Astra call, 10,000 input tokens and 2,000 output tokens. 10,000 × 375 Ink per million in, plus 2,000 × 1,875 Ink per million out, rounded up once: 8 Ink ($0.08). The reservation for that call is larger — the prompt plus the output cap — and the difference comes back at settlement.
A Claude Opus 5 call, 10,000 input tokens and 2,000 output tokens. 10,000 × 532 Ink per million in, plus 2,000 × 2,657 Ink per million out, rounded up once: 11 Ink ($0.11).
The same call on Claude Sonnet 5. 5 Ink ($0.05). On Claude Fable 5.1: 22 Ink ($0.22).
Every figure above is rendered from the pricing contract the ledger charges from; none of them is typed into this page.
A key can carry an Ink cap — set it when you create the key, or edit it later in Settings → API. Charged Ink accumulates against the cap for the life of the key; when the next reservation would cross it, that key answers 402 insufficient_ink_error with code: "key_ink_limit_reached". A wallet that cannot cover a reservation at all answers 402 with code: "insufficient_ink", and the message names the Ink required and available. The account's other keys are untouched, and the app is untouched.
Caps are a budget for a deployment, not a security boundary: a key that leaks can still spend up to its cap. Revoke a leaked key immediately; revocation refuses new calls with 401, and any generation already running finishes and settles normally.
GET /v1/me shows a key's ink_limit and ink_charged; GET /v1/models does not depend on the cap.
Settings → API shows, per account:
The same usage sits in the account's Ink ledger next to the app's own generations, because it is the same wallet. Text calls also report their charge in the response: a streamed reply ends with a loopling.usage event carrying ink_charged, usd_payg_charged and request_id, and a non-streaming reply carries X-Loopling-Ink-Charged and X-Loopling-Request-Id headers — see Streaming.
401, 402, 403, 429 and a 503 from an unconfigured lane all leave the wallet untouched.ink_charged reads 0 and error names the reason.failed.400 upstream_rejected) never ran, so its hold is released in full.max_tokens is charged what the vendor reports, never more than the reservation. An Astra reply that Loopling itself stops at the visible-output cap is charged at its hold, because the vendor's count is not available for a stopped run. A reply cut by a client disconnect is still charged for what the vendor produced — Loopling does not abort the vendor when the client leaves.usage_unknown) — the reservation stays held until the vendor's own record resolves it, and Loopling finalises or releases from that record. It is never silently charged. The hold is visible as ink_reserved on the request in Settings → API.Refunds return Ink to the pool it came from — grant Ink to the grant, pay-as-you-go to pay-as-you-go.
loopling.ai · grows with you, grows itself
hello@loopling.ai · community · pricing · Enterprise · API · privacy · terms