cardtrack

CardTrack Price API

A REST API for Pokémon card valuations: 20,797 English cards and 20,900 Japanese cards, raw and graded (PSA/BGS/CGC), reblended daily. JSON in, JSON out — no SDK required.

What you can query

Games: Pokémon only — English and Japanese. Magic: The Gathering, Yu-Gi-Oh!, One Piece and Lorcana are on cardtrack.com but are not served by this API.

Per card: name, set, number, rarity, artist, image, the ungraded market value with its low/high range and confidence, a PSA 10 value where one is coherent, and the full graded ladder.

Freshness: values are reblended once a day. The catalogue behind this response was last repriced 2026-10-01. There is no intraday or real-time feed.

What the numbers are: every value is a blended market estimate derived from completed sales and marketplace data — not a single observed sold price, and not an asking price. Do not present it to your users as a transaction record. See the pricing methodology for how each figure is built.

Your API keys

Authentication

Send your key as a Bearer token, or in an x-api-key header. Keys start with ct_.

curl https://cardtrack.com/api/v1/cards?q=charizard \
  -H "Authorization: Bearer ct_live_xxx"

Rate limits

Quotas are per API key, per day (UTC), and count every request to any /api/v1 route. Each response carries a remaining field — the requests left on your key today.

  • free — 100 requests/day
  • collector — 1,000 requests/day
  • trader — 5,000 requests/day
  • investor — 25,000 requests/day

Over quota returns 429 with daily_quota_exceeded. See plans.

Endpoints

GET /api/v1/cards — search.

Params: q (matches card name or set name, case-insensitive substring), limit (1–100, default 25), sort (value default — ungraded high to low — or psa10, or name).

English only. Search does not return Japanese cards. A Japanese card can only be fetched by id on the endpoint below, so if you need to resolve Japanese cards by name you must hold your own id map.

No pagination. There is no offset or cursor: a response returns the first limit matches only.total tells you how many matched in all, count how many were returned. Narrow q to reach the rest.

GET /api/v1/cards/{id} — one card, English or Japanese, with its graded ladder.

{
  "remaining": 99,
  "card": {
    "id": "base1-4", "language": "en",
    "name": "Charizard", "set": "Base", "number": "4",
    "value": {
      "ungraded": 2146.38, "psa10": 62233.11,
      "low": 1810.00, "high": 2480.00,
      "confidence": "high", "currency": "USD"
    },
    "graded": [ { "grade": "PSA 10", "value": 62233.11 }, { "grade": "PSA 9", "value": 11052.57 } ],
    "url": "https://cardtrack.com/pokemon/card/base/charizard-4"
  }
}

A Japanese card returns "language": "ja" and an extra nameJa field. Its ungraded value may be null where we hold graded sales but no raw ones — handle that case.

Card identifiers & matching

English ids follow the set-code form base1-4 (set base1, card number 4). Japanese ids carry a _ja segment, e.g. m5_ja-114. Ids are stable; treat them as opaque strings.

Never merge records. An English card and its Japanese counterpart are separate cards with separate markets and separate prices — the same artwork is not the same product. The same applies to distinct printings and variants (holo, reverse holo, 1st edition, promo): each is priced on its own sales and must not be collapsed into one price in your application.

The confidence field is the provenance signal — how much evidence sits behind that value. Surface it rather than hiding it, and prefer not to show a headline price at all where confidence is low.

A psa10value is omitted when it fails our coherence guard (for example, a PSA 10 implausible against the raw value). Both card endpoints apply the same guard, so they never disagree. Absent means "not trustworthy", not "zero".

Errors

Errors return the HTTP status below with a JSON body of { "error": "<code>" }.

  • 401 missing_api_key — no key sent, or it does not begin ct_
  • 401 invalid_api_key — unknown or revoked key
  • 403 wrong_scope — the key is restricted to a different route
  • 404 card_not_found — no English or Japanese card with that id
  • 429 daily_quota_exceeded — the key's daily quota is spent; it resets at 00:00 UTC
  • 503 api_not_enabled — the API is temporarily unavailable; retry with backoff

Machine-readable spec

An OpenAPI 3.1 description of every endpoint above is served at /api/v1/openapi.json — point your client generator at it.

curl https://cardtrack.com/api/v1/openapi.json

What people build with it

  • Collection apps — value a user's holdings by id, refreshed daily.
  • Price trackers — store the daily value per id and chart it yourself.
  • Store inventory — price a shop's stock against the graded ladder.
  • Grading tools — compare a raw value against its PSA 10 to rank submission candidates.

Data is a blended market estimate for informational use, not a financial quote or an offer to trade. Attribution to CardTrack is appreciated.