loopling.ai

Developer API

Billing & Ink · loopling API

Guide · Video · Responses · Messages · Billing & Ink

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:

  • Pay-as-you-go Ink costs $1 = 100 Ink, bought in Settings → Inkwell. It never expires.
  • A plan's monthly grant is Ink too, and spends the same way.
  • A call draws on the period grant first, then pay-as-you-go, exactly like a generation pressed in the app.

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.

Reserve, then settle

Every request is two ledger moves:

  1. Reserve. Before anything is sent to a vendor, Loopling holds the Ink the request could cost at most. If the wallet cannot cover the hold, the call answers 402 insufficient_ink_error and nothing else happens.
  2. Settle. When the vendor reports what was actually consumed, the hold becomes a charge for that amount and the rest is released.

What each product reserves and settles on:

ProductReservesSettles on
VideoThe requested duration at the requested resolutionThe delivered duration the vendor reports (never more than requested) at the requested resolution
ResponsesThe prompt (input, instructions and tools, counted as cache writes at the tier) plus max_output_tokens, floored at 32,768The usage the vendor reports: input, output, cache read, cache write — or the hold itself when Loopling stopped the reply at the visible-output cap
MessagesThe prompt as cache writes at the tier plus max_tokensThe 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.

Rates

Ink per second of video; the 5-second column is what a clip actually charges, because rounding happens once per clip.

ModelResolutionInk / s5 s clip
Seedance 2.5480p10.252 ($0.52)
Seedance 2.5720p22.9115 ($1.15)
Seedance 2.51080p56.8284 ($2.84)
Seedance 2.0480p6.935 ($0.35)
Seedance 2.0720p15.176 ($0.76)
Seedance 2.01080p37.6189 ($1.89)
Seedance 2.0 Fast480p5.629 ($0.29)
Seedance 2.0 Fast720p12.161 ($0.61)

Ink per million tokens for text:

ModelInputOutputCache readCache write
Astra (gpt-6-astra)3751,87538469
Claude Fable 5.1 (claude-fable-5-1)1,0635,313272,125
Claude Opus 5 (claude-opus-5)5322,657541,063
Claude Sonnet 5 (claude-sonnet-5)2131,06322425

Astra above 272,000 input tokens uses its long-context tier:

InputOutputCache readCache write
7502,81375938

GET /v1/models returns these same figures as pricing.ink and, at the pay-as-you-go face value, pricing.usd_payg.

Worked examples

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.

Per-key caps

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.

Reading usage

Settings → API shows, per account:

  • Ink available — the period grant, pay-as-you-go, and the total a key can draw on.
  • Keys — each key's prefix, when it was created and last used, what it has charged, and its cap.
  • Usage — the last 30 days by product and by key, and every request with its status, model, reported usage and Ink, filterable by key.

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.

Refunds and holds

  • Before dispatch, nothing is charged. Validation errors, 401, 402, 403, 429 and a 503 from an unconfigured lane all leave the wallet untouched.
  • A vendor failure refunds. A video generation the vendor fails is released in full; ink_charged reads 0 and error names the reason.
  • A delivery failure refunds. If the vendor produces a clip but Loopling cannot store it, the reservation is released and the generation reads failed.
  • A gateway rejection releases. A text request the vendor's gateway refuses before running the model (400 upstream_rejected) never ran, so its hold is released in full.
  • A text call settles to actual usage. A reply that reaches 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.
  • An ambiguous outcome keeps its hold. If the vendor never reports usage — a lost reply, a vendor error after dispatch, a stream that ends without a receipt (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.

API overview

loopling.ai · grows with you, grows itself

hello@loopling.ai · community · pricing · Enterprise · API · privacy · terms