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
Catalog
8 games live, 8 more in ingest
76,500 cards and 215,200 printings across twelve languages, all behind one endpoint.
Pokémon
The Pokémon Company
- Cards
- 19,840
- Sets
- 168
- Languages
- 12
Magic
Wizards of the Coast
- Cards
- 32,460
- Sets
- 812
- Languages
- 11
One Piece
Bandai
- Cards
- 3,180
- Sets
- 46
- Languages
- 5
Yu-Gi-Oh!
Konami
- Cards
- 13,720
- Sets
- 604
- Languages
- 9
Lorcana
Ravensburger
- Cards
- 1,720
- Sets
- 12
- Languages
- 5
SW: Unlimited
Fantasy Flight Games
- Cards
- 1,460
- Sets
- 9
- Languages
- 6
Digimon
Bandai
- Cards
- 2,940
- Sets
- 38
- Languages
- 4
Grand Archive
Weebs of the Shore
- Cards
- 1,180
- Sets
- 9
- Languages
- 3
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.
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.
| Umbreon VMAXPokémon · Evolving Skies | Rare Rainbow | $2,380 |
| Gaea's CradleMagic · Urza's Saga | Rare | $1,637 |
| CharizardPokémon · Base | Rare Holo | $868.56 |
| Charizard exPokémon · 151 | Special Illustration Rare | $370.48 |
| Charizard VPokémon · Brilliant Stars | Rare Ultra | $299.24 |
| Sheoldred, the ApocalypseMagic · Dominaria United | Mythic | $98.04 |
| Force of WillMagic · Dominaria Remastered | Mythic | $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.
| 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 | 5 years | 90 days | ||
| Multi-language card text | 12 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.
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
- 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
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
- 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
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
| 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 |
| Bulk export | Per game, per download | 250 credits |
| Image delivery | Never metered, on any plan | Free |
| Cached response (304) | Send If-None-Match and pay nothing | 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
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.