Price Comparison API
Price Comparison API
POST /v1/price-comparisons compares the BeatAPI price of one published pricing spec with the public prices other platforms list for the same spec. It needs no API key and is not billed.
The comparison is neutral. BeatAPI is ranked by the same rules as every other platform, and when another platform is cheaper the answer says so: beatapi_position is not_lowest.
Quick start
With only model, the model’s common configuration is compared with every platform that has a stored quote for it. Add spec to choose another configuration, and providers to choose the platforms.
Request
model and spec are each at most 200 characters. When model is empty, spec is used to find the model.
The common configuration
Without spec, one configuration is chosen by its shape, never by which platform wins:
- Text models: input tokens.
- Video models: the first 720p spec without reference video or video-to-video input.
- Image models: the first plain image spec, for example
nano-banana-pro-1k.
When model is itself a spec ID, that spec is compared.
Spec IDs
Spec IDs come from the anonymous price list: each entry of data.groups[].specs[] in GET https://api.beatapi.io/v1/pricing has an id. Every comparison also returns the model’s available_specs.
Platform IDs
Platform IDs are lowercase, as returned in quotes[].provider; beatapi is BeatAPI. When you send providers, only the listed platforms are compared, so include beatapi to rank BeatAPI. A listed platform that has no quote for this spec is returned as pending_verification. An ID the comparison table does not know is rejected with 400.
Response
A successful call returns 200 with the result in data, the same envelope as GET /v1/pricing. The response is not cached (Cache-Control: no-store).
The example below uses prices checked on 2026-11-11. Prices, dates and the data_version value change over time; call the endpoint for current figures.
How the figures in this example follow from the quotes:
- Four quotes are ranked: 0.05, 0.126, 0.1344 and 0.15. The estimate from
atlascloudand the unsupported configuration athiggsfieldare listed but not ranked. - Lowest: 0.05 (
beatapi). Second position: 0.126 (wavespeed). (0.126 − 0.05) ÷ 0.126 = 60.32%. - Mean: (0.05 + 0.126 + 0.1344 + 0.15) ÷ 4 = 0.1151. (0.1151 − 0.05) ÷ 0.1151 = 56.56%.
Top-level fields
Units
All amounts are in USD and are decimal strings, so a small price is never rounded to zero. null means there is no trustworthy price; "0" would mean free.
Quotes
A quote is ranked only when it has an amount, was checked within the last 30 days, matches the spec exactly and is not an estimate. Every other quote stays in quotes with its exclusion_reason, so you can see who was left out and why.
The BeatAPI quote is the live retail price from GET /v1/pricing, so a BeatAPI price change shows up in the next comparison. Other platforms’ prices are checked by hand against their public pages.
Summary and the four metrics
Percentages are strings with two decimal places, computed from unrounded amounts and rounded half up at the end. A metric is null when fewer than two platforms are ranked or its denominator is zero; it is never NaN. mean_amount is rounded to 8 decimal places.
When the model is ambiguous
A name that matches several models returns 200 with needs_clarification:
Send one candidate unchanged as model. An exact name, slug or spec ID always wins over a partial match, so Nano Banana Pro resolves to one model. A name that matches no model also returns needs_clarification, without model_candidates.
Errors
Errors use the standard error object. A request you must change returns 400 bad_request with a message that names the problem:
Do not resend a 400 unchanged. A 500 internal_error means the comparison could not be computed; retry once, then contact support with request_id.

