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
Catalog
9 games live, 7 more on the way
72,381 cards and 202,327 printings across 11 languages, all behind one endpoint.
Pokémon
The Pokémon Company
- Cards
- 4,158
- Sets
- 174
- Languages
- 5
Magic
Wizards of the Coast
- Cards
- 37,158
- Sets
- 955
- Languages
- 11
One Piece
Bandai
- Cards
- 1,422
- Sets
- 64
- Languages
- 5
Yu-Gi-Oh!
Konami
- Cards
- 14,010
- Sets
- 661
- Languages
- 1
Lorcana
Ravensburger
- Cards
- 2,476
- Sets
- 23
- Languages
- 5
SW: Unlimited
Fantasy Flight Games
- Cards
- 2,178
- Sets
- 10
- Languages
- 5
Digimon
Bandai
- Cards
- 1,915
- Sets
- 66
- Languages
- 3
Grand Archive
Weebs of the Shore
- Cards
- 2,478
- Sets
- 63
- Languages
- 1
Dragon Ball Super
Bandai
- Cards
- 6,586
- Sets
- 121
- Languages
- 1
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.
▍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.
| Black LotusMagic · Limited Edition Alpha | rare | €33,768cardmarket |
| Monkey.D.LuffyOne Piece · CARRYING ON HIS WILL | SEC | €23,228cardmarket |
| Black LotusMagic · Limited Edition Beta | rare | €22,454cardmarket |
| Mox SapphireMagic · Limited Edition Alpha | rare | €20,090cardmarket |
| Mox JetMagic · Limited Edition Alpha | rare | €19,328cardmarket |
| TimetwisterMagic · Limited Edition Alpha | rare | €19,126cardmarket |
| Ancestral RecallMagic · Limited Edition Alpha | rare | €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.
| Capability | TCGGraph | Single-game APIs | Scraping it yourself | Marketplace APIs |
|---|---|---|---|---|
| Covers more than one game | ||||
| Consistent schema across games | ||||
| GraphQL | ||||
| Typed game-specific stats | ||||
| Price history | Daily since 2024 | 90 days | ||
| Localized printings, linked to the English card | 11 languages | |||
| Image CDN with resizing | ||||
| Webhooks on new sets and spoilers | ||||
| Whole catalog readable, no application | Paged, 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.
First-party typed SDKs for those four languages are in progress and are not published yet.
Generate a clientconst 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.
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
Growth
PopularFor 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
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
| Card lookup by id | REST or GraphQL, any game | 1 credit |
| Search or filter | Per page of up to 100 results | 2 credits |
| Card with price history | Includes the full daily series | 3 credits |
| Set or catalog listing | Sets, formats, rarities | 1 credit |
| Image delivery | Never metered, on any plan | Free |
| Cached response (304) | Send If-None-Match and pay nothing | Free |
| Webhook delivery | Never metered; price watches are capped per plan instead | Free |
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
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.































