Skip to main content
A card is one entry in one expansion. Charizard from Base Set is base1-4. Its id is the expansion id and the collector number joined by a hyphen, and it is stable, so it is the id to store against your own rows.

Printings

A card exists in more than one physical printing, and variants is the list of them. Two fields on a variant look similar and are not:
string
The printing: normal, holo, reverse. What was done to the card at the press.
string | null
The physical size: standard, jumbo. How big the piece of cardboard is.
They are different axes. A jumbo card and a holo card are not two options from one list, and rendering them side by side reads as though they were. Prices hang off the variant rather than off the card, because they differ per printing. A holo Charizard and a normal Charizard are not the same object to a buyer. For some cards this list differs from what other catalogs show. Treat variants as the set of printings you can price.

Prices

Every variant carries one price block:
array
USD, one entry per grade tier, each with grade, price and observed_on. On a card this is the ungraded tier alone: the price of a raw copy. There is no condition axis. An ungraded price folds every condition into one figure, so pricing a card takes no question about the state it is in.
integer | null
How many copies of this printing sold in the trailing year. Depth of the market, not money: never render it as a currency. null means nothing is matched to this printing, which is a different fact from 0, meaning nobody bought one.
Each entry carries its own observed_on, the day that price was seen. A printing nothing has priced comes back with an empty prices array, never a null. For every grade tier rather than ungraded alone, and for the full daily history rather than the latest figure, see Get card prices.

Change

array
Present only with ?include=change, and only when this card has a computed price movement. Absent otherwise, never [].
Every entry is for the same printing: this card’s headline printing, the one the prices above are read from. card_variant_id says which, and it is the field to match against variants above. printing is the type axis on its own, and several printings of one card can share it, as the four holo entries in the payload below do, which is why card_variant_id rather than printing is what identifies the entry. That is a different selection from the leaderboard’s: List biggest gainers and losers can name a different printing for the same card, because it picks whichever printing moved most in a direction rather than the one this card displays. One entry per computed window (1d, 7d, 30d today), each carrying card_variant_id, start_cents, end_cents, change_cents, change_bp (basis points, so +34.20% is 3420) and start_as_of, the day start_cents was actually observed. A window whose start price the headline printing has no reading for is left out of the array rather than filled from another printing, so read window off each entry instead of assuming all three are there. See Telling a held price from a stale one for what a start_as_of well before the window’s start means.

Images

image is { low, high }, or null where no art is available. Both rungs are always complete and ready to use, and the two may be the same URL where only one rendition exists, so you never have to branch on it. palette is up to four colours from the card art, most prominent first, as #rrggbb, for tinting a screen the card is on. Colours that appear only around the edge of the card, such as the printed border, are left out. Where the art carries a strong colour, palette[0] is that colour rather than a grey or a white the card has more of. A card whose art has no strong colour leads with its most prominent neutral instead, so check the value rather than assume a hue. It is null for a card with no image, and carries fewer than four entries where the art has fewer.

Example

This capture used ?include=change and still carries no change key, which is the documented behaviour rather than an omission: the key is absent both without the parameter and when the card has no computed movement. Price movement is measured from observed history, and the history behind it starts on 21.08.2026: the 7d window this card would be ranked in is not computable until a week of it exists.