Prepaid credit
You top up a balance in advance. Usage is drawn down from it as rooms run.
Metered per participant
Each connection to a room is metered separately, not the room’s wall-clock length.
Priced per class
A person and the translator serving the room have their own per-minute rates.
The calculation
A room’s charge is the sum of every participant’s connected minutes, each priced at the rate for its own class:participant_class is human for each person in the room, or agent for the translator
that serves it. The translator bills at a higher per-minute rate than a person, which
is why it is not present in an idle room — it joins on its own once the room holds two
languages, and leaves when fewer than two remain.
Read the current rates from GET /v1/billing/credit rather than hardcoding them, because
they can change:
cURL
Response
All amounts across the API are integers in the smallest unit of
currency — cents, not
dollars. credit_cents, charged_cents, total_charged_cents and delta_cents all
follow this.Worked example
Two people hold a translated conversation. Speaker A joins first and stays for the whole call; Speaker B joins a minute and a half later, and the translator joins with them, since that is the point at which the room holds two languages. Everyone leaves when the room is closed at14:12:10.
Two things to read out of this:
- Partial minutes round up. Speaker B and the translator were each connected for 8m 30s, and each is billed 9 minutes — the half minute is a whole billed minute.
- Minutes are summed per participant, not per room. The room lasted 10 minutes on the
clock, but
total_connection_minutesis28. Adding a third person to the same call would add their minutes on top, not spread the room’s 10.
What counts as a connected minute
Metering starts when a participant connects
Metering starts when a participant connects
A participant’s meter runs from the moment their connection to the room is
established — recorded as
joined_at — until it ends, recorded as left_at. Time
between creating a room and anyone joining it costs nothing.Partial minutes round up
Partial minutes round up
connection_minutes is the ceiling of the connection’s duration — 1.5 minutes
connected is 2 billed minutes, and 90.1 minutes is 91. There is no minimum charge
beyond this: the shortest possible connection costs one minute.Every connection is metered on its own
Every connection is metered on its own
A participant who drops and rejoins appears once per connection in the room’s
usage, each with its own
joined_at, left_at, connection_minutes and
charged_cents. The same is true of the translator, which may join and leave more
than once as languages come and go.Rounding applies per connection, not per participant, so a broken connection can
cost more than an unbroken one of the same total length. A participant who is
connected for 30 seconds, drops, and comes back for another 30 seconds is billed two
minutes — where a single unbroken minute would have been one.Silence is billed the same as speech
Silence is billed the same as speech
The meter measures connected time, not audio. A participant who is connected but not
speaking is billed for those minutes.
Totals are provisional until the room ends
Totals are provisional until the room ends
connection_minutes and charged_cents are null while a participant is still
connected. A room in progress reports what has been metered so far; its
total_connection_minutes and total_charged_cents are final once ended_at is set.
Closing a room settles the totals a moment after the call returns, once the realtime
provider confirms the room has ended — so a GET issued immediately afterwards may
still show the room as in progress.Credit, overage and the 402
Credit is money: a settled payment ofamount_cents adds exactly amount_cents to the
balance. There is no separate currency to convert.
1
Top up before you start
POST /v1/billing/checkout with an amount_cents inside the accepted range and
redirect the browser to the checkout_url it returns. Credit lands on the balance
only once the payment settles, so it may not be visible the instant the browser
comes back. Abandoning checkout changes nothing.2
Rooms require a positive balance
POST /v1/rooms returns 402 when the organization’s balance is at or below zero.
Check credit_cents before starting a call if you want to fail earlier than that.3
A call in progress is never cut off
Once a room is running it keeps running, so usage past zero is billed as overage and
the balance can go negative. What a negative balance blocks is starting the next
room.
Reading back what you were charged
Three endpoints answer three different questions.Per room
GET /v1/rooms/{room_id} returns the room with a per-participant breakdown — who
joined, when they left, their minutes and their charge.Over time
GET /v1/usage/overview returns totals and a bucketed series for a window of up to
90 days, for charting.Line by line
GET /v1/billing/movements returns every credit bought and spent, newest first, with
the purchase or room behind each one.cURL
Response
A room is a billing record and outlives the call it measured. Closing a room does not
delete its usage — the record stays available on
GET /v1/rooms/{room_id} with its
final status, minutes and charge.Reconciling the numbers
- A room’s total equals the sum of its participants’
charged_cents, including the translator’s — each already rounded up to the whole minute, so the total is not the room’s raw duration times a rate. total_minutesin a usage overview sums billed connection minutes across participants and includes the translator’s minutes.total_participantscounts the people who connected — a participant who drops and rejoins counts twice, and the translator is not counted, even though its minutes are.avg_room_minutesin a bucket is the mean wall-clock length of rooms that started in that bucket and have finished. It is not proportional tominutes, which is a per-participant sum.- Balance is a level rather than a total over a window, so it is not part of a usage
overview — read it from
GET /v1/billing/credit.
Keeping costs down
- Close rooms explicitly.
DELETE /v1/rooms/{room_id}disconnects everyone, the translator with them, and stops the meter. It is a no-op on an already-ended room and still returns204, so a retry on the way out is safe. - Don’t hold a room open between calls. Rooms are cheap to create — create one per conversation rather than parking an idle one.
- Avoid churning connections. Every connection is rounded up on its own, so a client that reconnects repeatedly pays a whole minute each time. Keep one stable connection per participant for the life of the call.
- Remember the translator’s rate. A room with two languages present is paying for the translator as well as the people in it, so idle time with both languages connected is the most expensive kind of idle time.
- Watch usage per bucket.
GET /v1/usage/overviewathourgranularity makes an unexpected overnight room obvious.
Close a room
Stop the meter as soon as the conversation is over.
Billing endpoints
Credit balance, top-up checkout, and credit history.