Trend Prices API

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.

5 Filter Dimensions

Slice the data however you need

Every endpoint accepts the same five optional filters. Combine them freely.

priceProvidercardkingdom · manapool · cardsphere · cardhoarder · cardmarket · tcgplayer
providerListingretail · buylist
cardFinishnormal · foil · etched
gameAvailabilitypaper · mtgo
currencyUSD · EUR
6 Endpoints

Trend Prices API Endpoints

Authenticated via x-api-key. Same shape under /api/v1/trendprices/*.

GET/api/v2/trendprices/providers
Public

List recognized providers, listings, finishes, availabilities and currencies. Public discovery endpoint.

GET/api/v2/trendprices/:productId
Business+

Latest snapshot for a TCGPlayer productId, grouped by (provider, listing, finish, availability). Filterable.

GET/api/v2/trendprices/uuid/:uuid
Business+

Same as /:productId but keyed by mtgjson uuid.

GET/api/v2/trendprices/:productId/history
Business+

Full price history. Filterable by provider, listing, finish, availability, from/to date. Paginated.

GET/api/v2/trendprices/uuid/:uuid/history
Business+

Same history endpoint keyed by mtgjson uuid.

POST/api/v2/trendprices/bulk
Business+

Body: { 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.

GET /api/v2/trendprices/111268
{
  "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"
    }
  ]
}
POST /api/v2/trendprices/bulk
// 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.