Skip to content
pokemontcgapi.com

Graded card price API

PSA, BGS and CGC graded Pokémon card prices over an API

A PSA 10 and a PSA 8 of the same card are different objects with different markets. The API prices them as separate rows, each naming the grading company, the grade, the source and whether the figure is a guide median or an asking price.

Companies
PSA, BGS, CGC, SGC, ACE, TAG
Shape
One row per company and grade, grading: { company, score }
Sources
PriceCharting (guide medians), eBay (asking)
Plan
Growth and above

A single "market price" describes neither a raw near-mint copy nor a slabbed gem-mint one. So graded figures never get folded into the raw price: they are rows of their own, with grading.company and grading.score filled in, and the composite EUR index deliberately excludes them. On an old, valuable card the graded rows are most of the response.

Two sources feed them, and they measure different things. PriceCharting rows are guide medians built on sales history, basis: "GUIDE", variant MEDIAN_GRADED. eBay rows are medians of what sellers are currently asking for a given company and grade, basis: "ASKING". Both are in USD. Keep them apart in your UI: an asking median runs above a sold median, and mixing them overstates a collection.

One call, and what comes back

The price rows of one card. With a Growth key the same response also carries the graded rows, with `grading` filled in; below that they are withheld and `meta.withheld` says `graded`.

GET/v1/cards/{id}/prices2 credits · from Trialfull reference
curl -s "https://api.pokemontcgapi.com/v1/cards/base1-4/prices" \
  -H "X-Api-Key: $PTCG_API_KEY"
response.json
{
  "data": {
    "card_id": "base1-4",
    "index": {
      "eur": 556.23,
      "as_of": "2026-09-02",
      "sample_n": 16,
      "by_locale": [
        {
          "locale": "en",
          "printing": null,
          "eur": 556.23,
          "as_of": "2026-09-02",
          "sample_n": 16
        },
        {
          "locale": "fr",
          "printing": null,
          "eur": 900.58,
          "as_of": "2026-09-02",
          "sample_n": 3
        },
        {
          "locale": "de",
          "printing": null,
          "eur": 399.95,
          "as_of": "2026-09-02",
          "sample_n": 5
        },
        {
          "locale": "es",
          "printing": null,
          "eur": 1313.14,
          "as_of": "2026-09-02",
          "sample_n": 8
        },
        {
          "locale": "it",
          "printing": null,
          "eur": 400.64,
          "as_of": "2026-09-02",
          "sample_n": 11
        }
      ]
    },
    "quotes": [
      {
        "source": "CARDMARKET",
        "variant": "LOW",
        "basis": "ASKING",
        "amount": 599.9,
        "currency": "EUR",
        "locale": "en",
        "condition": "NEAR_MINT",
        "printing": null,
        "grading": null,
        "as_of": "2026-09-01",
        "sample_n": null,
        "provenance": "Cardmarket"
      },
      {
        "source": "CARDTRADER",
        "variant": "LOW",
        "basis": "ASKING",
        "amount": 1250.64,
        "currency": "EUR",
        "locale": "en",
        "condition": "NEAR_MINT",
        "printing": null,
        "grading": null,
        "as_of": "2026-09-01",
        "sample_n": 4,
        "provenance": "CardTrader"
      },
      {
        "source": "TCGPLAYER",
        "variant": "LOW",
        "basis": "GUIDE",
        "amount": 510,
        "currency": "USD",
        "locale": "en",
        "condition": null,
        "printing": "HOLOFOIL",
        "grading": null,
        "as_of": "2026-07-30",
        "sample_n": null,
        "provenance": "TCGplayer"
      },
      {
        "source": "EBAY",
        "variant": "MEDIAN_GRADED",
        "basis": "ASKING",
        "amount": 400,
        "currency": "USD",
        "locale": "en",
        "condition": null,
        "printing": null,
        "grading": {
          "company": "PSA",
          "score": "1"
        },
        "as_of": "2026-08-26",
        "sample_n": 7,
        "provenance": "eBay"
      },
      {
        "source": "PRICECHARTING",
        "variant": "MEDIAN_GRADED",
        "basis": "GUIDE",
        "amount": 20061.4,
        "currency": "USD",
        "locale": "en",
        "condition": null,
        "printing": null,
        "grading": {
          "company": "PSA",
          "score": "10"
        },
        "as_of": "2026-08-24",
        "sample_n": null,
        "provenance": "PriceCharting"
      }
    ]
  },
  "meta": {
    "quotes": 5,
    "delayed_hours": 0
  }
}

Why it starts at the Growth plan

Graded quotes, the complete price history and the movers feed are what a serious valuation or analytics product is built on, and they come together with Growth (€79/month, 200,000 credits a month). On the trial and on Developer the raw-card rows are complete and the graded ones are named as withheld, so you can build the whole integration first and switch the plan when the graded view ships.

Reading a slab into your app

Filter with ?variant=MEDIAN_GRADED for the guide medians, or take every row and group by grading.company and grading.score. Scores are strings, not numbers, because half grades exist. The valid companies are listed by GET /v1/reference under grading_companies, so a dropdown never offers a company the data does not know.

What it is not

Read this before you build on it. Every line here is a support ticket somebody else already opened.

eBay figures are asking prices
They are what sellers want today for that company and grade, not completed sales. The row says so in basis.
Not every card, not every grade
Graded rows exist where the sources publish them: deep on vintage and chase cards, sparse or absent on bulk. An empty result on a Growth key means no data, and meta.withheld will be absent to confirm it.
USD only
Both graded sources publish in dollars. Nothing is converted.

Questions people ask before signing up

Can I get PSA 10 prices for Pokémon cards from an API?
Yes. Price rows carry grading.company and grading.score, so a PSA 10 is its own row, separate from PSA 9 and from the raw card. Graded rows are served from the Growth plan. Pricing
Which grading companies are covered?
PSA, BGS, CGC, SGC, ACE and TAG are the values the API knows; which of them has rows for a given card depends on what the sources publish. GET /v1/reference lists them under grading_companies.
Are graded prices based on sold listings?
PriceCharting rows are guide medians built on sales history. eBay rows are asking prices, not sold prices, and are labelled basis ASKING. The two are never merged. Price methodology
Can I test graded prices on the free trial?
The trial returns the raw-card rows and tells you graded rows were withheld, so you can build and test the parsing. The graded rows themselves need Growth.

Keep reading