List sets
Sets across every game, newest first.
meta carries page, limit, totalCount, totalPages and hasMore, like the card lists, but no priceSource: sets carry no prices.
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 set name, or a whole set code; case-insensitive. name=151 and name=sv3pt5 both find 151. |
| language | string | The set's language, or all. Japanese Pokémon sets are their own rows under ja; a translated printing of an English set is not a set of its own. Case-insensitive, with jp, kr and sp accepted.One of: Default: |
| releasedAfter | string | Released on or after this day, YYYY-MM-DD. Sets without a date are excluded. |
| releasedBefore | string | Released on or before this day, YYYY-MM-DD. |
| sort | string | - for descending; cards is the card count. Sets without a date sort last. Ties break on code.One of: Default: |
| 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 sets.
| Field | Type | Description |
|---|---|---|
| data | Set[] (Set reference) | The sets. |
| meta | object | Paging. |
| meta.page | integer | The page returned. |
| meta.limit | integer | The page size used. |
| meta.totalCount | integer | Sets matching, across every page. |
| meta.totalPages | integer | At least 1. |
| meta.hasMore | boolean | Whether a later page has rows. |
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.
Newest Pokémon sets
curl "https://api.tcggraph.com/v1/sets?game=pokemon&limit=3" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets?game=pokemon&limit=3", {
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",
params={
"game": "pokemon",
"limit": "3",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": [
{
"code": "me55",
"game": "pokemon",
"name": "30th Celebration",
"language": "en",
"releasedAt": "2026-09-16",
"cardCount": 161
},
{
"code": "me55c",
"game": "pokemon",
"name": "30th Celebration: Classic Collection",
"language": "en",
"releasedAt": "2026-09-16",
"cardCount": 30
},
{
"code": "me5",
"game": "pokemon",
"name": "Pitch Black",
"language": "en",
"releasedAt": "2026-07-17",
"cardCount": 120
}
],
"meta": {
"page": 1,
"limit": 3,
"totalCount": 230,
"totalPages": 77,
"hasMore": true
}
}Japanese sets from 2025
curl "https://api.tcggraph.com/v1/sets?game=pokemon&language=ja&releasedAfter=2025-01-01&releasedBefore=2025-12-31&sort=released&limit=3" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets?game=pokemon&language=ja&releasedAfter=2025-01-01&releasedBefore=2025-12-31&sort=released&limit=3", {
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",
params={
"game": "pokemon",
"language": "ja",
"releasedAfter": "2025-01-01",
"releasedBefore": "2025-12-31",
"sort": "released",
"limit": "3",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": [
{
"code": "sv9",
"game": "pokemon",
"name": "Battle Partners",
"language": "ja",
"releasedAt": "2025-01-24",
"cardCount": 132
},
{
"code": "svn",
"game": "pokemon",
"name": "Battle Partners Deck Build Box",
"language": "ja",
"releasedAt": "2025-01-24",
"cardCount": 45
},
{
"code": "svod",
"game": "pokemon",
"name": "SV: ex Starter Set Steven's Beldum & Metagross ex",
"language": "ja",
"releasedAt": "2025-02-21",
"cardCount": 19
}
],
"meta": {
"page": 1,
"limit": 3,
"totalCount": 19,
"totalPages": 7,
"hasMore": true
}
}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 parameter this endpoint does not take. details.suggestion names the one you probably meant. |
| 400 | invalid_request | A date that is not YYYY-MM-DD, or not a real day. |
Misspelt parameter
curl "https://api.tcggraph.com/v1/sets?Game=pokemon" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets?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",
params={
"Game": "pokemon",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "Unknown parameter \"Game\". Did you mean game=?",
"details": {
"field": "Game",
"suggestion": "game",
"allowed": [
"game",
"name",
"language",
"releasedAfter",
"releasedBefore",
"sort",
"page",
"limit"
],
"docs": "https://tcggraph.com/docs/rest/list-sets"
}
}
}Bad date
curl "https://api.tcggraph.com/v1/sets?releasedAfter=2025-13-01" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/sets?releasedAfter=2025-13-01", {
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",
params={
"releasedAfter": "2025-13-01",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "`releasedAfter` must be a date as YYYY-MM-DD.",
"details": {
"field": "releasedAfter",
"got": "2025-13-01"
}
}
}