Skip to content
Prepaid, no subscription trap. Top up a balance and we draw the monthly fee from it.
tcggraph
NewCardmarket lows per language and condition, in EUR

One API for every trading card game

Card data, images and prices for 9 games behind one REST endpoint, with GraphQL when you want it. Cardmarket in euros next to TCGplayer in dollars, on the same card, refreshed daily.

From $19/mo for 25,000 creditsMonth to month, no contractCommercial licence included

223k
requests served, 30 days
71 ms
median response, server-side
99.999%
responses without a server error
6 hours ago
Cardmarket prices refreshed
9
games, one schema

The same query, every game

Ask for what you need. Get exactly that.

Change the game parameter and keep the code. Game-specific stats live under gameData, so your editor autocompletes Pokémon HP and Lorcana lore without you reading a wiki.

GET /v1/cardsRequest
200 OK

Live catalog data, not mock-ups. REST covers every capability; GraphQL is there for when one round trip should return several games.

What you get

Everything a card app needs, and nothing it does not

Card data is only half the job. The other half is prices, images, freshness and not being rate-limited into uselessness on launch day.

Cardmarket prices, natively

Cardmarket in EUR on the same card as TCGplayer in USD: trend, rolling averages and foil quoted separately, plus the cheapest copy per language and per condition grade, read from the listings themselves. No FX guesswork for half the world's collectors.

One schema, nine games

Shared core fields, id, name, set, rarity, artist, images, prices, legalities, with a typed gameData payload for everything that only makes sense in one game.

Scan a card, get the printing

Recognition over a socket for live camera feeds, or a photo over HTTPS. Returns the exact printing with both prices attached, and a frame we cannot place is never billed.

Latency you can check

Every request's server-side time is logged, and the median and p95 over the last 30 days are published on the status page, recomputed hourly. Queries hit Postgres with covering indexes; nothing is cached across customers, so the number is the number.

Or skip the client

Plain REST, no SDK required

Every GraphQL capability has a REST equivalent with the same filters and the same response shape.

curl https://api.tcggraph.com/v1/cards \
  -H "Authorization: Bearer $TCGGRAPH_KEY" \
  -d game=pokemon \
  -d "filter[types]=Fire" \
  -d "filter[hp][gte]=300"

Daily price history

Cardmarket in EUR on the eight games it lists and TCGplayer in USD on all nine, with Card Kingdom and Mana Pool added on Magic, per printing and per finish, retail and buylist, as a daily series back to 2024.

Card art on our CDN

Every printing is mirrored at three widths in AVIF and WebP with stable URLs, so you never hotlink a publisher and never serve a broken image.

11 languages

Japanese, Korean, both Chinese scripts, Russian and the European set, each game in the languages it is actually printed in. A localized printing is its own row, linked to the English card through englishId, so you pivot markets in one field.

Webhooks that matter

set.published, card.legality.changed and price.threshold.crossed, delivered with HMAC signatures and exponential-backoff retries.

Every printing priced, not just every card

Poké Ball and Master Ball patterns, Staff and Prerelease stamps, Shadowless and 1st Edition runs: each is its own entry in printings[] with its own picture and its own Cardmarket and TCGplayer quotes, under one closed finish list shared by both markets.

Versioned, never broken

Date-based API versions pinned per key, with a twelve-month deprecation window. Breaking changes ship behind a header, never on a Tuesday.

Prices

Cardmarket and TCGplayer, per printing and per finish

Cardmarket in EUR with the cheapest copy per language and per condition, TCGplayer in USD, Card Kingdom and Manapool on Magic. Daily market, low and high since February 2024. Below is live catalog data, the same values the API returns.

Highest market valueRetail · per printing
Black LotusMagic · Limited Edition Alpha€33,768cardmarket
Monkey.D.LuffyOne Piece · CARRYING ON HIS WILL€23,228cardmarket
Black LotusMagic · Limited Edition Beta€22,454cardmarket
Mox SapphireMagic · Limited Edition Alpha€20,090cardmarket
Mox JetMagic · Limited Edition Alpha€19,328cardmarket
TimetwisterMagic · Limited Edition Alpha€19,126cardmarket
Ancestral RecallMagic · Limited Edition Alpha€17,278cardmarket

Built for

Six kinds of app, one integration

Whatever you are building, the hard part should be your product — not reconciling six card databases that disagree about what a set code is.

Deck builders

Format legality, ban lists and rotation marks stay current, so your validator does not need a hand-maintained list of exceptions.

cards(filter: { format: STANDARD, legal: true })

Collection trackers

Resolve a printing by set code and collector number, then value the whole binder against Cardmarket, TCGplayer, Card Kingdom and Manapool in one request.

printings(setCode: "ME02", collectorNumber: "125/094")

Price analytics

