Skip to content
Crypto-only, prepaid. Top up a balance and we draw from it monthly — nothing is ever charged automatically.
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 in crypto and we draw from it monthly — no card form, no processor, nothing charged automatically.

8
games
215k
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 seller depth. No FX guesswork for half the world's collectors.

Daily price history

Market, low and high from TCGplayer, Cardmarket, Card Kingdom and eBay sold listings, per printing and per finish, back to 2019.

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"

Card art on our CDN

Every printing is mirrored at four 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 five marketplaces, going back to 2019. Below is live catalog data — the same values the API returns.

Highest market valueTCGplayer · NM
Umbreon VMAXPokémon · Evolving Skies$2,380
Gaea's CradleMagic · Urza's Saga$1,637
CharizardPokémon · Base$868.56
Charizard exPokémon · 151$370.48
Charizard VPokémon · Brilliant Stars$299.24
Sheoldred, the ApocalypseMagic · Dominaria United$98.04
Force of WillMagic · Dominaria Remastered$60.39

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 five marketplaces in one request.

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

Price analytics

Five years of daily closes, hourly intraday snapshots on Growth, and normalised condition and finish so your charts compare like with like.

priceHistory(cardId: "pkm_me02_125", interval: DAY)

Marketplaces and shops

Full catalog exports in Parquet, plus reprint and new-set webhooks so your inventory listings never reference a stale SKU.

POST /v1/bulk/exports { format: PARQUET }

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 need Magic, use Scryfall — it is free, excellent and we are not going to pretend otherwise. TCGGraph earns its place the moment you need a second game.

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
  • Cardmarket and TCGplayer prices
  • Unmetered image CDN
  • 2 years of daily price history
  • 5 webhook endpoints
  • 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
  • Nightly bulk exports, all formats
  • All five price sources
  • Full price history, back to 2019
  • Hourly intraday price snapshots
  • Unlimited webhook endpoints
  • 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
  • Parquet exports to your own S3 bucket
  • Priority request routing
  • Dedicated regional cache
  • Redistribution licence available
  • SSO, SCIM and audit logs
  • 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
Bulk export250 credits
Image deliveryFree
Cached response (304)Free

Enterprise

Above 750,000 credits a month, or you need redistribution rights, a private catalog, bespoke ingest 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 wrote the ingest pipeline.

Ship your card app this weekend

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