/v1/openapi.json. Point a code generator, an LLM, or an API client at it; it is generated from the same definition as this page.Subscribe, pay, and your token is minted on the spot — shown once on the redemption page. Cancel any time; the token stops when the subscription does.
Just trying it out? The free tier (1,000 requests/mo) is a support email away — no card needed. Images never count against any plan.
Card data for the Pokémon Trading Card Game — sets, cards, printings, images-by-address — served fast from SQLite.
/v1/health, /v1/openapi.json and /docs requires a token: Authorization: Bearer ptcg_live_… (or X-API-Key: ptcg_live_… for clients that cannot set Authorization).catalog.db download 100. The manifest (/v1/catalog.json), /v1/me, /v1/languages and all images cost 0 — poll for updates and hotlink pictures freely, forever. A 304 Not Modified on catalog.db is also free. Every plan additionally has a per-minute burst cap.Every response carries X-Quota-Limit, X-Quota-Used, X-Quota-Remaining, X-Quota-Resets and X-Quota-Period headers, so a client sees the wall before hitting it.
/v1/catalog.db once (cost 100), serve lookups from your own copy, poll /v1/catalog.json (free) for version changes, and send If-None-Match when re-pulling — unchanged means a free 304./v1/health
freeno tokenLiveness, version, and cluster view
The one truly open endpoint — monitors should not need a key to ask "alive?".
{
"ok": true,
"catalog": true,
"node": "east",
"service": "0.4.9",
"version": 12,
"sourceConfigured": true,
"auth": true,
"checkedAt": "2026-08-09T12:00:00.000Z"
}/v1/me
freeWho this token is, and how much it has left
{
"node": "east",
"name": "My app",
"plan": "free",
"monthlyLimit": 1000,
"burstLimit": 60,
"period": "2026-08",
"used": 42,
"remaining": 958,
"resetsAt": "2026-09-01T00:00:00.000Z",
"created": "2026-08-09T00:00:00.000Z"
}Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/catalog.json
freeThe catalog manifest — poll this to know when to update
{
"version": 12,
"cards": 19000,
"sets": 160,
"printings": 31000,
"contentHash": "ab12…",
"fetchedAt": "2026-08-09T12:00:00.000Z",
"checkedAt": "2026-08-09T12:05:00.000Z"
}Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/catalog.db
cost 100The whole catalog, as one SQLite file
Byte-for-byte the published master (tables: sets, cards, printings, meta). Send If-None-Match with the last ETag — an unchanged catalog answers 304 at cost 0.
application/octet-stream), with an ETag.Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/languages
freeWhich languages are published
{
"languages": [
"en",
"ja"
]
}Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/sets
cost 1Every set, in release order
| Parameter | ||
|---|---|---|
lang (query) | optional | Language code (en, ja, de, …). Defaults to en. /v1/languages lists what is published. |
{
"language": "en",
"sets": [
{
"id": "base1",
"name": "Base Set",
"releaseDate": "1999-01-09",
"logo": "https://…/en/images/base1/logo.png",
"cardCount": {
"official": 102,
"total": 102
}
}
]
}Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/sets/{id}
cost 1One set, with every card and printing in it
| Parameter | ||
|---|---|---|
id (path) | required | |
lang (query) | optional | Language code (en, ja, de, …). Defaults to en. /v1/languages lists what is published. |
Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/cards
cost 1Search cards
| Parameter | ||
|---|---|---|
lang (query) | optional | Language code (en, ja, de, …). Defaults to en. /v1/languages lists what is published. |
name (query) | optional | Substring match on the card name. |
set (query) | optional | Restrict to one set id. |
rarity (query) | optional | Exact rarity. |
type (query) | optional | Exact type (Fire, Water, …). |
page (query) | optional | |
perPage (query) | optional |
setName.Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/cards/{id}
cost 1One card, with its printings
| Parameter | ||
|---|---|---|
id (path) | required | |
lang (query) | optional | Language code (en, ja, de, …). Defaults to en. /v1/languages lists what is published. |
{
"id": "base1-4",
"setId": "base1",
"number": "4",
"name": "Charizard",
"rarity": "Rare Holo",
"category": "Pokemon",
"dex": [
6
],
"types": [
"Fire"
],
"hp": 120,
"illustrator": "Mitsuhiro Arita",
"variants": [
"holo",
"firstEdition"
],
"images": {
"low": "https://…/low.webp",
"high": "https://…/high.webp"
},
"printings": []
}Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/scan-index
cost 5Perceptual-hash fingerprints for on-device card scanning
| Parameter | ||
|---|---|---|
lang (query) | optional | Language code (en, ja, de, …). Defaults to en. /v1/languages lists what is published. |
[cardId, hash].Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds./v1/images/{key}
freeA card image, by address — answers with a redirect
Always cost 0, by standing policy — images are never metered or sold. The answer is a 302 to where the bytes live; this API never serves image bytes itself.
| Parameter | ||
|---|---|---|
key (path) | required |
Authorization: Bearer <token> (or X-API-Key).X-Quota-Resets says when it refills; nothing is charged for refused requests.Retry-After is set, in seconds.