Get a set
One set and a page of its cards.
Billed as a search, 2 credits, because it returns a page of cards: the same work as /v1/cards?set=.
Every /v1/cards filter applies to the cards listed, and meta is the card list's, with priceSource.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| coderequired | string | The set code, case-insensitive. |
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 | Which game's set, when the code exists in more than one. Set codes are unique within a game and language only. One of: |
| language | string | Which language's set: Pokémon sv3 is Obsidian Flames in English and Ruler of the Black Flame in Japanese. Without it the English set is used, and a code no English set has resolves in whatever language holds it. The cards listed are in the set's language unless this asks for another (de lists a set's German printings).One of: Default: en, else the set's own |
| 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. |
| 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. |
| 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 The set, with a page of its cards.
| Field | Type | Description |
|---|---|---|
| data | object | A Set object with its cards. |
| data.code | string | The set code. |
| data.game | string | The game. One of: |
| data.name | string | The set name. |
| data.language | string | The set's language. |
| data.releasedAt | string | null | YYYY-MM-DD. |
| data.cardCount | integer | Cards in the set. |
| data.cards | Card[] (Card reference) | The page of cards. |
| meta | PageMeta | Paging of cards. |
| 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.
151, two cards
curl "https://api.tcggraph.com/v1/sets/sv3pt5?limit=2" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets/sv3pt5?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/sets/sv3pt5",
params={
"limit": "2",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": {
"code": "sv3pt5",
"game": "pokemon",
"name": "151",
"language": "en",
"releasedAt": "2023-09-22",
"cardCount": 207,
"cards": [
{
"id": "pkm_sv3pt5_63",
"game": "pokemon",
"name": "Abra",
"language": "en",
"printedName": null,
"englishId": null,
"pricesFrom": "own",
"set": {
"code": "sv3pt5",
"name": "151",
"language": "en",
"releasedAt": "2023-09-22"
},
"collectorNumber": "63",
"rarity": "Common",
"artist": "Mitsuhiro Arita",
"text": "Abra can teleport in its sleep. Apparently the more deeply Abra sleeps, the farther its teleportations go.",
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/large.webp"
},
"hashes": {
"phash": "b2324fc94fa5b4d0",
"phashColor": "a23e4fc9cda4b494b29247cd4f25b4f0b23a85c44f6f78d0"
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "normal",
"currency": "EUR",
"market": 0.06,
"low": 0.02,
"trend": 0.06,
"avg1": 0.03,
"avg7": 0.05,
"avg30": 0.07,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "reverse-holo",
"currency": "EUR",
"market": 0.26,
"low": 0.02,
"trend": 0.26,
"avg1": 0.17,
"avg7": 0.27,
"avg30": 0.27,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "normal",
"currency": "USD",
"market": 0.14,
"low": 0.01,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "reverse-holo",
"currency": "USD",
"market": 0.26,
"low": 0.02,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
],
"gradedPrices": [
{
"grader": "raw",
"grade": "ungraded",
"currency": "USD",
"price": 0.2,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "8",
"currency": "USD",
"price": 9.48,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9",
"currency": "USD",
"price": 10.5,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9.5",
"currency": "USD",
"price": 12,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "psa",
"grade": "10",
"currency": "USD",
"price": 92,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "bgs",
"grade": "10",
"currency": "USD",
"price": 120,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "cgc",
"grade": "10",
"currency": "USD",
"price": 55,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "sgc",
"grade": "10",
"currency": "USD",
"price": 55,
"salesVolume": 130,
"updatedAt": "2026-09-23T09:20:51.748Z"
}
],
"languagePrices": [
{
"source": "cardmarket",
"language": "en",
"finish": "normal",
"currency": "EUR",
"low": 0.02,
"lowNm": 0.02,
"market": 0.02,
"offers": 18,
"truncated": true,
"truncatedAbove": 0.03,
"conditions": [
{
"condition": "nm",
"low": 0.02,
"offers": 18
}
],
"updatedAt": "2026-09-24T02:33:49.076Z"
},
{
"source": "cardmarket",
"language": "it",
"finish": "normal",
"currency": "EUR",
"low": 0.02,
"lowNm": 0.02,
"market": 0.02,
"offers": 17,
"truncated": true,
"truncatedAbove": 0.03,
"conditions": [
{
"condition": "nm",
"low": 0.02,
"offers": 14
},
{
"condition": "ex",
"low": 0.02,
"offers": 3
}
],
"updatedAt": "2026-09-24T02:33:49.076Z"
},
{
"source": "cardmarket",
"language": "fr",
"finish": "normal",
"currency": "EUR",
"low": 0.02,
"lowNm": 0.02,
"market": 0.02,
"offers": 14,
"truncated": true,
"truncatedAbove": 0.03,
"conditions": [
{
"condition": "mt",
"low": 0.02,
"offers": 1
},
{
"condition": "nm",
"low": 0.02,
"offers": 12
},
{
"condition": "lp",
"low": 0.02,
"offers": 1
}
],
"updatedAt": "2026-09-24T02:33:49.076Z"
},
{
"source": "cardmarket",
"language": "de",
"finish": "normal",
"currency": "EUR",
"low": 0.02,
"lowNm": 0.02,
"market": 0.02,
"offers": 1,
"truncated": true,
"truncatedAbove": 0.03,
"conditions": [
{
"condition": "nm",
"low": 0.02,
"offers": 1
}
],
"updatedAt": "2026-09-24T02:33:49.076Z"
}
],
"printings": [
{
"key": "normal",
"label": "Normal",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 733658,
"tcgplayerId": 516268
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "normal",
"currency": "EUR",
"market": 0.06,
"low": 0.02,
"trend": 0.06,
"avg1": 0.03,
"avg7": 0.05,
"avg30": 0.07,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "normal",
"currency": "USD",
"market": 0.14,
"low": 0.01,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
},
{
"key": "reverse-holo",
"label": "Reverse holo",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_63/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 733658,
"tcgplayerId": 516268
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "reverse-holo",
"currency": "EUR",
"market": 0.26,
"low": 0.02,
"trend": 0.26,
"avg1": 0.17,
"avg7": 0.27,
"avg30": 0.27,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "reverse-holo",
"currency": "USD",
"market": 0.26,
"low": 0.02,
"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": 50,
"types": [
"Psychic"
],
"attacks": [
{
"cost": [
"Psychic"
],
"name": "Psyshot",
"text": "",
"damage": "20",
"convertedEnergyCost": 1
}
],
"subtypes": [
"Basic"
],
"abilities": [],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Darkness",
"value": "×2"
}
],
"evolvesFrom": null,
"resistances": [
{
"type": "Fighting",
"value": "-30"
}
],
"retreatCost": [
"Colorless"
],
"regulationMark": "G",
"convertedRetreatCost": 1,
"nationalPokedexNumbers": [
63
]
},
"externalIds": {
"cardmarketId": 733658,
"tcgplayerId": 516268
}
},
{
"id": "pkm_sv3pt5_142",
"game": "pokemon",
"name": "Aerodactyl",
"language": "en",
"printedName": null,
"englishId": null,
"pricesFrom": "own",
"set": {
"code": "sv3pt5",
"name": "151",
"language": "en",
"releasedAt": "2023-09-22"
},
"collectorNumber": "142",
"rarity": "Rare",
"artist": "Shinji Kanda",
"text": "Aerodactyl's sawlike fangs can shred skin to tatters—even the skin of Steel-type Pokémon.",
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/large.webp"
},
"hashes": {
"phash": "ef6bd090903787c3",
"phashColor": "ef6ad09090379793eb6bd190903787c5eb6b9090903fc7c3"
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 0.3,
"low": 0.02,
"trend": 0.3,
"avg1": 0.31,
"avg7": 0.32,
"avg30": 0.31,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "reverse-holo",
"currency": "EUR",
"market": 2.13,
"low": 0.4,
"trend": 2.13,
"avg1": 2.95,
"avg7": 2.21,
"avg30": 2.11,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 0.35,
"low": 0.1,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "reverse-holo",
"currency": "USD",
"market": 1.28,
"low": 0.4,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
],
"gradedPrices": [
{
"grader": "raw",
"grade": "ungraded",
"currency": "USD",
"price": 1.49,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "8",
"currency": "USD",
"price": 14.04,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9",
"currency": "USD",
"price": 15,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "any",
"grade": "9.5",
"currency": "USD",
"price": 17,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "psa",
"grade": "10",
"currency": "USD",
"price": 119.02,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "bgs",
"grade": "10",
"currency": "USD",
"price": 155,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "cgc",
"grade": "10",
"currency": "USD",
"price": 22,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
},
{
"grader": "sgc",
"grade": "10",
"currency": "USD",
"price": 71,
"salesVolume": 181,
"updatedAt": "2026-09-23T09:20:51.748Z"
}
],
"languagePrices": [
{
"source": "cardmarket",
"language": "en",
"finish": "foil",
"currency": "EUR",
"low": 0.02,
"lowNm": 0.02,
"market": 0.1,
"offers": 13,
"truncated": true,
"truncatedAbove": 0.1,
"conditions": [
{
"condition": "nm",
"low": 0.02,
"offers": 13
}
],
"updatedAt": "2026-09-24T02:32:13.283Z"
},
{
"source": "cardmarket",
"language": "it",
"finish": "foil",
"currency": "EUR",
"low": 0.02,
"lowNm": 0.02,
"market": 0.05,
"offers": 33,
"truncated": true,
"truncatedAbove": 0.1,
"conditions": [
{
"condition": "nm",
"low": 0.02,
"offers": 32
},
{
"condition": "ex",
"low": 0.1,
"offers": 1
}
],
"updatedAt": "2026-09-24T02:32:13.283Z"
},
{
"source": "cardmarket",
"language": "fr",
"finish": "foil",
"currency": "EUR",
"low": 0.05,
"lowNm": 0.05,
"market": 0.1,
"offers": 4,
"truncated": true,
"truncatedAbove": 0.1,
"conditions": [
{
"condition": "nm",
"low": 0.05,
"offers": 4
}
],
"updatedAt": "2026-09-24T02:32:13.283Z"
},
{
"source": "cardmarket",
"language": "de",
"finish": "foil",
"currency": "EUR",
"low": 0.09,
"lowNm": 0.09,
"market": 0.09,
"offers": 1,
"truncated": true,
"truncatedAbove": 0.1,
"conditions": [
{
"condition": "nm",
"low": 0.09,
"offers": 1
}
],
"updatedAt": "2026-09-14T13:15:19.186Z"
},
{
"source": "cardmarket",
"language": "fr",
"finish": "reverse-holo",
"currency": "EUR",
"low": 0.05,
"lowNm": 0.05,
"market": 0.05,
"offers": 1,
"truncated": true,
"truncatedAbove": 0.1,
"conditions": [],
"updatedAt": "2026-09-19T05:03:34.974Z"
}
],
"printings": [
{
"key": "foil",
"label": "Holofoil",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 733737,
"tcgplayerId": 516705
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 0.3,
"low": 0.02,
"trend": 0.3,
"avg1": 0.31,
"avg7": 0.32,
"avg30": 0.31,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 0.35,
"low": 0.1,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T07:19:35.232Z"
}
]
},
{
"key": "reverse-holo",
"label": "Reverse holo",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/small.webp",
"normal": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/normal.webp",
"large": "https://cards.tcggraph.io/sv/pkm_sv3pt5_142/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 733737,
"tcgplayerId": 516705
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "reverse-holo",
"currency": "EUR",
"market": 2.13,
"low": 0.4,
"trend": 2.13,
"avg1": 2.95,
"avg7": 2.21,
"avg30": 2.11,
"updatedAt": "2026-09-24T07:34:30.239Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "reverse-holo",
"currency": "USD",
"market": 1.28,
"low": 0.4,
"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": 130,
"types": [
"Colorless"
],
"attacks": [
{
"cost": [
"Colorless"
],
"name": "Glide",
"text": "",
"damage": "30",
"convertedEnergyCost": 1
},
{
"cost": [
"Colorless",
"Colorless"
],
"name": "Devolution Ray",
"text": "If your opponent's Active Pokémon is an evolved Pokémon, devolve it by putting the highest Stage Evolution card on it into your opponent's hand.",
"damage": "100",
"convertedEnergyCost": 2
}
],
"subtypes": [
"Stage 1"
],
"abilities": [],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Lightning",
"value": "×2"
}
],
"evolvesFrom": "Antique Old Amber",
"resistances": [
{
"type": "Fighting",
"value": "-30"
}
],
"retreatCost": [],
"regulationMark": "G",
"convertedRetreatCost": null,
"nationalPokedexNumbers": [
142
]
},
"externalIds": {
"cardmarketId": 733737,
"tcgplayerId": 516705
}
}
]
},
"meta": {
"page": 1,
"limit": 2,
"totalCount": 207,
"totalPages": 104,
"hasMore": true,
"priceSource": "cardmarket"
}
}A Japanese-only set, no language needed
curl "https://api.tcggraph.com/v1/sets/m6a?game=pokemon&limit=1" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets/m6a?game=pokemon&limit=1", {
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/sets/m6a",
params={
"game": "pokemon",
"limit": "1",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": {
"code": "m6a",
"game": "pokemon",
"name": "MEGA Expansion 30th Celebration",
"language": "ja",
"releasedAt": "2026-09-16",
"cardCount": 171,
"cards": [
{
"id": "pkm_ja_m6a_104",
"game": "pokemon",
"name": "Alolan Exeggutor",
"language": "ja",
"printedName": null,
"englishId": "pkm_me55_129",
"pricesFrom": "own",
"set": {
"code": "m6a",
"name": "MEGA Expansion 30th Celebration",
"language": "ja",
"releasedAt": "2026-09-16"
},
"collectorNumber": "104",
"rarity": "Art Rare",
"artist": null,
"text": "As it grew taller and taller, it outgrew its reliance on psychic powers, while within it awakened the power of the sleeping dragon.",
"images": {
"small": "https://cards.tcggraph.io/ja/pkm_ja_m6a_104/small.webp",
"normal": "https://cards.tcggraph.io/ja/pkm_ja_m6a_104/normal.webp",
"large": "https://cards.tcggraph.io/ja/pkm_ja_m6a_104/large.webp"
},
"hashes": {
"phash": "eb98539a9535da82",
"phashColor": "fa5ad084a52ddb4aab98439a9635da93eac939da94769183"
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 4.47,
"low": 4.49,
"trend": 4.47,
"avg1": 5.5,
"avg7": 8.3,
"avg30": 8.3,
"updatedAt": "2026-09-24T07:45:18.974Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 14.32,
"low": 5.49,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T00:00:09.612Z"
}
],
"gradedPrices": [],
"languagePrices": [
{
"source": "cardmarket",
"language": "ja",
"finish": "foil",
"currency": "EUR",
"low": 4,
"lowNm": 4,
"market": 5,
"offers": 14,
"truncated": false,
"truncatedAbove": null,
"conditions": [
{
"condition": "nm",
"low": 4,
"offers": 14
}
],
"updatedAt": "2026-09-24T06:21:00.661Z"
},
{
"source": "cardmarket",
"language": "ko",
"finish": "foil",
"currency": "EUR",
"low": 4.5,
"lowNm": 4.5,
"market": 4.5,
"offers": 1,
"truncated": false,
"truncatedAbove": null,
"conditions": [
{
"condition": "nm",
"low": 4.5,
"offers": 1
}
],
"updatedAt": "2026-09-24T06:21:00.661Z"
}
],
"printings": [
{
"key": "foil",
"label": "Holofoil",
"kind": "surface",
"images": {
"small": "https://cards.tcggraph.io/ja/pkm_ja_m6a_104/small.webp",
"normal": "https://cards.tcggraph.io/ja/pkm_ja_m6a_104/normal.webp",
"large": "https://cards.tcggraph.io/ja/pkm_ja_m6a_104/large.webp"
},
"imageFrom": "card",
"externalIds": {
"cardmarketId": 907869,
"tcgplayerId": 716906
},
"prices": [
{
"source": "cardmarket",
"region": "EU",
"listType": "retail",
"finish": "foil",
"currency": "EUR",
"market": 4.47,
"low": 4.49,
"trend": 4.47,
"avg1": 5.5,
"avg7": 8.3,
"avg30": 8.3,
"updatedAt": "2026-09-24T07:45:18.974Z"
},
{
"source": "tcgplayer",
"region": "NA",
"listType": "retail",
"finish": "foil",
"currency": "USD",
"market": 14.32,
"low": 5.49,
"trend": null,
"avg1": null,
"avg7": null,
"avg30": null,
"updatedAt": "2026-09-24T00:00:09.612Z"
}
]
}
],
"priceStatus": {
"cardmarket": "priced",
"tcgplayer": "priced",
"graded": null
},
"legalities": {},
"gameData": {
"hp": 150,
"types": [
"Grass"
],
"attacks": [
{
"cost": [
"Grass",
"Colorless",
"Colorless",
"Colorless"
],
"name": "Mega Drain",
"text": "Heal 50 damage from this Pokemon.",
"damage": "150",
"convertedEnergyCost": 4
}
],
"subtypes": [
"Stage 1"
],
"abilities": [
{
"name": "Scale Up",
"text": "If this Pokemon has 6 or more Grass Energy attached, it gets +250 HP.",
"type": "Ability"
}
],
"supertype": "Pokémon",
"weaknesses": [
{
"type": "Fire",
"value": "×2"
}
],
"evolvesFrom": null,
"resistances": [],
"retreatCost": [
"Colorless",
"Colorless",
"Colorless",
"Colorless"
],
"catalogSource": "tcgplayer",
"regulationMark": null,
"convertedRetreatCost": 4,
"nationalPokedexNumbers": []
},
"externalIds": {
"cardmarketId": 907869,
"tcgplayerId": 716906
}
}
]
},
"meta": {
"page": 1,
"limit": 1,
"totalCount": 171,
"totalPages": 171,
"hasMore": true,
"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 | The code exists in more than one game (details.field is game) or, with language=all, more than one language (details.field is language). details.matches lists them. |
| 404 | not_found | No set has the code, in the language asked for. |
Code in two games
curl "https://api.tcggraph.com/v1/sets/OP16" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets/OP16", {
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/sets/OP16",
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "Set code \"OP16\" exists in more than one game. Add ?game= to choose.",
"details": {
"field": "game",
"matches": [
{
"game": "one-piece",
"language": "en",
"name": "THE TIME OF BATTLE"
},
{
"game": "yugioh",
"language": "en",
"name": "OTS Tournament Pack 16"
}
]
}
}
}Unknown code
curl "https://api.tcggraph.com/v1/sets/nope?game=pokemon" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets/nope?game=pokemon", {
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/sets/nope",
params={
"game": "pokemon",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "not_found",
"message": "No set with code \"nope\"."
}
}