# Set

> An expansion: codes, totals, release date, print region and the artwork that identifies it.

Source: https://pokemontcgapi.com/docs/objects/set

`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

`set.json`

```json
{
  "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.
