Skip to content
Prepaid, no subscription trap. Top up a balance and we draw the monthly fee from it.
tcggraph

REST reference

The primary interface. Predictable URLs, plain JSON, and one filter grammar that works the same way for every game.

Base URL

https://api.tcggraph.com/v1

The API is versioned by date. The current version is 2026-08-01, pinned per key and overridable with the TCGGraph-Version header. Breaking changes never land on an existing version.

Endpoints

MethodPathDescription
GET/v1/gamesList every supported game with counts and metadata.
GET/v1/games/{slug}Retrieve one game, including its schema declaration.
GET/v1/setsList sets, filterable by game, series and release window.
GET/v1/sets/{code}Retrieve one set and its card list.
GET/v1/cardsQuery cards with cross-game and game-specific filters.
GET/v1/cards/{id}Retrieve a single card with all printings.
GET/v1/cards/searchFull-text and fuzzy search across all games.
GET/v1/prices/{cardId}Current prices across every tracked marketplace.
GET/v1/prices/{cardId}/historyDaily price history with range and interval.
POST/v1/bulk/exportsRequest a full-catalog export in JSON, NDJSON or Parquet.
POST/v1/webhooksRegister a signed webhook endpoint.
GET/v1/webhooksList registered endpoints and their delivery health.
GET/v1/webhooks/{id}Retrieve one endpoint with its recent delivery attempts.
DELETE/v1/webhooks/{id}Remove an endpoint and stop its deliveries.
POST/v1/watchesWatch a card for a price threshold, in one market.
GET/v1/watchesList price watches and the plan's remaining allowance.
DELETE/v1/watches/{id}Stop watching a price.

Filtering

Filters are query parameters. Anything that is not a reserved parameter is matched against gameData, so game-specific filters need no special syntax.

# Cross-game filters
?game=pokemon              # restrict to one game
?name=charizard            # case-insensitive substring
?text=discard              # search rules text
?rarity=Rare+Holo          # exact rarity match
?set=151                   # set code or name
?artist=miki+kudo          # illustrator
?minPrice=50&maxPrice=500  # market price band
?source=cardmarket         # price filters read the EU market, in EUR
?region=EU                 # same thing, without naming a vendor

# Game-specific filters map straight onto gameData
?game=pokemon&hp=330&types=Fire
?game=yugioh&attribute=LIGHT&atk=3000
?game=disney-lorcana&ink=AMETHYST&inkable=false

Every card returns every quote it has regardless of source. What that parameter changes is which quote the price filters and the price sort read from, and the bounds are in that source’s currency — source=cardmarket&minPrice=50 means €50, not $50. The price reference covers both markets in full.

Pagination and sorting

?page=2&limit=50        # limit maxes out at 100
?sort=-price            # name, price, released; prefix - to reverse

Response shape

{
  "data": [ /* Card objects */ ],
  "meta": {
    "page": 1,
    "limit": 20,
    "totalCount": 137,
    "totalPages": 7,
    "hasMore": true,
    "priceSource": "cardmarket"
  }
}

meta.priceSource echoes back which market the price filters ran against, which is worth asserting on in tests. A USD sort when you meant a EUR one surfaces as a mildly wrong list rather than an error.

Core card fields

Present on every card in every game.

FieldTypeDescription
idStringGlobally unique, stable card identifier.
gameEnumWhich game the card belongs to.
nameStringCard name as printed.
setObjectSet object: code, name and releasedAt.
collectorNumberStringNumber printed on the card.
rarityStringPublisher rarity, normalised per game.
artistStringIllustrator credit.
textStringPrimary rules text, plain-text normalised.
imagesObjectsmall, normal and large URLs on the TCGGraph CDN, in AVIF and WebP.
hashesObjectPerceptual hashes of the artwork — a 64-bit luma phash and a 192-bit phashColor — for matching a photo to a printing. Null until the art is processed.
prices[Object]Per-source, per-finish pricing, retail and buylist, with timestamps.
legalitiesObjectFormat legality map for the card's game.
externalIdsObjectcardmarketId and tcgplayerId, for joining to a marketplace. REST only.
gameDataObjectThe game-specific payload. Typed per game in GraphQL.

Game-specific fields

Each game declares its own gameData shape. The per-game reference pages list every field: