Skip to main content
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 and returned by GET /api/v0/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.
  • 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.
  • 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:

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.
  • 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.

What is charged

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

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.
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.
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.
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.
Subscriptions end when the connection closes. Subscribing again after a reconnect sends, and charges, a new first update for flight_status and airport_status.
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.

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 lists the tiers, what qualifies an organization for each, and their limits.

Refusals

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. Add funds in the dashboard.