Prices feed
The prices feed lists the current price of every product in a game. It's rebuilt when the game's prices are refreshed.
Get the download link from GET /v1/feeds/{gameId}/prices, then read it as described in the feeds overview. One product per line; join to the catalog feed by product id (productId here, id there).
The whole file is a single snapshot — when it was built is the generatedAt (and lastRefreshedAt) returned by that endpoint, not a field on each line.
Each record is the same shape as the response of GET /v1/products/{productId}/prices, plus a date on each cardmarket / tcgplayer block — the calendar day that marketplace snapshot is for. The feed is that endpoint's answer for every product in the game, in one file.
Record shape
{
"productId": 50212,
"pricesByFinish": {
"Standard": {
"cardmarket": {
"currency": "EUR",
"low": 38.90,
"mid": 44.50,
"high": 59.99,
"marketValue": 43.75,
"change24h": 0.4,
"change7d": -1.2,
"change30d": 5.7,
"date": "2026-06-10"
},
"tcgplayer": {
"currency": "USD",
"low": 42.50,
"mid": 48.00,
"high": 64.99,
"marketValue": 47.20,
"change24h": 0.2,
"change7d": -0.8,
"change30d": 6.1,
"date": "2026-06-10"
},
"cardnexus": {
"low": { "amount": 38.50, "currency": "EUR" },
"listingCount": 14,
"availableQuantity": 26,
"regions": {
"eu": {
"currency": "EUR",
"low": 38.50,
"listingCount": 12,
"availableQuantity": 23,
"byCondition": {
"NM": {
"low": 42.00,
"listingCount": 7,
"availableQuantity": 11,
"byLanguage": {
"de": { "low": 45.50, "listingCount": 2, "availableQuantity": 3 },
"en": { "low": 42.00, "listingCount": 5, "availableQuantity": 8 }
}
},
"LP": {
"low": 38.50,
"listingCount": 5,
"availableQuantity": 12,
"byLanguage": {
"en": { "low": 38.50, "listingCount": 5, "availableQuantity": 12 }
}
}
}
},
"na": {
"currency": "USD",
"low": 47.00,
"listingCount": 2,
"availableQuantity": 3,
"byCondition": {
"NM": {
"low": 47.00,
"listingCount": 2,
"availableQuantity": 3,
"byLanguage": {
"en": { "low": 47.00, "listingCount": 2, "availableQuantity": 3 }
}
}
}
}
}
}
},
"Foil": {
"cardmarket": {
"currency": "EUR",
"low": 72.00,
"mid": 81.50,
"high": 99.00,
"marketValue": 79.90,
"change24h": 0.1,
"change7d": 2.2,
"change30d": 3.1,
"date": "2026-06-10"
}
}
}
}
| Field | Type | Description |
|---|---|---|
productId |
number | The product these prices belong to. Matches id in the catalog feed. |
pricesByFinish |
object | Price blocks keyed by finish (e.g. Standard, Foil). See below. |
The pricesByFinish object
pricesByFinish is keyed by the product's finishes — the same values you see in the catalog feed's finishes array. A product with two finishes has two keys; a single-finish product has one.
Each finish carries up to three price blocks: cardmarket (Cardmarket's daily snapshot, in EUR), tcgplayer (TCGplayer's daily snapshot, in USD), and cardnexus (listings live on the CardNexus marketplace). A block is present only when its source has data — a finish with no live listings has no cardnexus block, and a product with no prices and no live listings is absent from the feed entirely.
The cardmarket and tcgplayer blocks
| Field | Type | Description |
|---|---|---|
currency |
string | EUR for cardmarket, USD for tcgplayer. Every price in the block is in this currency. |
low |
number? | Lowest observed price, in decimal major units (e.g. 38.90 is €38.90). Absent when unknown. |
mid |
number? | Median observed price. Absent when unknown. |
high |
number? | Highest observed price. Absent when unknown. |
marketValue |
number? | Aggregate market price — the value shown as the canonical price on cardnexus.com. Absent when unknown. |
change24h |
number | null | Percent change of marketValue vs. 24 hours ago. null when there's not enough history. |
change7d |
number | null | Percent change of marketValue vs. 7 days ago. |
change30d |
number | null | Percent change of marketValue vs. 30 days ago. |
date |
string | The calendar date the snapshot is for, YYYY-MM-DD. Prices are daily snapshots. |
The cardnexus block
Each finish can also carry a cardnexus block summarising the listings live on the CardNexus marketplace when the feed was built. It's present only when the finish has at least one live listing in stock. The block's snapshot time is the file's generatedAt, returned by the feed endpoint.
The top level is the marketplace-wide view; regions breaks the same numbers down per market region, each in its region's currency.
| Field | Type | Description |
|---|---|---|
low |
object | The cheapest live listing for this finish anywhere on the marketplace, converted to EUR at the exchange rate in effect when the feed was built: { "amount": 38.50, "currency": "EUR" }. |
listingCount |
number | How many live listings the finish has, across every region. |
availableQuantity |
number | Total quantity for sale across those listings. |
regions |
object | The same numbers per market region, keyed eu and na. A region with no live listings has no key. |
Each region:
| Field | Type | Description |
|---|---|---|
currency |
string | EUR for eu, USD for na. Every one of the region's prices is in this currency; listings from sellers in the region priced in another currency are converted into it at the exchange rate in effect when the feed was built. |
low |
number | The cheapest live listing from sellers in this region, in decimal major units (e.g. 38.50 is €38.50). |
listingCount |
number | How many live listings sellers in this region have. |
availableQuantity |
number | Total quantity for sale across those listings. |
byCondition |
object | The same three numbers per card condition. See below. |
A listing belongs to the region of its seller's country: the United States and Canada are na, everywhere else is eu. When no country is on file, the listing currency decides instead (USD and CAD mean na, every other currency means eu). Every listing belongs to exactly one region, and prices from one region are never mixed into the other region's.
byCondition is keyed by condition: NM (Near Mint), LP (Lightly Played), MP (Moderately Played), HP (Heavily Played), DMG (Damaged). Each condition carries low, listingCount, and availableQuantity for that condition, plus a byLanguage object with the same three numbers per card language (e.g. en, de).
Graded listings count toward the finish-level and region-level low, listingCount, and availableQuantity, but have no condition bucket — so the condition buckets can add up to less than the region totals.
Related
- Catalog feed — product names and attributes, joined by product id
- Feeds overview — file format and how to download