Documentation
One API for TCGPlayer, Cardmarket, and eBay prices. Query raw + graded tiers and history data from one schema built for apps, dashboards, alerts, and AI workflows.
Cards
Search cards across every set. Filter by set, rarity, condition, and more. Fetch a single card for TCGPlayer (USD) and Cardmarket (EUR) prices.
GET /v1/cardsSets
Browse all Pokemon card sets with card counts and metadata.
GET /v1/setsSealed
Browse sealed products — booster boxes, ETBs, bundles, and more. Fetch a single product for its pricing, plus live TCGplayer and Cardmarket offers and eBay sold comps.
GET /v1/sealedPrices
Historical price data with daily averages, highs, lows, and sale counts.
GET /v1/cards/:id/prices/historyListings
Live TCGplayer and Cardmarket marketplace offers, plus recent eBay sold listings with grading data. Every source covers cards and sealed products.
GET /v1/cards/:id/listings/cardmarketQuick start
Get up and running with the API in under 5 minutes. Access real-time pricing data for over 70,000 Pokemon cards including PSA, BGS, and CGC graded values.
Get an API key
Sign up and create a key in the dashboard.
Add the header
Include your API key in requests.
Query data
Access cards, sets, and pricing.
curl -H "X-API-Key: YOUR_API_KEY" \"https://api.pkmnprices.com/v1/cards?name=charizard&per_page=5"
Authentication
All API requests require your API key in the X-API-Key header. Get your free API key at the dashboard.
X-API-Key: YOUR_API_KEY
SDKs
Official SDKs for JavaScript / TypeScript and Python. Typed methods for every endpoint, API-key auth handled for you, auto-paginating iterators, and editor autocomplete on params and responses.
npm install @pkmnprices/sdk
import { PkmnPrices } from "@pkmnprices/sdk";const client = new PkmnPrices({apiKey: process.env.PKMNPRICES_API_KEY});// Search cards — fully typed params and responseconst { data } = await client.cards.list({name: "charizard",per_page: 5});// Fetch one card with TCGplayer (USD) or Cardmarket (EUR) pricesconst charizard = await client.cards.get(data[0].id, {currency: "usd"});// Every row has one market_price for its exact condition and printing variantconsole.log(charizard.prices[0].market_price); // 285// Cursor-paginated Cardmarket offers are language-matched to the cardconst offers = await client.cards.listings.cardmarket(charizard.id, {condition: "Near Mint",variant: "Reverse Holo"});console.log(offers.data[0]?.seller, offers.data[0]?.price);// Sealed products support the same currency filterconst box = await client.sealed.get(5678, { currency: "eur" });console.log(box.cardmarket_url, box.prices[0]?.market_price);
LLM Integration
Point coding agents at /llm.md for a concise markdown reference, or /openapi.json for the full machine-readable schema. Drop the prompt below into an LLM system prompt so it knows how to query card prices, filter by set or condition, and parse responses correctly.
Cards
/v1/cards1 credit per item returnedSearch and filter Pokemon cards across all sets and languages. Supports full-text name search, price range filtering, and sorting. Does not return price data — fetch a single card via GET /v1/cards/:id for prices. Free tier is limited to English cards: Japanese and German require Pro or Business.
Parameters
namestringFilter by card name (partial match supported).
numberstringFilter by card number within the set.
total_set_numberstringFilter by total set number (e.g. "102" for Base Set).
set_idstringFilter by set ID.
tcg_player_idintegerFilter by TCGPlayer product ID.
languagestringCard language (e.g. "English", "Japanese", "German"). Free tier: English only; Japanese and German require Pro or Business.
raritystringCard rarity (e.g. "Rare Holo", "Common").
stagestringEvolution stage (e.g. "Basic", "Stage 1", "Stage 2").
card_typestringCard type (e.g. "Fire", "Water", "Trainer").
weaknessstringWeakness type (e.g. "Water").
energy_typestringAttack energy type the card uses (e.g. "Fire"). Matches cards whose energy types include the value.
currencystringPrice currency used by price filters and sorting. "usd" uses TCGPlayer; "eur" uses Cardmarket and requires Pro or higher.
conditionstringCard condition (e.g. "Near Mint", "Lightly Played", "Moderately Played").
variantstringCard variant (e.g. "Normal", "Reverse Holo", "1st Edition").
gradestringPSA/BGS/CGC grade value.
min_pricenumberMinimum market price in the selected currency.
max_pricenumberMaximum market price in the selected currency.
sortstringSort order. One of "price_asc", "price_desc", "name_asc", "name_desc".
pagenumberPage number for pagination. Defaults to 1.
per_pagenumberResults per page. Maximum 100. Defaults to 50.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/cards
/v1/cards/:id1 creditRetrieve a single Pokemon card by its unique ID, including all price data, Cardmarket mapping identifiers, and gameplay attributes (stage, type, HP, weakness, resistance, retreat cost, energy type, ability, attacks, and flavor text). The nullable cardmarket_url and cardmarket_product_id fields identify the exact mapped Cardmarket product. These fields and gameplay attributes are returned only by this endpoint, not the list endpoints. Prices come from TCGPlayer (USD) and Cardmarket (EUR) — use the currency parameter to select which source is returned. Every price object contains one market_price for its exact condition and printing variant.
Parameters
idintegerrequiredThe unique card ID.
currencystringPrice source/currency. "usd" returns TCGPlayer prices, "eur" returns Cardmarket prices. Omit it to receive every currency your plan allows. Cards without Cardmarket data return an empty prices array for "eur".
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/cards/{id}
Sets
/v1/sets1 credit per item returnedRetrieve a paginated list of all Pokemon card sets. Supports name search and language filtering.
Parameters
namestringFilter by set name (partial match supported).
languagestringFilter by language (e.g. "English", "Japanese", "German").
pagenumberPage number for pagination. Defaults to 1.
per_pagenumberResults per page. Maximum 100. Defaults to 50.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/sets
Sealed Products
/v1/sealed1 credit per item returnedSearch and filter sealed Pokemon products such as booster boxes, ETBs, and tins. Does not return price data — fetch a single product via GET /v1/sealed/:id for prices. Pro and Business tiers only.
Parameters
namestringFilter by product name (partial match supported).
set_idstringFilter by set ID.
languagestringProduct language (e.g. "en", "jp").
currencystringPrice currency for min/max/sort filters. "usd" (TCGPlayer) or "eur" (Cardmarket). EUR requires Pro+.
min_pricenumberMinimum market price filter (in the requested currency).
max_pricenumberMaximum market price filter (in the requested currency).
sortstringSort order. One of "price_asc", "price_desc", "name_asc", "name_desc".
pagenumberPage number for pagination. Defaults to 1.
per_pagenumberResults per page. Maximum 100. Defaults to 50.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/sealed
/v1/sealed/:id1 creditRetrieve a single sealed Pokemon product by its unique ID, including price data and Cardmarket mapping identifiers. The nullable cardmarket_url and cardmarket_product_id fields identify the exact mapped Cardmarket product (list endpoints omit them). Prices come from TCGPlayer (USD) and Cardmarket (EUR) — use the currency parameter to select which source is returned. Pro and Business tiers only.
Parameters
idintegerrequiredThe unique sealed product ID.
currencystringPrice source/currency. "usd" returns TCGPlayer prices, "eur" returns Cardmarket prices. Products without Cardmarket data return an empty prices array for "eur".
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/sealed/{id}
Price History
/v1/cards/:id/prices/history1 credit per item returnedRetrieve daily price aggregates for a card over a specified time period. Use the currency parameter to choose the source: USD history comes from TCGPlayer, EUR history from Cardmarket. Those are the only two sources of price history; eBay sold comps are individual sales and are available on /v1/cards/:id/listings/ebay instead. Both sources are grouped by condition and printing variant, so one date yields several rows. The avg, low, and high fields are historical daily aggregates; current prices use the single market_price field on GET /v1/cards/:id.
Parameters
idstringrequiredThe unique card ID.
currencystringPrice source/currency. "usd" returns TCGPlayer history, "eur" returns Cardmarket history. Omit it to receive every currency your plan allows.
periodstringTime period in days, from "1d" through "365d". Defaults to 30d.
conditionstringFilter to one condition, matched exactly. TCGPlayer uses "Near Mint", "Lightly Played", "Moderately Played", "Heavily Played", "Damaged"; Cardmarket uses "Mint", "Near Mint", "Excellent", "Good", "Light Played", "Played", "Poor".
variantstringFilter to one printing variant, matched exactly, e.g. "Holofoil" or "Reverse Holofoil".
limitnumberRows per page, not days (max 365). A row is one date/source/currency/condition/variant combination, so a card with five conditions returns five rows per day and the default of 30 covers about six days. Page through with pagination.total_pages, raise this value, or narrow the result with condition and variant. Defaults to 30.
pagenumberPage number for pagination. Defaults to 1.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/cards/{id}/prices/history
Cardmarket Listings
/v1/cards/:id/listings/cardmarket1 credit per item returnedRetrieve current Cardmarket seller offers in EUR. Results are automatically restricted to the card's set language, so an English card cannot return German listings. Supports price-keyset pagination and native Cardmarket conditions. Reverse Holo and Reverse Holofoil are accepted as equivalent variant filters. Offers flagged signed, altered or graded are returned but do not contribute to the card's market price; grader and grade are parsed from seller comments where possible and may be null on a graded offer.
Parameters
idstringrequiredThe unique card ID.
conditionstringNative Cardmarket condition (e.g. "Mint", "Near Mint", "Excellent", "Good", "Light Played", "Played", "Poor").
variantstringPrinting variant (e.g. "Normal", "Holofoil", "Reverse Holofoil"). "Reverse Holo" is also accepted.
min_pricenumberMinimum offer price (EUR).
max_pricenumberMaximum offer price (EUR).
sortstringSort order. One of "price_asc", "price_desc". Defaults to price_asc.
limitnumberNumber of listings to return per page (max 20). Defaults to 20.
cursorstringOpaque pagination cursor returned from a previous response.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/cards/{id}/listings/cardmarket
Cardmarket Sealed Listings
/v1/sealed/:id/listings/cardmarket1 credit per item returnedRetrieve current Cardmarket seller offers for a sealed product, in EUR. Two things differ from the card endpoint: there is no variant filter, because every sealed offer is stored with an empty variant; and results are not restricted to one language, because a sealed product owns its offers outright rather than sharing a Cardmarket article across languages — read the language field on each row. Condition is usually null on sealed offers.
Parameters
idstringrequiredThe unique sealed product ID.
conditionstringNative Cardmarket condition. Rarely useful here — sealed offers usually carry no condition.
min_pricenumberMinimum offer price (EUR).
max_pricenumberMaximum offer price (EUR).
sortstringSort order. One of "price_asc", "price_desc". Defaults to price_asc.
limitnumberNumber of listings to return per page (max 20). Defaults to 20.
cursorstringOpaque pagination cursor returned from a previous response.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/sealed/{id}/listings/cardmarket
TCGplayer Listings
/v1/cards/:id/listings/tcgplayer1 credit per item returnedRetrieve live TCGplayer marketplace offers for a specific card — current asking prices in USD, not completed sales. Includes seller reputation (rating, sales count, Gold/Direct/Verified badges) and shipping cost. Supports cursor-based pagination. updated_at is not a freshness signal. It moves only when a listing's own price, quantity or seller details change, so a listing that has been live and unchanged for a month keeps a month-old value however recently we confirmed it. Read snapshot_at for freshness: it is when the product's listings were last confirmed against TCGplayer, identical for every row in a response because a snapshot replaces a product's listings wholesale. Listings refresh daily, so a snapshot_at well over a day old means that product's last fetch did not succeed and you are seeing the previous snapshot. It is null if no successful snapshot has been recorded since the field was introduced. We collect from a US vantage point with no shipping-destination filter, so a snapshot can contain offers TCGplayer's own site hides from you when you browse it from outside the US.
Parameters
idstringrequiredThe unique card ID.
conditionstringCondition filter (e.g. "Near Mint", "Lightly Played", "Moderately Played").
languagestringListing language filter (e.g. "English", "German", "Japanese"). This is the language of the marketplace offer, not of the card.
printingstringPrinting/variant filter (e.g. "Holofoil", "Normal", "Reverse Holofoil").
min_pricenumberMinimum offer price (USD).
max_pricenumberMaximum offer price (USD).
sortstringSort order. One of "price_asc", "price_desc". Defaults to price_asc.
limitnumberNumber of listings to return per page (max 20). Defaults to 20.
cursorstringPagination cursor returned from a previous response.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/cards/{id}/listings/tcgplayer
TCGplayer Sealed Listings
/v1/sealed/:id/listings/tcgplayer1 credit per item returnedRetrieve live TCGplayer marketplace offers for a specific sealed product — current asking prices in USD, not completed sales. Same response shape, filters, and cursor pagination as the card endpoint. Sealed offers normally carry condition "Unopened" with an empty printing, so those two filters rarely narrow anything here. snapshot_at applies here exactly as it does on the card endpoint: read it for freshness rather than updated_at.
Parameters
idstringrequiredThe unique sealed product ID.
conditionstringCondition filter. Sealed offers are normally "Unopened".
languagestringListing language filter (e.g. "English", "German", "Japanese"). This is the language of the marketplace offer, not of the card.
printingstringPrinting/variant filter. Normally empty for sealed products.
min_pricenumberMinimum offer price (USD).
max_pricenumberMaximum offer price (USD).
sortstringSort order. One of "price_asc", "price_desc". Defaults to price_asc.
limitnumberNumber of listings to return per page (max 20). Defaults to 20.
cursorstringPagination cursor returned from a previous response.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/sealed/{id}/listings/tcgplayer
eBay Listings
/v1/cards/:id/listings/ebay1 credit per item returnedRetrieve recent eBay sold comps for a specific card (graded and ungraded), in USD. Sourced from PriceCharting. Supports cursor-based pagination for large result sets. Each row carries an attribution of "exact", "shared" or "unknown". A variant and its base card can map to one source product page, and when they do, both serve the same sales with titles describing whichever printing actually sold. "shared" marks those rows: they are evidence about the group rather than about this specific card. "unknown" means the comp predates the printing being recorded. To poll for new comps, keep the highest ingested_at you have seen for a card and pass it back as since. ingested_at is when we collected the sale, which is not sold_at: collection runs regularly bring in sales that are weeks old, so a sale-date bound would step over them. The bound is exclusive and the timestamp ends in Z, so it goes back into a query string unescaped.
Parameters
idstringrequiredThe unique card ID.
gradedbooleantrue = graded only; false = ungraded only; omit = both. The two values are exact complements: every comp is returned by exactly one of them.
graderstringGrading company filter (e.g. "PSA", "BGS", "CGC").
gradestringGrade value filter (e.g. "10", "9.5", "9").
min_pricenumberMinimum sale price.
max_pricenumberMaximum sale price.
variantstringFilter by the printing the comp was collected under (e.g. "Holofoil", "Reverse Holofoil").
sincestringOnly comps ingested after this instant. Accepts an RFC 3339 timestamp or YYYY-MM-DD (midnight UTC). A malformed value returns 400 rather than being ignored. Filters on ingested_at, not sold_at.
sortstringSort order. One of "date_desc", "date_asc", "price_desc", "price_asc". Defaults to date_desc.
limitnumberNumber of listings to return per page (max 20). Defaults to 20.
cursorstringPagination cursor returned from a previous response.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/cards/{id}/listings/ebay
eBay Sealed Listings
/v1/sealed/:id/listings/ebay1 credit per item returnedRetrieve recent eBay sold comps for a specific sealed product, in USD. Sourced from PriceCharting. Same response shape as card eBay listings, without graded/grader/grade filters. Supports cursor-based pagination. Pro and Business tiers only. attribution is returned here too and means the same thing, but a sealed product maps one source page with no printing to distinguish, so the value describes the product and is identical for every row in a response. variant is always null and there is no variant filter.
Parameters
idstringrequiredThe unique sealed product ID.
min_pricenumberMinimum sale price.
max_pricenumberMaximum sale price.
sincestringOnly comps ingested after this instant. Accepts an RFC 3339 timestamp or YYYY-MM-DD (midnight UTC). Filters on ingested_at, not sold_at.
sortstringSort order. One of "date_desc", "date_asc", "price_desc", "price_asc". Defaults to date_desc.
limitnumberNumber of listings to return per page (max 20). Defaults to 20.
cursorstringPagination cursor returned from a previous response.
Try it
curl -H "X-API-Key: YOUR_API_KEY" \https://api.pkmnprices.com/v1/sealed/{id}/listings/ebay
Errors
The API uses standard HTTP status codes. All error responses include a JSON body with error.code, error.message and error.docs_url fields. docs_url points at the section of these docs that explains how to resolve that class of error, so you can surface it straight from a caught exception.
| Status | Code | Description |
|---|---|---|
400 | bad_request | Invalid request parameters |
401 | unauthorized | Missing or invalid API key |
403 | forbidden | API key lacks permission for this resource |
404 | not_found | Resource not found |
429 | rate_limited | Too many requests — slow down |
500 | internal_error | Something went wrong on our end |
{"error": {"code": "unauthorized","message": "Missing or invalid API key. Pass a valid key in the X-API-Key header.","docs_url": "https://www.pkmnprices.com/docs#authentication"}}
Rate Limiting
Credits are charged based on the number of items returned in each response. Single-item lookups cost 1 credit. List endpoints cost 1 credit per item in the response. Credits reset daily at midnight UTC. Rate limits are per account, not per API key.
| Plan | Daily credits | Rate limit | API keys |
|---|---|---|---|
| Free | 500 | 60 req/min | 1 |
| Pro | 20,000 | 60 req/min | 5 |
| Business | 200,000 | 200 req/min | Unlimited |
When rate limited, you'll receive a 429 status code. Wait and retry with exponential backoff.
Support
Every error response carries a docs_url pointing at the section that explains it. For anything it doesn't cover, ask us directly.
- Discord — the fastest route to an answer, and where API questions get discussed.
- [email protected] — for account, billing and plan questions.
- Status — uptime, latency, and how recently each pricing source was synced.