Developers
Quickstart, plans and quotas, error codes, a sample record and the full API reference for carstandings.com's data.
Quickstart
Every launched market and model year is free to browse with no account — but reading needs one (access-model-v2, 2026-09-22). This returns the whole market, identity and the public set only, for anyone:
curl https://api.carstandings.com/api/v1/market?country=us&year=2025This car is one of the ten most-registered nameplates that model year, so it comes back in full with no account and no daily limit at all — this is the one part of the catalogue genuinely open to everyone:
curl https://api.carstandings.com/api/v1/car?make=Toyota&model=RAV4&country=us&year=2025Any other car returns the public set only, like the market list, until you call it with a signed-in session:
curl https://api.carstandings.com/api/v1/car?make=Toyota&model=GR86&country=us&year=2025A free account (no key — just a signed-in browser session) reads five different cars in full every day, reset at 00:00 UTC; a reload or a re-read of one of those five is free, however many times — only a NEW car spends one, and the response's reads_left_today counts down when it does. A Data or API session has no daily figure to spend. Add X-API-Key: cs_live_<your key> once you are on the api plan for the derived endpoints and the daily bulk record — for example, comparing two makes:
curl -H "X-API-Key: cs_live_<your key>" "https://api.carstandings.com/api/v1/compare?country=us&year=2025&make=Toyota&make=Honda"Plans and quotas
| Plan | Price | What it includes | Access |
|---|---|---|---|
| Free | $0 | Every car's public figures, browsing with no account; the ten most-registered models in full with no account; any other car in full, 5 a day, with a free account | No key |
| Data | $15/mo | Every car in full, no daily limit; the whole dataset, downloaded from your account page (JSONL or CSV), 25 downloads a day | No key — session only |
| API | $75/mo | Everything in Data, plus an API key: 1,000 requests a day, /api/v1/compare, /api/v1/manufacturer, /api/v1/vin | cs_live_… key |
Two different quotas share this API, and they are not the same thing. The FREE ACCOUNT's daily car-page quota (5 full reads a day, reset at 00:00 UTC) is carried on the response itself — reads_left_today counts down, and quota_exhausted turns true on the day's sixth car — and is never a 429: the response is always 200, with the same public set a signed-out reader sees. The API PLAN's request-rate cap (1,000 requests a day per key) is the usual kind: a keyed response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until it resets), and a request past the cap is 429 with an additional Retry-After. GET /api/v1/usage (with your key) answers the same numbers on demand. Neither quota applies to a Data or API session reading cars: both plans read every car, every day, with no limit.
Error codes
Every refusal answers JSON with an error sentence for a person, a stable code to switch on, and this page's own URL in docs_url.
| code | status | Meaning |
|---|---|---|
invalid_api_key | 401 | The X-API-Key header is missing, mistyped, or was never issued. |
api_key_revoked | 401 | The key was issued and then turned off (a rotation, or a lapsed subscription). |
authentication_required | 403 | This endpoint needs a signed-in session or an API key, and got neither. |
plan_required | 403 | Signed in (or keyed), but on a plan that does not include this. |
sort_not_listed | 400 | GET /api/v1/market was asked to order by a figure outside the public set (horsepower, weight, warranty, complaint_rate, price); the list carries the public set only, for every caller. valid_sorts names the sorts it does serve; the figure itself is read per car at /api/v1/car. |
rate_limit_exceeded | 429 | The calling key's daily request cap is used up; see Retry-After and RateLimit-Reset. |
A free account's daily car-page quota is not on this table: reading past today's five is not a refusal, and answers 200 with quota_exhausted: true and the public set, not a code from here. See "Plans and quotas" above.
Attribution
Some data is published under a licence that makes an acknowledgement a condition of reuse. Any response carrying such data includes an attribution array of sentences to reproduce verbatim wherever you publish the data or anything derived from it, and an X-Data-Attribution header naming the datasets they are owed for. See /sources/#licences for what each obligation is and why. A response that owes nothing carries no attribution field — that is not permission to claim one.
A sample record
Signed out, a car that is not one of the ten most-registered nameplates:
{
"car": {
"make": "Toyota", "model": "GR86", "variant": "Base", "year": 2025, "country": "us",
"teaser": false,
"published_figures": { "fuel_economy": 24, "co2": 371 },
"figure_provenance": {
"fuel_economy": { "publishers": ["EPA"], "sources": ["epa"], "unit": "mpg",
"basis": { "configuration": "GR86 6MT", "cycle": "combined" } }
},
"figures_withheld": { "horsepower": { "reason": "requires_account" } },
"figures_requiring_account": 7
},
"country": "us", "year": 2025
}A signed-in free account that has already read five cars in full today, asking for a sixth — even one of the ten most-registered nameplates, which a signed-out caller would still read in full:
{
"car": {
"make": "Toyota", "model": "RAV4", "variant": "Hybrid", "year": 2025, "country": "us",
"teaser": true,
"published_figures": { "fuel_economy": 39, "co2": 224 },
"figures_withheld": { "horsepower": { "reason": "requires_account" } },
"figures_requiring_account": 7
},
"country": "us", "year": 2025,
"reads_left_today": 0,
"quota_exhausted": true
}One line of a bulk download's figure records (see /developers/#bulk-sample):
{"record":"figure","car_id":"us-2025-toyota-rav4-hybrid","figure":"fuel_economy","label":"Fuel economy","unit":"mpg","value":39,"status":"measured","publishers":["EPA"],"sources":["epa"],"basis":{"configuration":"RAV4 HYBRID AWD"},"absent_reason":null,"absent_detail":null}Field list
In plain words; the OpenAPI reference below has the exact shape.
Identity
- Make, model, variant, model year and market
- A stable id for the car, used to join a bulk file's car and figure records
- Whether this nameplate is one of the market-year's ten most-registered — open to everyone with no account, on every powertrain of that nameplate
Measured figures
- A raw value, present only where a publisher measured that quantity for that car
- Its unit, its publisher and the basis it was measured on
- For an absent figure: which of the four reasons on /sources/ applies, or that a free account (or reading past today's five) would show it
Reading in full
- How many of today's five free car pages a signed-in free account has left, reset at 00:00 UTC — absent when signed out or on a Data/API session
- Whether today's five are spent, on this response — a 200, never an error
Ordering
- The one figure a list is ordered by, and the one claim that ordering makes
- How many cars carry that figure, and how many do not
Attribution
- The acknowledgements a response's data obliges you to reproduce, verbatim
- Which datasets each acknowledgement is owed for