A daily close per printing and finish, recorded every night and kept, so your charts compare like with like instead of whatever the marketplace showed the moment you asked.

GET /v1/prices/pkm_me02_125/history

Marketplaces and shops

Cardmarket in EUR beside TCGplayer in USD on the same card, with Card Kingdom buylist on Magic, so you can reprice against the market you actually sell on.

GET /v1/prices/mtg_0000419b-0bba

Card scanners

Perceptual hashes and art crops for every printing, so an image match resolves to the exact variant rather than just the card name.

matchByHash(phash: "f0e1c2...", game: POKEMON)

Bots and agents

A stable MCP server and OpenAPI spec mean an LLM can query the catalog directly without you writing a tool layer.

npx @tcggraph/mcp --key $TCGGRAPH_KEY

Honest comparison

When TCGGraph is the right call

If you only ever need one game and one currency, a free single-game API will do the job and we are not going to pretend otherwise. TCGGraph earns its place the moment you need a second game, a second market, or a number you can put in front of a paying customer.

How TCGGraph compares to single-game APIs, scraping and marketplace APIs
CapabilityTCGGraphSingle-game APIsScraping it yourselfMarketplace APIs
Covers more than one game
Consistent schema across games
GraphQL
Typed game-specific stats
Price historyDaily since 202490 days
Localized printings, linked to the English card11 languages
Image CDN with resizing
Webhooks on new sets and spoilers
Whole catalog readable, no applicationPaged, under 4,000 credits
Commercial use without an application
Someone to page when it breaks

No SDK required

One bearer token and the HTTP client you already have

No proprietary transport, no signing scheme, no long-lived connection. A published OpenAPI 3.1 document and GraphQL SDL mean you can generate a fully typed client in any language today.

OpenAPI 3.1GraphQL SDLTypeScriptPythonGoRust

First-party typed SDKs for those four languages are in progress and are not published yet.

Generate a client
collection.ts
const params = new URLSearchParams({
  game: "pokemon",
  hp_gte: "300",
  sort: "-price",
  limit: "25",
});

const res = await fetch(`${API}/cards?${params}`, {
  headers: { Authorization: `Bearer ${process.env.TCGGRAPH_KEY}` },
});

const { data } = await res.json();

for (const card of data) {
  console.log(card.name, card.gameData.hp, card.prices[0]?.market);
}

Pricing

Priced for side projects and for scale

Credits meter the work a query does, not the number of round trips. Plans start at $19 a month, and overage soft-lands instead of taking your app down.

Two months free on annual

Starter

For a first production app or a small store.

$19/mo

25,000

credits per month · ~12,500 searches

Daily cap
2,500 credits
Rate limit
60 req/min
Overage
$12 per 10,000
  • Raw prices from 4 markets
  • Graded prices: PSA, BGS, CGC, SGC
  • Condition prices, Mint to Poor
  • Price trends and averages
  • Full daily price history
  • Refreshed daily
  • All 9 games, full card pool
  • REST and GraphQL
  • Unmetered image CDN
  • Signed webhooks, 500 price watches
  • Commercial use licence
  • Email support, one business day
Choose Starter

Growth

Popular

For established apps and shops repricing inventory daily.

$59/mo

150,000

credits per month · ~75,000 searches

Daily cap
15,000 credits
Rate limit
300 req/min
Overage
$6 per 10,000
  • Everything in Starter
  • 6x the credits, 5x the rate limit
  • 25,000 price watches
  • Overage at half the Starter rate
  • 99.95% uptime SLA
  • Priority support
Choose Growth

Scale

For marketplaces and market-data businesses.

$149/mo

750,000

credits per month · ~375,000 searches

Daily cap
75,000 credits
Rate limit
1,000 req/min
Overage
$3 per 10,000
  • Everything in Growth
  • 5x the Growth credits, 1,000 req/min
  • 100,000 price watches
  • Our lowest overage rate
  • Redistribution licence available
  • Shared Slack channel
Choose Scale
What a credit buys
Card lookup by id1 credit
Search or filter2 credits
Card with price history3 credits
Set or catalog listing1 credit
Image deliveryFree
Cached response (304)Free
Webhook deliveryFree

Enterprise

Above 750,000 credits a month, or you need redistribution rights, a private catalog, coverage for a game we do not carry yet, or a contract your legal team wrote.

  • Volume pricing beyond the Scale tier
  • Redistribution and resale licensing
  • Custom games and private catalogs
  • Dedicated infrastructure and 99.99% SLA
Talk to us

Public open-source projects get Starter for free. See the full pricing breakdown

FAQ

Questions developers actually ask

Still stuck? The docs go deeper, and the Discord is answered by the people who built the API.

Ship your card app this weekend

$19 a month for 25,000 credits, no sales call and no contract. Pick a plan and your first query runs in under a minute.