Skip to content
Prepaid, no subscription trap. Top up a balance and we draw the monthly fee from it.
tcggraph
NewCardmarket prices, in EUR, on every card

One API for every trading card game

Pokémon, Magic, One Piece, Yu-Gi-Oh!, Lorcana, Star Wars: Unlimited, Digimon and Grand Archive behind one REST endpoint, with GraphQL when you want it. Priced for both markets: Cardmarket in euros next to TCGplayer in dollars, on the same card.

From $19 a month, 25,000 credits included. Top up a balance and we draw from it monthly — no contract, no minimum term.

8
games
188k
printings
38 ms
median response
99.98%
uptime, 90 days

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.

One schema, eight 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.

38 ms at the p50

Edge-cached reads from 19 regions. Cold queries hit Postgres with covering indexes; hot ones never leave the CDN.

European prices, natively

Cardmarket in EUR next to TCGplayer in USD on the same card, with trend, rolling averages and foil quoted separately. No FX guesswork for half the world's collectors.

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.

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

Market, low and trend from Cardmarket across all eight games, with TCGplayer, Card Kingdom and Mana Pool on Magic, per printing and per finish, retail and buylist.

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.

Twelve languages

Japanese, Korean, both Chinese scripts and the full European set, all linked to the same card identity so you can 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.

Versioned, never broken

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

REST first, GraphQL when useful

Hit a plain JSON endpoint from a shell script, or reach for GraphQL when one round trip should return several games. Both read the same cache.

Bulk exports, no approval

Nightly full-catalog dumps in JSON, NDJSON and Parquet from Growth up. Complete, not crippled, and nobody has to review an application first.

Prices

Real market data, per printing and per finish

Daily market, low and high from Cardmarket, TCGplayer, Card Kingdom and Manapool, going back to 2019. 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 history5 years90 days
Multi-language card text12 languages
Image CDN with resizing
Webhooks on new sets and spoilers
Bulk exports without approval
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
  • All 8 games, full card pool
  • REST and GraphQL
  • Four price sources, retail and buylist
  • Unmetered image CDN
  • Signed webhooks, deliveries never metered
  • 500 price watches
  • Daily price snapshots, kept in full
  • 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.