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

# Billing

> How the Enhanced Radar API charges your balance in US dollars: what each route and live topic is charged for, when a request is charged, account tier limits, and refusals.

The Enhanced Radar API charges data in US dollars to the balance of the organization that owns the API key. This page explains which routes and live topics are charged, when a charge happens, and what happens when the balance runs out. Prices are listed on [Pricing](https://enhancedradar.com/docs/api/docs/api/pricing.md) and returned by [`GET /api/v0/pricing`](https://enhancedradar.com/docs/api/docs/api/api-reference/pricing), which is free to call.

## How a charge works

* Each charged item has a `priced_item` name and a price in US dollars, listed by [`GET /api/v0/pricing`](https://enhancedradar.com/docs/api/docs/api/api-reference/pricing).
* A request is charged all at once, after its data is loaded and before it is returned.
* When the charge is refused, the request returns `402` or `403`, nothing is returned, and nothing is charged. See [Refusals](#refusals).
* A request that fails for another reason, such as `400`, `404`, or `5xx`, is not charged.
* A charge is final once it is recorded. If the connection fails after that, the charge is not reversed, and retrying the request can be charged again.
* Every REST response carries `X-Charged-Usd`, what the request actually cost in US dollars with three decimal places, e.g. `0.030`. Free routes, empty transcript or PIREP results, a flight status whose `status` is `null`, and refused requests report `0.000`.
* When a request was billed, its response also carries `X-Balance-Usd`, the organization's balance after the charge, in the same format, e.g. `987.650`. It is omitted when no balance was loaded.

To see the charge for any request, print the response headers:

```bash theme={null}
curl -s -D /dev/stderr -o /dev/null -H "Authorization: Bearer $ER_API_KEY" \
  "https://api.enhancedradar.com/api/v0/transcripts/29e13bdf-08fa-4e44-87a5-ed81a17919a7"
```

## Receipts on the live WebSocket and MCP

* **Live WebSocket:** each `update` message reports `charged_usd`, what that message cost, and, when it was billed, `balance_usd`, the balance after it. Both are strings in US dollars with three decimal places, e.g. `"0.150"`. A first `flight_status` update whose `status` is `null` reports `"0.000"` without `balance_usd`. The WebSocket upgrade response does not report the cost of later updates. See [Connect](https://enhancedradar.com/docs/api/docs/api/api-reference/live/connect.md).
* **MCP:** each tool result reports the same `charged_usd` and `balance_usd` fields in `_meta.billing` and in an additional JSON text content block. Free tools and failed tool calls report `charged_usd` `"0.000"` without a balance. See [MCP server](https://enhancedradar.com/docs/api/docs/api/guides/mcp.md).

## What is charged

| Route or topic | Charged for | `priced_item` |
| - | - | - |
| [`GET /api/v0/transcripts`](https://enhancedradar.com/docs/api/docs/api/api-reference/transcripts/list) | Each transcript returned. | `transcript` |
| [`GET /api/v0/transcripts/{audio_sample_id}`](https://enhancedradar.com/docs/api/docs/api/api-reference/transcripts/get) | The transcript. | `transcript` |
| [`GET /api/v0/transcripts/{audio_sample_id}/audio`](https://enhancedradar.com/docs/api/docs/api/api-reference/transcripts/audio) | Each audio link. The rate steps up with the number of audio links charged to the organization in the calendar month (UTC). | `transcript_audio` |
| [`GET /api/v0/events`](https://enhancedradar.com/docs/api/docs/api/api-reference/events/search) | Each search, even when nothing matches, plus each event returned. | `event_query_page`, `event_pull` |
| [`GET /api/v0/events/{event_id}`](https://enhancedradar.com/docs/api/docs/api/api-reference/events/get) | The event. | `event_pull` |
| [`GET /api/v0/flights/status`](https://enhancedradar.com/docs/api/docs/api/api-reference/flights/status) | The status. Free when `status` is `null`. | `flight_status_update` |
| [`GET /api/v0/airports/status`](https://enhancedradar.com/docs/api/docs/api/api-reference/airports/status) | The status. | `airport_status_update` |
| [`GET /api/v0/pireps`](https://enhancedradar.com/docs/api/docs/api/api-reference/pireps/search) | Each PIREP returned. | `pirep` |
| [`POST /api/v0/answers`](https://enhancedradar.com/docs/api/docs/api/api-reference/answers/create) | Each record reviewed, with a minimum of 300 per answer. | `answer_record` |
| Live [`transcripts`](https://enhancedradar.com/docs/api/docs/api/api-reference/live/transcripts) | Each update sent. | `transcript` |
| Live [`events`](https://enhancedradar.com/docs/api/docs/api/api-reference/live/events) | Each update sent: the first report and each later update of an event. | `event_push` |
| Live [`flight_status`](https://enhancedradar.com/docs/api/docs/api/api-reference/live/flight-status) | Each update sent, including the first. | `flight_status_update` |
| Live [`airport_status`](https://enhancedradar.com/docs/api/docs/api/api-reference/live/airport-status) | Each update sent, including the first. | `airport_status_update` |
| Live [`pireps`](https://enhancedradar.com/docs/api/docs/api/api-reference/live/pireps) | Each update sent. | `pirep` |

These routes are free: `GET /health`, `GET /api/v0/docs`, `GET /api/v0/pricing`, `GET /api/v0/facilities`, `GET /api/v0/facilities/search`, and `GET /api/v0/airlines`. Opening a live connection and subscribing are free, except for the first update of `flight_status` and `airport_status`.

## Common cases

> [accordion] Empty results
>
> A transcript list or PIREP search that returns nothing costs nothing. An event search always costs one `event_query_page`, even when no event matches. A flight status whose `status` is `null` is free: `X-Charged-Usd` is `0.000` and `X-Balance-Usd` is omitted.

> [accordion] Requesting the same data again
>
> Every request is charged for what it returns, even if an earlier request returned the same transcript, event, or status. Store what you need instead of fetching it again.

> [accordion] Events with updates
>
> `GET /api/v0/events` and `GET /api/v0/events/{event_id}` return an event with all its updates nested in it, charged as one `event_pull`. The live `events` topic sends the event again each time it is updated, and each message is charged as one `event_push`.

> [accordion] First update of a subscription
>
> Subscribing to `flight_status` or `airport_status` sends the current status right away, and that first update is charged when you subscribe. For `flight_status` it is free when `status` is `null`. Other topics send nothing until new data arrives.

> [accordion] Reconnecting
>
> Subscriptions end when the connection closes. Subscribing again after a reconnect sends, and charges, a new first update for `flight_status` and `airport_status`.

> [accordion] Audio links
>
> Each call to `GET /api/v0/transcripts/{audio_sample_id}/audio` is charged, including a new link for a transmission whose earlier link expired. The rate per link depends on how many links the organization has been charged for this calendar month (UTC); see `price_bands` in the pricing response.

> [accordion] Answers
>
> An answer is charged for the records it reviewed, at least 300 and at most its `record_limit`. A failed answer (`502`), including one whose client disconnected before the response, is not charged. Retrying a request starts a new answer and is charged again. See [Create answer](https://enhancedradar.com/docs/api/docs/api/api-reference/answers/create.md).

## Account tiers

Each organization is in an account tier chosen by the age of its account and the total it has paid. A tier can limit how many of an item the organization may be charged for, either in total over the life of the account or per calendar month (UTC). [`GET /api/v0/pricing`](https://enhancedradar.com/docs/api/docs/api/api-reference/pricing) lists the tiers, what qualifies an organization for each, and their limits.

## Refusals

| Status | When |
| - | - |
| `402` | The organization's balance does not cover the request. `error` says how much was needed and how much is available, in US dollars, e.g. `insufficient balance: this needs $0.050 and $0.020 is available`. |
| `403` | The charge would go over a limit of the organization's account tier (`error` starts with `account tier limit reached`), or the key is not owned by an organization. |

On the live WebSocket, a refused charge for an update ends that subscription. The server sends `unsubscribed` with an `error` that says why, and no `request_id`. A refused charge for the first update of `flight_status` or `airport_status` is answered with an `error` message instead of `subscribed`. See [Connect](https://enhancedradar.com/docs/api/docs/api/api-reference/live/connect.md).

Add funds in the [dashboard](https://api.enhancedradar.com).


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