> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pyai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Pricing & metering

> How PyAI meters Hear, Speak, Omni, Agents, Cast, and managed telephony.

Usage is billed against your plan and prepaid credits. This page explains what
each product meters. The live [pricing page](https://pyai.com/pricing) is the
source of truth for rates, included usage, and plan availability.

| Product | What's metered | Current pricing |
| - | - | - |
| Hear (speech-to-text) | Audio transcribed | [View pricing](https://pyai.com/pricing) |
| Speak (text-to-speech) | Audio synthesized (streaming and async) | [View pricing](https://pyai.com/pricing) |
| Clone | Enrollment and synthesized audio | [View pricing](https://pyai.com/pricing) |
| Cast (expressive voice) | Audio rendered through `/v1/cast/*` | [View pricing](https://pyai.com/pricing) |
| Dub (dubbing) | Source duration per output language; revisions use selected passages | \$0.20/source minute |
| Cue | **Unavailable.** No Cue usage is emitted | n/a |
| Omni (speech plus brain) | Realtime session duration | [View pricing](https://pyai.com/pricing) |
| Agents (managed) | Managed Omni agent duration. **Live Beta**; features and limits may change | [View pricing](https://pyai.com/pricing) |
| Telephony (managed numbers) | Carrier/PSTN duration, separate from Omni or Agents | [View pricing](https://pyai.com/pricing) |
| AMD (answering machine detection) | Answered calls | [View pricing](https://pyai.com/pricing) |
| Trace (compliance) | Scanned calls, on top of the underlying call product | [View pricing](https://pyai.com/pricing) |
| Recap (call intelligence) | Audio processed for the transcript and post-call record | [View pricing](https://pyai.com/pricing) |
| KB Context (Omni add-on) | Grounded session time when retrieval runs | [View pricing](https://pyai.com/pricing) |

<Note>
  Omni, Agents, and managed telephony use distinct meters. Check the live
  [pricing page](https://pyai.com/pricing) before forecasting a deployment.
</Note>

## The units header

Billed responses carry an `x-pyai-units` header reporting exactly what was
metered for that request, in that meter's own unit. Read it to reconcile your
own usage accounting against ours.

**Rounding differs by product, so read the header rather than your own clock:**

| Product | Header unit | Rounding |
| - | - | - |
| Hear, synchronous transcription | audio minutes | **whole minutes, rounded up, minimum 1.** A 5-second clip meters `1`. `x-pyai-audio-seconds` on the same response carries the exact duration |
| Speak, Cast | audio minutes | fractional, to the microsecond of audio (e.g. `0.064000000` for 3.84 s) |
| Omni, Agents | session minutes | fractional session duration |
| AMD | answered calls | one per answered call |

Dub bills completed generation jobs, with a one-second billing pulse. HTTP
requests, polling and exports carry zero delivery units. Read the job’s `billing`
receipt for its charged amount and source duration; downloads never add a charge.

A transcription that produced no text is never billed: it answers `200` with
`x-pyai-units: 0` and `x-pyai-transcript-empty: 1`. A failed request (`4xx` or
`5xx`) on a request-metered product bills nothing at all.

## Credits and spend caps

* Account signup creates a sandbox key. It does not guarantee promotional credit.
* Live keys consume prepaid credit. Phone verification may unlock promotional credit under the current graduated-signup rules.
* **Per-key budgets**, set a monthly spend cap on any key in the console.
* **Org credit gate**, when prepaid credit is exhausted, billed calls return
  `402` until you top up.

## Sandbox tier (no billing)

A `pyai_test_` key works instantly against production models with hard daily caps
(requests/day, concurrent sessions, audio minutes/day) and **never** touches
billing. Use it for evals and CI so a first call never hits the credit gate.
For production rates and included usage, see the
[pricing page](https://pyai.com/pricing).

## 402 semantics

A `402` means a billing limit was reached, it is **not** a broken key:

| Code | Meaning | What to do |
| - | - | - |
| `credit_exhausted` | Org out of prepaid credit | Add credit, or use a `pyai_test_` key |
| `key_budget_exceeded` | Per-key monthly cap reached | Raise the key's budget |
| `insufficient_quota` | Plan quota exhausted | Upgrade the plan |

Do not retry a `402`, the call will keep failing until the underlying limit
changes. See [Errors & limits](/errors-and-limits) for the full catalog.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.