Set
An expansion: codes, totals, release date, print region and the artwork that identifies it.
id is the set code, not an internal UUID. Set codes are short strings like bs and sv3 — human-readable, stable and guessable, which is exactly what a UUID would take away from every id you already store.
615 sets are in the catalogue today, spread across three print regions. /v1/sets carries meta.total_count, so you can check that number yourself rather than trusting this sentence.
Fields
| Field | Type | Null | Description |
|---|---|---|---|
id | string | no | Same value as code. Present so code that stores one id field keeps compiling. |
code | string | no | Canonical code, e.g. bs. The natural key across every importer. |
slug | string | no | URL-safe name, e.g. base. Resolves anywhere code resolves. |
legacy_id | string | yes | Alternate string id for the set, e.g. base1 for bs. Null on sets that never had one — most Japanese and Chinese print lines. |
name | string | no | Printed set name. |
series | string | yes | Series name, e.g. Base. Null where the series is not mapped. |
region | string | no | WEST (176 sets), JP (379) or CN (60), counted 2026-08-27. KR is valid in the schema and matches no rows. The region decides which upstream is authoritative and which prices are comparable. |
release_date | date | yes | YYYY-MM-DD. The catalogue runs from 1996-10-20 to 2026-09-16. |
total | integer | yes | Cards in the set including secret rares. |
printed_total | integer | yes | The number printed on the card, e.g. 102 of a 134-card set. |
ptcgo_code | string | yes | Code used by the game client, e.g. BS. |
symbol_url | string | yes | Expansion symbol. Null on all 615 sets: our upstream carries the logo and not the symbol, so nothing is written here. Use logo_url, which is present on 613 of them. (This row read "frequently null" until 2026-09-03, which was a kinder word than the data deserved.) |
logo_url | string | yes | Set logo. |
updated_at | timestamp | no | ISO 8601, UTC. |
Example
{
"id": "bs",
"code": "bs",
"slug": "base",
"legacy_id": "base1",
"name": "Base",
"series": "Base",
"region": "WEST",
"release_date": "1999-01-09",
"total": 134,
"printed_total": 102,
"ptcgo_code": "BS",
"symbol_url": null,
"logo_url": "https://media.rarebit.app/sets/BASE/logo-normal.webp",
"updated_at": "2026-08-26T17:47:39.900Z"
}Asian print lines are separate sets
A Japanese set is its own set, with its own code, its own numbering and its own release date — not a translation of a Western one. region is how you keep the two apart, and ?region=JP on /v1/sets is a real filter that returns 379 rows.
lang on the card endpoints is a different thing entirely: it translates a printed name and does not change which set you are looking at.