Credits & limits

One commercial currency across the platform: per-family rates, plan allowances, live budget headers, and what happens at the edge.

Everything commercial on the platform is denominated in credits — one currency across every route group, REST and MCP alike. A request's price depends on what it answers, not how many bytes it moves: registry reads are cheap, identity and market answers cost more.

The posted card below is version 5, as of 2026-07-27, in USD. It is what you are charged today. GET https://api.cardog.app/v2/pricing is the authoritative copy — this page renders from the same module that endpoint serves, and version is monotonic, so pin it if you price off our prices.

The rate card

FamilyUnitCreditsWhat it covers
vinper vin2Identity decode; batch = N units (one per VIN decoded).
entitiesper request1Registry browse/resolve/dereference.
specsper request1Catalog + spec sheets.
listingsper request1Search, count, facets, detail.
instrumentsper request5Symbology + instrument cards.
quotesper request5The live book (multi-quote = one request).
tapeper request5Prints + daily bars.
recallsper vin5The authoritative per-VIN recall check — Transport Canada + NHTSA fused.
recallsper request1Recall entity/feed/stats reads (non-VIN).
safetyper request1NCAP ratings + ODI complaints, keyed by model-year ref.

Rates are per unit, and most units are one request. The exceptions meter per VIN: batch decode charges one vin unit per VIN decoded (a failed row costs nothing), and the recalls VIN check prices the compliance answer, not the transport.

Plans

PlanPriceCredits / monthPast the allowance
Free$0/mo50Hard stop (402)
Starter$30/mo1,000Billed overage ($0.05/credit)
Pro$100/mo5,000Billed overage ($0.04/credit)
Business$500/mo25,000Billed overage ($0.03/credit)
EnterpriseCustomCustomBilled overage (contract rate)

Two laws worth internalizing:

  • Paid tiers are never blocked. Past the allowance, requests keep working and the excess is billed as overage. A production integration does not fall over because a month ran long.
  • The free tier hard-stops. At the allowance, metered requests return 402 insufficient_credits until the month resets or you upgrade. It is an evaluation tier, not a production tier.

The budget headers

Every metered response carries the live state of your budget:

  • X-Credits-Rate
  • X-Credits-Remaining
  • X-Credits-Allowance
  • X-Credits-Reset
  • X-Credits-Source

X-Credits-Rate is what this response cost (0 on non-2xx — errors are free). One deliberate exception: 304 Not Modified on a conditional request is debited at the route's rate — "unchanged as of now" is a served answer, priced the same as the 200 it stands in for. X-Credits-Remaining counts down against the allowance; -1 in Allowance/Remaining means a custom plan that is not capped here. X-Credits-Reset is when the month rolls over.

A worked sequence

A fresh free-tier key (50-credit allowance). First, a VIN decode — 2 credits:

bash
curl -i "https://api.cardog.app/v2/vin/1HGCM82633A123456" -H "x-api-key: $CARDOG_API_KEY"
http
X-Credits-Rate: 2
X-Credits-Allowance: 50
X-Credits-Remaining: 48
X-Credits-Reset: 2026-08-01T00:00:00.000Z

Then a listings search (1 credit) and a market quote (5 credits):

http
X-Credits-Rate: 1
X-Credits-Allowance: 50
X-Credits-Remaining: 47
X-Credits-Reset: 2026-08-01T00:00:00.000Z
http
X-Credits-Rate: 5
X-Credits-Allowance: 50
X-Credits-Remaining: 42
X-Credits-Reset: 2026-08-01T00:00:00.000Z

Read the headers as you go and you can budget mid-task — "spend at most 20 credits answering this" is computable without a single extra call.

The free-tier stop

At the allowance, the free tier answers 402 with the standard error envelope — and the budget headers, so even the refusal tells you when the month resets:

Example

4 keys
"response": {
"code": "insufficient_credits",
"message": "Monthly credit allowance (50) exhausted. Resets 2026-08-01T00:00:00.000Z.",
"hint": "Buy a credit pack (any tier — POST /account/credit-packs/checkout) or upgrade at https://cardog.app/pricing — paid tiers convert the stop into billed overage. Rates, allowances, and packs: GET /v2/pricing",
"docs_url": "https://cardog.app/docs/errors/insufficient_credits.md"
}

One thing to plan for: your remaining balance is cached for up to a minute, so a fast burst can cross the allowance before the stop catches it. Those requests are charged. The stop then lands on the very next request — the overshoot is one request in practice, and never more than a minute's worth.

Budget like a machine

GET https://api.cardog.app/v2/pricing returns this entire card — rates, plans, header names — as JSON, no auth required. If you are an agent (or writing one), read it at integration time and again before long tasks; never hardcode a rate. The card carries a monotonic version so you can detect change.