BanlistEntry rows, one per format the Card has been ruled on. This page explains why, and how to read them.
The shape
Every Card carries abanlists array:
Fields
| Field | Type | Meaning |
|---|---|---|
id | string | Stable identifier for this entry. Use it to reference a specific ruling. |
format_id | string | null | The format this entry applies to. null means the entry applies globally — rare; typically only used for cards that are illegal everywhere because they were never released. |
legality | string | One of: legal, semi_limited, limited, banned, illegal. See Enums → legality. |
effective_date | string | null | ISO date the entry started taking effect. null means “since the format’s inception”. |
lift_date | string | null | ISO date the entry stops taking effect. null means “still in effect today”. |
How to read it
To know a Card’s legality right now, in a specific format:- Filter
banliststo entries whereformat_idmatches the format you care about. - Filter to entries where
effective_dateis in the past (ornull) andlift_dateis in the future (ornull). - The entry that survives is the active legality. There should be exactly one; if there are more, take the most recent
effective_date.
BanlistEntry rows for restrictions, not for the affirmative “this card is legal.” A clean banlist array means the Card is legal in every active format.
Historical lookups
Because entries carryeffective_date and lift_date, you can ask “was this Card legal in Standard on 2024-10-01?” without any external state. Pass a different now to the snippet above, and the same logic does point-in-time lookups.
This is the reason banlist entries are not removed when superseded — they’re closed off with lift_date and a new entry takes effect from the next day.
Formats themselves
The API exposes formats as opaque references informat_id. We don’t ship a /v1/formats resource today, but the canonical IDs in use are:
format_id | Description |
|---|---|
fmt-standard | Current Standard format. Most recent rotation. |
fmt-extended | Extended — broader card pool than Standard. |
fmt-classic | All-time format. Every released Card eligible. |
fmt-organized_play | OP-specific rulings (regionals, internationals). |
format_id you don’t recognize, treat the entry as informational and don’t gate anything on it.
Printing-level banlists
BanlistEntry also appears on the Printing DTO. This is unusual — most TCG APIs only ban at the Card level — but Elestrals occasionally rules on specific printings (e.g., a tournament-prize printing of an otherwise legal Card might be banned in standard play because the print run distorts the secondary market).
When a printing has its own banlists array, treat it as additive: a printing is restricted if either its parent Card or the printing itself has an active restriction.
Common mistakes
- Treating
banlists: []asbanned: true. It’s the opposite. Empty array means no restriction. - Comparing
effective_dateas a Date object. They’re plain ISO date strings (YYYY-MM-DD). String-comparing them is correct and faster. - Caching legality per Card without a TTL. Banlists update on a regular cadence (typically quarterly). Use the updated_since filter on
/v1/cardsif you need to keep a cache fresh.