Skip to main content
Glot bills for connected minutes, paid from a prepaid credit balance. Nothing is charged for creating a room, minting join tokens, or calling the REST API — you pay for the time participants and the translator spend connected to a room.

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:
Each connection’s minutes are rounded up to the whole minute: a participant connected for 1.5 minutes is billed for 2, and a 10-second connection is billed for 1. 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 at 14: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_minutes is 28. Adding a third person to the same call would add their minutes on top, not spread the room’s 10.
Because metering is per participant, leaving a client connected to a room after the conversation is over keeps accruing minutes. Close the room with DELETE /v1/rooms/{room_id} rather than relying on participants to disconnect or on their join tokens to expire.

What counts as a connected minute

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.
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.
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.
The meter measures connected time, not audio. A participant who is connected but not speaking is billed for those minutes.
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 of amount_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.
A room’s per-participant breakdown is the authoritative account of a single call:
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_minutes in a usage overview sums billed connection minutes across participants and includes the translator’s minutes.
  • total_participants counts 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_minutes in a bucket is the mean wall-clock length of rooms that started in that bucket and have finished. It is not proportional to minutes, 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 returns 204, 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/overview at hour granularity 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.