List cards
Search and filter the catalogue. Every filter is optional and they combine with AND.
English printings only unless language says otherwise, so a card appears once per set rather than once per language.
A parameter this endpoint cannot act on is a 400, never an answer that ignores it: an unknown name, a sort or source outside its list, a limit that is not a number. details.allowed lists what would have worked. Without game, the gameData fields of every game are accepted, and a card without the field simply does not match.
Each card is the full Card object, prices included. There is no field selection over REST; GraphQL selects fields.
Query parameters
Any other query parameter is a 400 naming it and listing these, so a misspelt one is never silently ignored. api_key is accepted on every endpoint as an alternative to the header.
| Parameter | Type | Description |
|---|---|---|
| game | string | Only this game. Also narrows which gameData fields are accepted as filters.One of: Default: every game |
| name | string | Part of the English name. Case, accents and punctuation are ignored: charizard matches Charizard ex and Dark Charizard, pokedex matches Pokédex. |
| text | string | Part of the rules text, case-insensitive. |
| set | string | A set code, matched whole, or part of a set name; case-insensitive. sv3pt5 and 151 both find Pokémon's 151. |
| collectorNumber | string | The printed number. Only the part before / counts and leading zeros are ignored, so 6, 006 and 006/165 match the same card. Numbers that print a set prefix keep it (OP05-119). Parallel and reprint printings that share a printed number are stored with a suffix (OP05-119_p2); the printed number matches all of them, and a number with the suffix matches only that one. |
| rarity | string | The whole rarity, case-insensitive, as the game spells it (Double Rare, mythic, SR). |
| artist | string | The whole artist credit, case-insensitive. mitsuhiro arita matches; arita does not. |
| language | string | The printings' language, or all for every language. Case-insensitive; jp, kr and sp are read as ja, ko and es. The default is English, so a set printed only in Japanese (set=m6a) lists nothing without language=ja.One of: Default: |
| source | string | Which marketplace minPrice, maxPrice and sort=price read. Every card still returns all of its quotes. Case-insensitive. Echoed as meta.priceSource.One of: Default: |
| region | string | The same choice by market: EU is cardmarket, NA and US are tcgplayer. Case-insensitive. source wins when both are sent.One of: |
| minPrice | number | Lowest retail market price, inclusive, in the source's currency (EUR on Cardmarket). Reads the normal finish where the card has one, otherwise one of its other retail finishes. Cards with no quote on the source are excluded. |
| maxPrice | number | Highest retail market price, inclusive. Read the same way as minPrice. |
| sort | string | - for descending. price reads the quote minPrice reads; gradedPrice reads the graded slot (PSA 10 unless grader and grade say otherwise); released is the set's release date. Cards without the value sort last either way. Ties break on id, so pages are stable.One of: Default: |
| grader | string | With grade, the graded slot sort=gradedPrice orders by. Both or neither. The slots that exist: raw/ungraded, any/7, any/8, any/9, any/9.5, psa/10, bgs/10, cgc/10, sgc/10.One of: |
| grade | string | The other half of the slot. Without either, sort=gradedPrice reads PSA 10.One of: |
| {field} | string | Any gameData field the game declares (GET /v1/games/{slug} lists them as schema): types=fire, hp=330, colors=U. Case-insensitive; a list field matches when any member does; a nested field is a dotted path (banlist.tcg=forbidden). A name no game declares is a 400 naming what would have worked. |
| min{Field} / max{Field} | number | Inclusive bounds on a numeric gameData field: minHp=300, maxManaValue=2. A card without the field, or with a non-number such as *, is outside every bound. |
| page | integer | Page number, from 1. Below 1 reads as 1. A page past the end returns an empty data with hasMore: false.Default: |
| limit | integer | Rows per page, 1 to 100. Out-of-range values are clamped, not refused; meta.limit reports the size used.Default: |
Response
200 A page of cards.
| Field | Type | Description |
|---|---|---|
| data | Card[] (Card reference) | The page of cards. |
| meta | PageMeta | Paging. |
| meta.page | integer | The page returned, from 1. |
| meta.limit | integer | The page size used, after clamping to 1–100. |
| meta.totalCount | integer | Rows matching the filters, across every page. |
| meta.totalPages | integer | ceil(totalCount / limit), and at least 1. |
| meta.hasMore | boolean | Whether a later page has rows. The loop condition for paging. |
| meta.priceSource | string | The source minPrice, maxPrice and sort=price ran against: source or region if sent, else cardmarket.One of: |
Examples
Real responses from the production API, recorded on 2026-09-24 by the script that also checks every field above against them. Arrays are shown in full.
Search by name
curl "https://api.tcggraph.com/v1/cards?game=pokemon&name=charizard&limit=2" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/cards?game=pokemon&name=charizard&limit=2", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/cards",
params={
"game": "pokemon",
"name": "charizard",
"limit": "2",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": [
{
"id": "pkm_gym2_2",
"game": "pokemon",
"name": "Blaine's Charizard",
"language": "en",
"printedName": null,
"englishId": null,
"pricesFrom": "own",
"set": {
"code": "gym2",
"name": "Gym Challenge",
"language": "en",
"releasedAt": "2000-10-16"
},
"collectorNumber": "2",
"rarity": "Rare Holo",
"artist": "Ken Sugimori",
"text": null,
"images": {
"small": "https://cards.tcggraph.io/gy/pkm_gym2_2/small.webp",
"normal": "https://cards.tcggraph.io/gy/pkm_gym2_2/normal.webp",
"large": "https://cards.tcggraph.io/gy/pkm_gym2_2/large.webp"
},
"hashes": {
"phash": "eb6bc0909c8ecdc5",
"phashColor": "eb6bc0b4949fc4c4eb6ac09098aecfc5c17ac1c04be7790f"
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 752.99,
"low": 109.9,
"trend": 752.99,
"avg1": 109.89,
"avg7": 829.96,
"avg30": 535.78,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "1st-edition-foil",
"currency": "USD",
"market": 699.99,
"low": 1900,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 599.34,
"low": 461.99,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
],
"gradedPrices": [
{
"grader": "raw",
"grade": "ungraded",
"currency": "USD",
"price": 445,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "7",
"currency": "USD",
"price": 537.18,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "8",
"currency": "USD",
"price": 740,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9",
"currency": "USD",
"price": 1228.28,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9.5",
"currency": "USD",
"price": 1771.06,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "psa",
"grade": "10",
"currency": "USD",
"price": 6319.05,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "bgs",
"grade": "10",
"currency": "USD",
"price": 8215,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "cgc",
"grade": "10",
"currency": "USD",
"price": 3769.14,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "sgc",
"grade": "10",
"currency": "USD",
"price": 3791,
"salesVolume": 441,
"updatedAt": "2026-09-23T09:20:51.748Z"
}
],
"languagePrices": [
{
"source": "cardmarket",
"language": "en",
"finish": "foil",
"currency": "EUR",
"low": 109.9,
"lowNm": null,
"market": 262.5,
"offers": 50,
"truncated": true,
"truncatedAbove": 470,
"conditions": [
{
"condition": "ex",
"low": 449,
"offers": 1
},
{
"condition": "gd",
"low": 250,
"offers": 11
},
{
"condition": "lp",
"low": 250,
"offers": 6
},
{
"condition": "pl",
"low": 189.99,
"offers": 13
},
{
"condition": "po",
"low": 109.9,
"offers": 19
}
],
"updatedAt": "2026-09-23T16:25:17.509Z"
}
],
"printings": [
{
"key": "foil",
"label": "Holofoil",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/gy/pkm_gym2_2/small.webp",
"normal": "https://cards.tcggraph.io/gy/pkm_gym2_2/normal.webp",
"large": "https://cards.tcggraph.io/gy/pkm_gym2_2/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 274270,
"tcgplayerId": 83861
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 752.99,
"low": 109.9,
"trend": 752.99,
"avg1": 109.89,
"avg7": 829.96,
"avg30": 535.78,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 599.34,
"low": 461.99,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
},
{
"key": "1st-edition-foil",
"label": "1st Edition holofoil",
"kind": "edition",
"images": {
"small": "https://cards.tcggraph.io/gy/pkm_gym2_2/small.webp",
"normal": "https://cards.tcggraph.io/gy/pkm_gym2_2/normal.webp",
"large": "https://cards.tcggraph.io/gy/pkm_gym2_2/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 274270,
"tcgplayerId": 83861
},
"prices": [
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "1st-edition-foil",
"currency": "USD",
"market": 699.99,
"low": 1900,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
}
],
"priceStatus": {
"cardmarket": "priced",
"tcgplayer": "priced",
"graded": "priced"
},
"legalities": {
"unlimited": "legal"
},
"gameData": {
"hp": 100,
"types": [
"Fire"
],
"attacks": [
{
"cost": [
"Fire"
],
"name": "Roaring Flames",
"text": "Discard all Fire Energy cards attached to Blaine's Charizard. If all Energy cards attached to Blaine's Charizard provide 2 Fire Energy, discard all of them. This attack does 20 damage plus 20 more damage for each Fire Energy discarded in this way.",
"damage": "20+",
"convertedEnergyCost": 1
},
{
"cost": [
"Fire",
"Fire"
],
"name": "Flame Jet",
"text": "Flip a coin. If heads, choose 1 of your opponent's Pokémon. This attack does 40 damage to that Pokémon. Don't apply Weakness and Resistance for this attack. (Any other effects that would happen after applying Weakness and Resistance still happen.)",
"damage": "",
"convertedEnergyCost": 2
}
],
"subtypes": [
"Stage 2"
],
"abilities": [],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Water",
"value": "×2"
}
],
"evolvesFrom": "Blaine's Charmeleon",
"resistances": [
{
"type": "Fighting",
"value": "-30"
}
],
"retreatCost": [
"Colorless",
"Colorless",
"Colorless"
],
"regulationMark": null,
"convertedRetreatCost": 3,
"nationalPokedexNumbers": [
6
]
},
"externalIds": {
"cardmarketId": 274270,
"tcgplayerId": 83861
}
},
{
"id": "pkm_ba2020_3_70",
"game": "pokemon",
"name": "Charizard",
"language": "en",
"printedName": null,
"englishId": null,
"pricesFrom": "own",
"set": {
"code": "ba2020",
"name": "Battle Academy 2020",
"language": "en",
"releasedAt": "2020-07-31"
},
"collectorNumber": "3",
"rarity": "Promo",
"artist": null,
"text": null,
"images": {
"small": "https://cards.tcggraph.io/ba/pkm_ba2020_3_70/small.webp",
"normal": "https://cards.tcggraph.io/ba/pkm_ba2020_3_70/normal.webp",
"large": "https://cards.tcggraph.io/ba/pkm_ba2020_3_70/large.webp"
},
"hashes": {
"phash": "ef46d0b0b4372d89",
"phashColor": "ea4ad890b527a59defc6e0b0b4372c89cfd4f838b0317a68"
},
"prices": [
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "normal",
"currency": "USD",
"market": 7.45,
"low": 5.91,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
],
"gradedPrices": [],
"languagePrices": [],
"printings": [
{
"key": "normal",
"label": "Normal",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/ba/pkm_ba2020_3_70/small.webp",
"normal": "https://cards.tcggraph.io/ba/pkm_ba2020_3_70/normal.webp",
"large": "https://cards.tcggraph.io/ba/pkm_ba2020_3_70/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": null,
"tcgplayerId": 219058
},
"prices": [
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "normal",
"currency": "USD",
"market": 7.45,
"low": 5.91,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
}
],
"priceStatus": {
"cardmarket": "unlisted",
"tcgplayer": "priced",
"graded": null
},
"legalities": {},
"gameData": {
"hp": 160,
"types": [
"Fire"
],
"attacks": [
{
"cost": [],
"name": "1RR] Fiery Blast",
"text": "Discard an Energy from this Pokémon.",
"damage": "130",
"convertedEnergyCost": 0
}
],
"subtypes": [
"Stage 2"
],
"abilities": [],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Water",
"value": "×2"
}
],
"evolvesFrom": null,
"resistances": [],
"retreatCost": [
"Colorless",
"Colorless"
],
"catalogSource": "tcgplayer",
"regulationMark": null,
"printingVariant": "#39 Charizard Stamped",
"convertedRetreatCost": 2,
"nationalPokedexNumbers": []
},
"externalIds": {
"cardmarketId": null,
"tcgplayerId": 219058
}
}
],
"meta": {
"page": 1,
"limit": 2,
"totalCount": 158,
"totalPages": 79,
"hasMore": true,
"priceSource": "cardmarket"
}
}Fire Pokémon with 300+ HP, dearest first on TCGplayer
curl "https://api.tcggraph.com/v1/cards?game=pokemon&types=fire&minHp=300&source=tcgplayer&sort=-price&limit=2" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/cards?game=pokemon&types=fire&minHp=300&source=tcgplayer&sort=-price&limit=2", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/cards",
params={
"game": "pokemon",
"types": "fire",
"minHp": "300",
"source": "tcgplayer",
"sort": "-price",
"limit": "2",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": [
{
"id": "pkm_pps_20_189",
"game": "pokemon",
"name": "Charizard VMAX",
"language": "en",
"printedName": null,
"englishId": null,
"pricesFrom": "own",
"set": {
"code": "pps",
"name": "Play! Pokémon Prize Pack Series",
"language": "en",
"releasedAt": null
},
"collectorNumber": "20",
"rarity": "Ultra Rare",
"artist": null,
"text": null,
"images": {
"small": "https://tcgplayer-cdn.tcgplayer.com/product/475983_in_1000x1000.jpg",
"normal": "https://tcgplayer-cdn.tcgplayer.com/product/475983_in_1000x1000.jpg",
"large": "https://tcgplayer-cdn.tcgplayer.com/product/475983_in_1000x1000.jpg"
},
"hashes": null,
"prices": [
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 1600,
"low": 2750,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
],
"gradedPrices": [],
"languagePrices": [],
"printings": [
{
"key": "foil",
"label": "Holofoil",
"kind": "surface",
"images": {
"small": "https://tcgplayer-cdn.tcgplayer.com/product/475983_in_1000x1000.jpg",
"normal": "https://tcgplayer-cdn.tcgplayer.com/product/475983_in_1000x1000.jpg",
"large": "https://tcgplayer-cdn.tcgplayer.com/product/475983_in_1000x1000.jpg"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": null,
"tcgplayerId": 475983
},
"prices": [
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 1600,
"low": 2750,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
}
],
"priceStatus": {
"cardmarket": "set_unlisted",
"tcgplayer": "priced",
"graded": null
},
"legalities": {},
"gameData": {
"hp": 330,
"types": [
"Fire"
],
"attacks": [
{
"cost": [],
"name": "3] Claw Slash",
"text": "",
"damage": "100",
"convertedEnergyCost": 0
},
{
"cost": [],
"name": "2RRR] G-Max Wildfire",
"text": "Discard 2 Energy from this Pokémon.",
"damage": "300",
"convertedEnergyCost": 0
}
],
"subtypes": [
"VMAX"
],
"abilities": [],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Water",
"value": "×2"
}
],
"evolvesFrom": null,
"resistances": [],
"retreatCost": [
"Colorless",
"Colorless",
"Colorless"
],
"catalogSource": "tcgplayer",
"regulationMark": null,
"convertedRetreatCost": 3,
"nationalPokedexNumbers": []
},
"externalIds": {
"cardmarketId": null,
"tcgplayerId": 475983
}
},
{
"id": "pkm_me2_125",
"game": "pokemon",
"name": "Mega Charizard X ex",
"language": "en",
"printedName": null,
"englishId": null,
"pricesFrom": "own",
"set": {
"code": "me2",
"name": "Phantasmal Flames",
"language": "en",
"releasedAt": "2025-11-14"
},
"collectorNumber": "125",
"rarity": "Special Illustration Rare",
"artist": "danciao",
"text": null,
"images": {
"small": "https://cards.tcggraph.io/me/pkm_me2_125/small.webp",
"normal": "https://cards.tcggraph.io/me/pkm_me2_125/normal.webp",
"large": "https://cards.tcggraph.io/me/pkm_me2_125/large.webp"
},
"hashes": {
"phash": "f2bbc0c43c5d8d32",
"phashColor": "b26ee098e3f08db2f2bbc0e63c198d32e2b185663c1f9933"
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 666.84,
"low": 320,
"trend": 666.84,
"avg1": 700,
"avg7": 833.78,
"avg30": 811.81,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 685.09,
"low": 645,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
],
"gradedPrices": [
{
"grader": "raw",
"grade": "ungraded",
"currency": "USD",
"price": 685,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "7",
"currency": "USD",
"price": 647.5,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "8",
"currency": "USD",
"price": 670.82,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9",
"currency": "USD",
"price": 698.54,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9.5",
"currency": "USD",
"price": 1200.77,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "psa",
"grade": "10",
"currency": "USD",
"price": 1837.03,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "bgs",
"grade": "10",
"currency": "USD",
"price": 3000,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "cgc",
"grade": "10",
"currency": "USD",
"price": 1021.59,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "sgc",
"grade": "10",
"currency": "USD",
"price": 1354.25,
"salesVolume": 2289,
"updatedAt": "2026-09-23T09:20:51.748Z"
}
],
"languagePrices": [
{
"source": "cardmarket",
"language": "en",
"finish": "foil",
"currency": "EUR",
"low": 350,
"lowNm": null,
"market": 350,
"offers": 1,
"truncated": true,
"truncatedAbove": 548.95,
"conditions": [
{
"condition": "gd",
"low": 350,
"offers": 1
}
],
"updatedAt": "2026-09-24T02:43:36.315Z"
},
{
"source": "cardmarket",
"language": "es",
"finish": "foil",
"currency": "EUR",
"low": 320,
"lowNm": 320,
"market": 475,
"offers": 30,
"truncated": true,
"truncatedAbove": 548.95,
"conditions": [
{
"condition": "mt",
"low": 420,
"offers": 3
},
{
"condition": "nm",
"low": 320,
"offers": 26
},
{
"condition": "ex",
"low": 525,
"offers": 1
}
],
"updatedAt": "2026-09-24T02:43:36.315Z"
},
{
"source": "cardmarket",
"language": "de",
"finish": "foil",
"currency": "EUR",
"low": 474.99,
"lowNm": 495,
"market": 534.98,
"offers": 19,
"truncated": true,
"truncatedAbove": 548.95,
"conditions": [
{
"condition": "nm",
"low": 495,
"offers": 15
},
{
"condition": "ex",
"low": 474.99,
"offers": 4
}
],
"updatedAt": "2026-09-24T02:43:36.315Z"
},
{
"source": "cardmarket",
"language": "it",
"finish": "foil",
"currency": "EUR",
"low": 499,
"lowNm": null,
"market": 499,
"offers": 1,
"truncated": true,
"truncatedAbove": 549.99,
"conditions": [
{
"condition": "ex",
"low": 499,
"offers": 1
}
],
"updatedAt": "2026-09-22T08:30:52.542Z"
}
],
"printings": [
{
"key": "foil",
"label": "Holofoil",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/me/pkm_me2_125/small.webp",
"normal": "https://cards.tcggraph.io/me/pkm_me2_125/normal.webp",
"large": "https://cards.tcggraph.io/me/pkm_me2_125/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 857700,
"tcgplayerId": 662184
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 666.84,
"low": 320,
"trend": 666.84,
"avg1": 700,
"avg7": 833.78,
"avg30": 811.81,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 685.09,
"low": 645,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
}
],
"priceStatus": {
"cardmarket": "priced",
"tcgplayer": "priced",
"graded": "priced"
},
"legalities": {
"expanded": "legal",
"standard": "legal",
"unlimited": "legal"
},
"gameData": {
"hp": 360,
"types": [
"Fire"
],
"attacks": [
{
"cost": [
"Fire",
"Fire"
],
"name": "Inferno X",
"text": "Discard any amount of Fire Energy from among your Pokémon, and this attack does 90 damage for each card you discarded in this way.",
"damage": "90×",
"convertedEnergyCost": 2
}
],
"subtypes": [
"Stage 2",
"MEGA",
"ex"
],
"abilities": [],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Water",
"value": "×2"
}
],
"evolvesFrom": "Charmeleon",
"resistances": [],
"retreatCost": [
"Colorless",
"Colorless"
],
"regulationMark": "I",
"convertedRetreatCost": 2,
"nationalPokedexNumbers": [
6
]
},
"externalIds": {
"cardmarketId": 857700,
"tcgplayerId": 662184
}
}
],
"meta": {
"page": 1,
"limit": 2,
"totalCount": 71,
"totalPages": 36,
"hasMore": true,
"priceSource": "tcgplayer"
}
}German printings of one card
name stays English; printedName is the German name, and pricesFrom: "englishTwin" says the quotes are the English printing's.
curl "https://api.tcggraph.com/v1/cards?game=pokemon&set=sv3pt5&collectorNumber=6&language=de" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/cards?game=pokemon&set=sv3pt5&collectorNumber=6&language=de", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/cards",
params={
"game": "pokemon",
"set": "sv3pt5",
"collectorNumber": "6",
"language": "de",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": [
{
"id": "pkm_sv3pt5_6_de",
"game": "pokemon",
"name": "Charizard ex",
"language": "de",
"printedName": "Glurak-ex",
"englishId": "pkm_sv3pt5_6",
"pricesFrom": "englishTwin",
"set": {
"code": "sv3pt5",
"name": "151",
"language": "en",
"releasedAt": "2023-09-22"
},
"collectorNumber": "6",
"rarity": "Double Rare",
"artist": "PLANETA Mochizuki",
"text": null,
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_6_de/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_6_de/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_6_de/large.webp"
},
"hashes": {
"phash": "c35f15a4727b1c8c",
"phashColor": "c35917b46aeb3984c35f14a4737b1c8ceb6e94e4d05a1a2b"
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 8.62,
"low": 4,
"trend": 8.62,
"avg1": 7.03,
"avg7": 8.8,
"avg30": 8.47,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 8.79,
"low": 6,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
],
"gradedPrices": [
{
"grader": "raw",
"grade": "ungraded",
"currency": "USD",
"price": 8.12,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "7",
"currency": "USD",
"price": 16.76,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "8",
"currency": "USD",
"price": 17.75,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9",
"currency": "USD",
"price": 25,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9.5",
"currency": "USD",
"price": 25,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "psa",
"grade": "10",
"currency": "USD",
"price": 125.65,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "bgs",
"grade": "10",
"currency": "USD",
"price": 163,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "cgc",
"grade": "10",
"currency": "USD",
"price": 34.46,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "sgc",
"grade": "10",
"currency": "USD",
"price": 39,
"salesVolume": 370,
"updatedAt": "2026-09-23T09:20:51.748Z"
}
],
"languagePrices": [
{
"source": "cardmarket",
"language": "en",
"finish": "foil",
"currency": "EUR",
"low": 5,
"lowNm": 5,
"market": 5.5,
"offers": 2,
"truncated": true,
"truncatedAbove": 6.26,
"conditions": [
{
"condition": "nm",
"low": 5,
"offers": 2
}
],
"updatedAt": "2026-09-24T02:51:27.427Z"
},
{
"source": "cardmarket",
"language": "it",
"finish": "foil",
"currency": "EUR",
"low": 4,
"lowNm": 4,
"market": 5.49,
"offers": 47,
"truncated": true,
"truncatedAbove": 6.26,
"conditions": [
{
"condition": "nm",
"low": 4,
"offers": 41
},
{
"condition": "ex",
"low": 4.5,
"offers": 6
}
],
"updatedAt": "2026-09-24T02:51:27.427Z"
},
{
"source": "cardmarket",
"language": "de",
"finish": "foil",
"currency": "EUR",
"low": 7.5,
"lowNm": 7.5,
"market": 7.5,
"offers": 1,
"truncated": true,
"truncatedAbove": 7.5,
"conditions": [
{
"condition": "nm",
"low": 7.5,
"offers": 1
}
],
"updatedAt": "2026-09-13T03:15:59.919Z"
},
{
"source": "cardmarket",
"language": "fr",
"finish": "foil",
"currency": "EUR",
"low": 6,
"lowNm": 6,
"market": 6,
"offers": 1,
"truncated": true,
"truncatedAbove": 6.26,
"conditions": [
{
"condition": "nm",
"low": 6,
"offers": 1
}
],
"updatedAt": "2026-09-24T02:51:27.427Z"
}
],
"printings": [
{
"key": "foil",
"label": "Holofoil",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_6_de/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_6_de/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_6_de/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 733601,
"tcgplayerId": null
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 8.62,
"low": 4,
"trend": 8.62,
"avg1": 7.03,
"avg7": 8.8,
"avg30": 8.47,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 8.79,
"low": 6,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
}
],
"priceStatus": {
"cardmarket": "priced",
"tcgplayer": "priced",
"graded": "priced"
},
"legalities": {
"expanded": "legal",
"standard": "legal",
"unlimited": "legal"
},
"gameData": {
"hp": 330,
"types": [
"Fire"
],
"attacks": [
{
"cost": [
"Fire"
],
"name": "Brave Wing",
"text": "If this Pokémon has any damage counters on it, this attack does 100 more damage.",
"damage": "60+",
"convertedEnergyCost": 1
},
{
"cost": [
"Fire",
"Fire",
"Fire",
"Fire"
],
"name": "Explosive Vortex",
"text": "Discard 3 Energy from this Pokémon.",
"damage": "330",
"convertedEnergyCost": 4
}
],
"subtypes": [
"Stage 2",
"ex"
],
"abilities": [],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Water",
"value": "×2"
}
],
"evolvesFrom": "Charmeleon",
"resistances": [],
"retreatCost": [
"Colorless",
"Colorless"
],
"regulationMark": "G",
"convertedRetreatCost": 2,
"nationalPokedexNumbers": [
6
]
},
"externalIds": {
"cardmarketId": 733601,
"tcgplayerId": null
}
}
],
"meta": {
"page": 1,
"limit": 20,
"totalCount": 1,
"totalPages": 1,
"hasMore": false,
"priceSource": "cardmarket"
}
}Errors
Every error has the same body; switch on error.code. Any endpoint can also answer 401, 402, 403 or 429 for reasons of key, plan or rate; those are on Errors.
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | A filter no game declares. Common names from other APIs get a suggestion. |
| 400 | invalid_request | A value outside a parameter's list: sort, source, region, language, grader, grade, game. |
| 400 | invalid_request | page or limit that is not a whole number, a price or bound that is not a number, or grader without grade. |
`q` instead of `name`
curl "https://api.tcggraph.com/v1/cards?q=charizard" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/cards?q=charizard", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/cards",
params={
"q": "charizard",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "Unknown filter \"q\". Did you mean name=?",
"details": {
"field": "q",
"suggestion": "name",
"allowed": [
"page",
"limit",
"sort",
"game",
"name",
"text",
"rarity",
"set",
"collectorNumber",
"artist",
"language",
"minPrice",
"maxPrice",
"source",
"region",
"grader",
"grade",
"supertype",
"subtypes",
"hp",
"types",
"evolvesFrom",
"attacks",
"abilities",
"weaknesses",
"resistances",
"retreatCost",
"convertedRetreatCost",
"regulationMark",
"nationalPokedexNumbers",
"manaCost",
"manaValue",
"colors",
"colorIdentity",
"typeLine",
"power",
"toughness",
"loyalty",
"keywords",
"layout",
"finishes",
"cardType",
"cost",
"counter",
"life",
"attribute",
"trigger",
"frameType",
"race",
"atk",
"def",
"level",
"linkRating",
"linkMarkers",
"pendulumScale",
"archetypes",
"banlist",
"inkCost",
"inkable",
"ink",
"lore",
"strength",
"willpower",
"classifications",
"moveCost",
"version",
"aspects",
"arena",
"traits",
"unique",
"variant",
"playCost",
"dp",
"digivolveCosts",
"form",
"inheritedEffect",
"securityEffect",
"memoryCost",
"reserveCost",
"durability",
"elements",
"classes",
"speed",
"line",
"specifiedCost",
"comboPower",
"comboEnergy",
"specialTraits",
"characters",
"era",
"series",
"back",
"minHp",
"maxHp",
"minConvertedRetreatCost",
"maxConvertedRetreatCost",
"minManaValue",
"maxManaValue",
"minCost",
"maxCost",
"minPower",
"maxPower",
"minCounter",
"maxCounter",
"minLife",
"maxLife",
"minAtk",
"maxAtk",
"minDef",
"maxDef",
"minLevel",
"maxLevel",
"minLinkRating",
"maxLinkRating",
"minPendulumScale",
"maxPendulumScale",
"minInkCost",
"maxInkCost",
"minLore",
"maxLore",
"minStrength",
"maxStrength",
"minWillpower",
"maxWillpower",
"minMoveCost",
"maxMoveCost",
"minCost",
"maxCost",
"minPower",
"maxPower",
"minHp",
"maxHp",
"minLevel",
"maxLevel",
"minPlayCost",
"maxPlayCost",
"minDp",
"maxDp",
"minMemoryCost",
"maxMemoryCost",
"minReserveCost",
"maxReserveCost",
"minLevel",
"maxLevel",
"minPower",
"maxPower",
"minLife",
"maxLife",
"minDurability",
"maxDurability",
"minCost",
"maxCost",
"minSpecifiedCost",
"maxSpecifiedCost",
"minPower",
"maxPower",
"minComboPower",
"maxComboPower",
"minComboEnergy",
"maxComboEnergy"
],
"docs": "https://tcggraph.com/docs/rest#filtering"
}
}
}Unknown sort
curl "https://api.tcggraph.com/v1/cards?sort=cheapest" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/cards?sort=cheapest", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/cards",
params={
"sort": "cheapest",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "Unknown sort \"cheapest\".",
"details": {
"field": "sort",
"allowed": [
"name",
"-name",
"price",
"-price",
"gradedPrice",
"-gradedPrice",
"released",
"-released"
]
}
}
}Non-numeric limit
curl "https://api.tcggraph.com/v1/cards?limit=ten" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/cards?limit=ten", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/cards",
params={
"limit": "ten",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "`limit` must be a whole number.",
"details": {
"field": "limit",
"got": "ten"
}
}
}