The rate card
One credit is one US cent, so at 0.09 a
minute against another’s $0.001 and nothing to surface the gap.
Charges meter on the audio, not on the request: generated TTS seconds
(voice-clone previews included), transcribed duration, and realtime wall clock
from the moment the upstream pipeline connects until the socket closes. Close
your sockets when you are done — a session nobody is talking on still bills.
The ledger is integer cents and debits round to the nearest cent, so a short
generation rounds to zero and cost accrues across the requests that cross
whole-cent boundaries. Rounding to zero is not recording nothing: every unit
of usage is written whether or not it moves the balance, with the exact cost
carried in micro-cents, which is what the console’s consumption panel sums.
Credits are prepaid
There are no plans. You buy credits, usage draws them down, and nothing expires with a billing cycle. A new organization gets a one-time grant worth 1,440 minutes of audio — a full day, 144 credits at the rate above. It is denominated in minutes rather than credits because what a cent buys moves with the rate card, and a grant fixed in credits would silently become a different product every time the price changed. There is no automatic top-up. When the balance falls below roughly an hour of audio you get a banner in the console and an email; when it runs out, paid models answer429 insufficient_quota. A billable request also needs a minimum
balance of 10 credits to start — a floor that stops zero and negative balances
from opening new work, not a prepayment for the whole call.
Free-tier daily ceilings
Until an organization makes its first purchase, its speech usage is also capped per UTC day, in the units each surface is metered in.
Reaching one is
429 with code: "free_tier_daily_limit", and the message
names the surface and the reset (00:00 UTC). The ceiling is checked before the
work and recorded after it, so one oversized request can overshoot; the next
one is refused.
Any purchase lifts all three permanently. From then on the balance is the
only limit. The same rule gates cloning: an organization that has never bought
credits gets exactly one clone — still charged the 100-credit fee, which the
signup grant covers — and a second answers 403 plan_required.
These are deployment configuration, and a self-hosted install running its own
hardware sets them to 0 to switch them off. Read them rather than restating
them: GET /v1/organizations/billing/credits returns a free_tier block with
every figure and an active flag saying whether they currently apply to you.
Rate and concurrency limits
Requests per minute is one burst budget, keyed
speech:{organization}, spent
by every route that calls enforce_request_rate — not one budget each:
POST /v1/audio/speechPOST /v1/audio/transcriptionsPOST /v1/speech/transcriptions, the saved-transcript routeGET /v1/audio/voice-designPOST /v1/voices/{voice_id}/previewPOST /v1/chat/completionsWS /v1/realtimeandWS /v1/audio/stream, once at connect
/v1/speech/transcriptions
looks like a studio route rather than a speech route and spends the same 60.
Organizations flagged billing-exempt skip this budget entirely, which is why a
comped account cannot reproduce a rate limit a paying one is hitting.
There is no fixed per-organization ceiling on concurrent realtime sessions.
The serving pool has a finite number of pipelines, and when it is full a new
session is refused at connect rather than sharing degraded capacity with live
ones. A duet or a two-way interpretation opens sessions in pairs, so it
takes two slots and bills two sessions.
What running out looks like from inside your app
This is the part that decides whether your users see a useful message or a spinner. On an HTTP call, the balance is checked before the work:429 with
code: "insufficient_quota", in the OpenAI error envelope, so a typed SDK
error surfaces it.
On a live socket, the balance and the free-tier day are re-checked once a
minute while the call is up, and the wall clock so far is charged on the same
beat. So a long conversation cannot outrun the credit that started it, and a
crash no longer loses the whole call’s minutes — but a call can meet a limit it
did not have at connect. When that happens the gateway sends one last
eesi.session frame naming the reason, then closes with 1008:
limit.message. Only insufficient_quota and free_tier_daily_limit end
an established session this way — a re-check that could not decide, because
the ledger or the ceiling store was unreachable, refuses a new session but never
cuts one that is up.
Forecasting a month
Everything you need is one call, and every figure on it is the deployment’s own rather than a number restated here.GET /v1/organizations/usage/breakdown — it splits spend by kind, by model and
by API key. See Billing.
In a deployment with Stripe unconfigured, billing is off: the billing routes
answer
404, the credit gate always allows, and nothing is charged. That is
what a self-hosted install and most development environments look like.Next
Billing
Top-ups, the ledger, and reconciling a bill against your own usage.
Errors
Every
429, and which of them is worth a retry.Latency
Where a spoken turn’s time goes, and what actually moves it.
Models
Which id serves what, and what each one costs to run.