Japanese Pokémon card API
A Japanese Pokémon card API: the JP sets as their own catalogue
Japanese sets are not translations of the Western ones: different set lists, different numbering, different release dates. This API models them as what they are, a separate print region, and links each card to its Western twin where one exists.
- Print regions
- WEST, JP and CN (Simplified Chinese)
- Filter
region=JPon sets,q=set.region:JPon cards- Names
- Japanese on JP cards;
lang=for the other locales - Twin link
jp_twin_idon Western cards
Most Pokémon card APIs cover the international print line and stop. The Japanese line is the larger half of the hobby by number of sets, it releases first, and it is what a growing share of Western collectors actually buy. Here GET /v1/sets?region=JP lists the Japanese sets with their own codes and dates, and q=set.region:JP narrows any card search to them.
A Japanese card is a card in its own right, with its own id, number, rarity, illustrator and image. Where we know the pairing, the Western printing of the same card carries jp_twin_id, so an app can show "also printed in Japan as…" without guessing from the artwork.
The Simplified Chinese line is modelled the same way, as region CN. The live counts for each region, with the earliest and latest set we hold, are on the coverage page and are read from the API when you open it.
One call, and what comes back
Listing sets: the response mixes regions, and region on each set says which line it belongs to. Add ?region=JP to keep only the Japanese print line; the set object is the same shape for every region.
curl -s -G "https://api.pokemontcgapi.com/v1/sets" \
--data-urlencode "region=JP" \
--data-urlencode "limit=2" \
-H "X-Api-Key: $PTCG_API_KEY"const url = new URL("https://api.pokemontcgapi.com/v1/sets");
url.searchParams.set("region", "JP");
url.searchParams.set("limit", "2");
const res = await fetch(url, {
headers: { "X-Api-Key": process.env.PTCG_API_KEY ?? "" },
});
if (!res.ok) {
const { error } = await res.json();
throw new Error(`${error.code}: ${error.message} (${error.request_id})`);
}
const { data, meta } = await res.json();import os, httpx
res = httpx.get(
"https://api.pokemontcgapi.com/v1/sets",
params={"region": "JP", "limit": "2"},
headers={"X-Api-Key": os.environ["PTCG_API_KEY"]},
)
res.raise_for_status()
payload = res.json(){
"data": [
{
"id": "m6",
"code": "m6",
"slug": "storm-emeralda",
"legacy_id": null,
"name": "Storm Emeralda",
"series": null,
"region": "JP",
"release_date": "2026-07-31",
"total": 116,
"printed_total": null,
"ptcgo_code": null,
"symbol_url": null,
"logo_url": "https://img.pokemontcgapi.com/media/sets/m6/logo-normal.webp?e=1791763200&s=Ck9pR3vZq2mTd8LwXa5nHy",
"updated_at": "2026-08-26T17:47:39.900Z"
},
{
"id": "m5",
"code": "m5",
"slug": "abyss-eye",
"legacy_id": null,
"name": "Abyss Eye",
"series": null,
"region": "JP",
"release_date": "2026-05-22",
"total": 118,
"printed_total": null,
"ptcgo_code": null,
"symbol_url": null,
"logo_url": "https://img.pokemontcgapi.com/media/sets/M5/logo-normal.webp?e=1791763200&s=Vt4bN7xQe1sJk0pM6cWyRz",
"updated_at": "2026-08-26T17:47:39.900Z"
}
],
"meta": { "limit": 2, "count": 2, "total_count": 379, "has_more": true },
"links": { "next": "https://api.pokemontcgapi.com/v1/sets?limit=2®ion=JP&cursor=eyJrIjpbIjIwMjYtMDUtMjJUMDA6MDA6MDAuMDAwWiJdLCJ..." }
}Print region is not language
Two things get confused here, so the API keeps them apart. The print region says where a card was printed; lang says which language you want the card name in. lang=ja on a Western card returns its Japanese name where we hold one; a Japanese card has a Japanese name to begin with. Card names exist in eight locales, and a missing translation falls back to English rather than returning an empty string.
Prices on the Japanese line
Japanese printings are priced where a source covers them, in the same row format as everything else: source, basis, currency, date. Coverage is thinner than on the Western line and uneven across eras, and Cardmarket figures for Japanese cards are re-read about every 48 hours rather than daily. The honest way to check is the per-region section of the coverage page, which reports how many sources and which currencies a probe card from each region returns today.
What it is not
Read this before you build on it. Every line here is a support ticket somebody else already opened.
- No sets printed in Korea
- The sets printed in Korea are not in the catalogue today, and neither are their card names. The API accepts
region=KRandlang=koand answers with an empty page, not an error. - No game text on Japanese cards
- Attacks, abilities and rules text are held in English for Western printings only. On a Japanese card those fields are null, which means "not held", not "has none".
- Thinner price coverage
- Expect fewer price rows per Japanese card than per Western card, and check
as_ofon each.
Questions people ask before signing up
- Does the API include Japanese-exclusive sets?
- Yes. The Japanese print line is its own region with its own sets, including those that were never released in the West. List them with GET /v1/sets?region=JP. Coverage, measured live
- How do I match a Japanese card to its English version?
- Western cards carry jp_twin_id where the pairing is known; request that id to get the Japanese printing. The pairing is not complete, so treat a null as unknown rather than as "no Japanese printing".
- Are Japanese card names in Japanese?
- Yes. Japanese cards have Japanese names, and lang=ja returns Japanese names for Western cards where we hold them. Names exist in eight locales: English, French, German, Japanese, Italian, Spanish, Portuguese and Simplified Chinese.
- Is the Japanese catalogue on the trial?
- Yes. Every catalogue route and every image is on the trial key, Japanese and Chinese sets included; only the plan decides how much price history and which price rows come with them. Free trial key