Multi-Provider Daily Prices
Daily MTG price snapshots from Cardkingdom, Manapool, Cardsphere, Cardhoarder, Cardmarket and TCGPlayer in one API. Retail + buylist, normal/foil/etched, paper + MTGO. Snapshot, history and bulk endpoints — keyed by TCGPlayer productId or mtgjson uuid.
Slice the data however you need
Every endpoint accepts the same five optional filters. Combine them freely.
priceProvidercardkingdom · manapool · cardsphere · cardhoarder · cardmarket · tcgplayerproviderListingretail · buylistcardFinishnormal · foil · etchedgameAvailabilitypaper · mtgocurrencyUSD · EURTrend Prices API Endpoints
Authenticated via x-api-key. Same shape under /api/v1/trendprices/*.
/api/v2/trendprices/providersList recognized providers, listings, finishes, availabilities and currencies. Public discovery endpoint.
/api/v2/trendprices/:productIdLatest snapshot for a TCGPlayer productId, grouped by (provider, listing, finish, availability). Filterable.
/api/v2/trendprices/uuid/:uuidSame as /:productId but keyed by mtgjson uuid.
/api/v2/trendprices/:productId/historyFull price history. Filterable by provider, listing, finish, availability, from/to date. Paginated.
/api/v2/trendprices/uuid/:uuid/historySame history endpoint keyed by mtgjson uuid.
/api/v2/trendprices/bulkBody: { productIds: [...], provider?, listing?, finish? }. Up to 200 productIds per call. Returns latest snapshot per productId.
Example Responses
One row per (provider, listing, finish, availability) tuple per card.
{
"success": true,
"count": 6,
"data": [
{
"productId": 111268,
"uuid": "00010d56-fe38-...",
"priceProvider": "cardkingdom",
"providerListing": "buylist",
"cardFinish": "foil",
"gameAvailability": "paper",
"price": 6.5,
"currency": "USD",
"date": "2026-05-05",
"updateDate": "2026-05-06"
},
{
"productId": 111268,
"priceProvider": "cardkingdom",
"providerListing": "retail",
"cardFinish": "foil",
"price": 12.99,
"date": "2026-05-05"
},
{
"productId": 111268,
"priceProvider": "manapool",
"providerListing": "retail",
"cardFinish": "foil",
"price": 11.19,
"date": "2026-05-05"
}
]
}// Request
{
"productIds": [111268, 130289, 87],
"provider": "cardkingdom",
"listing": "buylist"
}
// Response
{
"success": true,
"count": 3,
"data": [
{
"productId": 111268,
"prices": [
{ "cardFinish": "foil",
"price": 6.5, ... },
{ "cardFinish": "normal",
"price": 1.25, ... }
]
},
{ "productId": 130289, "prices": [ ... ] },
{ "productId": 87, "prices": [ ... ] }
]
}Frequently Asked Questions
Which providers are included?
Cardkingdom, Manapool, Cardhoarder, Cardmarket and TCGPlayer have data today. Cardsphere is recognized as a valid provider value but has no rows yet — endpoints will start returning Cardsphere data automatically when the ingest lands, so you can pin against it now.
What can I filter by?
Five dimensions: priceProvider, providerListing, cardFinish, gameAvailability, plus a date range (?from / ?to as YYYY-MM-DD). All filters are optional.
How do I look up by TCGPlayer productId vs mtgjson uuid?
Both are first-class. /trendprices/:productId is keyed by TCGPlayer productId. /trendprices/uuid/:uuid is keyed by mtgjson uuid. Pick whichever your existing data already has.
How do I price many cards at once?
POST /trendprices/bulk with a body of { productIds: [...], provider?, listing?, finish?, availability? }. Up to 200 productIds per call.
Why does cardsphere return empty?
Cardsphere is recognized as a valid provider value but the underlying data ingest is still pending. Calls with ?provider=cardsphere will succeed and return an empty result set today; results will populate once ingest lands without any code change required.