To get TCGplayer price history programmatically, use Scavio's TCGplayer API. POST /api/v1/tcgplayer/price-history with a product id and "range": "annual" returns 52 weekly buckets for every condition and printing of the card: market price, copies sold, transactions and the low and high sale price, with and without shipping. Find the product id with /search or /suggestions, read today's market price per condition with /product, and add the 5 latest sales and live listings. Every call costs 1 credit, $1 per 1,000 requests on the Growth plan.
TCGplayer's own API is closed to new developers ("We are no longer granting new API access at this time", says its getting-started page), and the price chart on tcgplayer.com is a picture, not data. The steps below get the same numbers as JSON with one Scavio key. Every response was captured on November 9, 2026. The example card is Umbreon ex 161/131 from Prismatic Evolutions.
Step 1: Find the card
curl -s https://api.scavio.dev/api/v1/tcgplayer/suggestions \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "umbreon ex 161"}'The search box's autocomplete, captured in 2.6 seconds:
{
"query": "umbreon ex 161",
"count": 1,
"products": [
{
"product_id": 610516,
"name": "Umbreon ex - 161/131",
"url": "https://www.tcgplayer.com/product/610516/pokemon-sv-prismatic-evolutions-umbreon-ex-161-131",
"set_name": "SV: Prismatic Evolutions",
"game": "Pokemon",
"score": 26
}
],
"sets": [],
"games": [{ "name": "Pokemon", "count": 1 }]
}Suggestions has no game filter and mixes games, so check game on the row. For a broader search with prices on every row, use /search with query, game (pokemon, magic, yugioh, pokemon-japan...) and up to 50 results a page. If you already have a tcgplayer.com link, the number after /product/ is the product id.
Step 2: Read today's market price per condition
curl -s https://api.scavio.dev/api/v1/tcgplayer/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": 610516}'Captured in 4.6 seconds (images, card text, attributes and the details table trimmed):
{
"product_id": 610516,
"name": "Umbreon ex - 161/131",
"url": "https://www.tcgplayer.com/product/610516/pokemon-sv-prismatic-evolutions-umbreon-ex-161-131",
"game": "Pokemon",
"set_name": "SV: Prismatic Evolutions",
"set_code": "PRE",
"set_id": 23821,
"number": "161/131",
"rarity": "Special Illustration Rare",
"release_date": "2025-01-17",
"market_price": 1186.84,
"median_price": null,
"lowest_price": 4.99,
"lowest_price_with_shipping": 966.3,
"listing_count": 110,
"seller_count": 77,
"sku_count": 5,
"skus": [
{ "sku_id": 8489728, "condition": "Near Mint", "printing": "Holofoil", "language": "English", "market_price": 1186.84, "lowest_sale_price": 1059.67, "highest_sale_price": 1379.99, "sale_count": 25, "calculated_at": "2026-11-08T16:40:47.538Z" },
{ "sku_id": 8489729, "condition": "Lightly Played", "printing": "Holofoil", "language": "English", "market_price": 1188.7, "lowest_sale_price": 966.28, "highest_sale_price": 1299.99, "sale_count": 11, "calculated_at": "2026-11-05T06:10:47.391Z" },
{ "sku_id": 8489730, "condition": "Moderately Played", "printing": "Holofoil", "language": "English", "market_price": 1069.75, "lowest_sale_price": 1039.01, "highest_sale_price": 1100, "sale_count": 4, "calculated_at": "2026-10-22T00:28:26.024Z" },
{ "sku_id": 8489731, "condition": "Heavily Played", "printing": "Holofoil", "language": "English", "market_price": null, "lowest_sale_price": null, "highest_sale_price": null, "sale_count": null, "calculated_at": null },
{ "sku_id": 8489732, "condition": "Damaged", "printing": "Holofoil", "language": "English", "market_price": null, "lowest_sale_price": null, "highest_sale_price": null, "sale_count": null, "calculated_at": null }
]
}Read each SKU as one condition x printing x language. Near Mint's $1,186.84 market price came from 25 recent sales between $1,059.67 and $1,379.99; sale_count tells you how much to trust it, which is why Lightly Played, on 11 sales, can sit above Near Mint. Heavily Played and Damaged have no recent sales and a null market price, which means no price, not $0. The top-level lowest_price of $4.99 is the cheapest live listing of any kind, here a custom listing for a different version (Step 5), so never quote it as the card's price.
Step 3: Pull a year of price history
curl -s https://api.scavio.dev/api/v1/tcgplayer/price-history \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": 610516, "range": "annual"}'Captured in 0.96 seconds (4 of 5 SKUs, the daily averages and 48 of the Near Mint SKU's 52 weekly buckets trimmed; the newest two, one from May and the oldest kept):
{
"product_id": 610516,
"range": "annual",
"sku_count": 5,
"totals": { "quantity_sold": 348, "transaction_count": 342 },
"skus": [
{
"sku_id": 8489728,
"condition": "Near Mint",
"printing": "Holofoil",
"language": "English",
"total_quantity_sold": 289,
"total_transaction_count": 283,
"bucket_days": 7,
"buckets": [
{ "date": "2026-11-09", "market_price": 1186.84, "quantity_sold": 0, "transaction_count": 0, "low_sale_price": null, "low_sale_price_with_shipping": null, "high_sale_price": null, "high_sale_price_with_shipping": null },
{ "date": "2026-11-02", "market_price": 1186.84, "quantity_sold": 1, "transaction_count": 1, "low_sale_price": 1097, "low_sale_price_with_shipping": 1098.31, "high_sale_price": 1097, "high_sale_price_with_shipping": 1098.31 },
{ "date": "2026-05-04", "market_price": 1422.36, "quantity_sold": 4, "transaction_count": 4, "low_sale_price": 1482.22, "low_sale_price_with_shipping": 1487.21, "high_sale_price": 1500, "high_sale_price_with_shipping": 1501 },
{ "date": "2025-11-17", "market_price": 1119.08, "quantity_sold": 5, "transaction_count": 4, "low_sale_price": 1000, "low_sale_price_with_shipping": 1000.99, "high_sale_price": 1099.95, "high_sale_price_with_shipping": 1099.95 }
]
}
]
}Buckets are newest first, and the first is the current partial week. A bucket with no sales keeps the market price and has every sale price null. Plotted, the 52 Near Mint buckets show the card at $836.13 in the week of January 12, 2026, at a peak of $1,580.97 in the week of May 25 and at $1,186.84 now, with 289 copies sold over the year:
The other ranges trade length for resolution: month gives 30 daily buckets, quarter 3-day buckets and semi_annual weekly ones. For a new card, use month. Mega Rayquaza ex 138/103 from Delta Reign, released November 6, shows 9 Near Mint copies sold in the three days before release at a market price up to $409.32, then 42 on release day and 87 in three days as the market price fell to $309.09. Its buckets before the first sale read "market_price": 0, so treat 0 as no price. A product with no sales in the range returns 404, not charged; try a longer range first.
Step 4: Get the 5 latest sales
curl -s https://api.scavio.dev/api/v1/tcgplayer/sales \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": 610516}'All five rows, as captured in 0.6 seconds:
[
{ "date": "2026-11-07T17:01:22.577Z", "condition": "Near Mint", "printing": "Holofoil", "language": "English", "quantity": 1, "price": 200, "shipping_price": 0, "total_price": 200, "title": "*CHINESE* Terastal Gathering (CSV9.5C) Umbreon", "listing_type": "ListingWithPhotos" },
{ "date": "2026-11-07T15:36:39.327Z", "condition": "Near Mint", "printing": "Holofoil", "language": "English", "quantity": 1, "price": 165, "shipping_price": 0, "total_price": 165, "title": "Umbreon ex Korean 239/208", "listing_type": "ListingWithPhotos" },
{ "date": "2026-11-05T17:16:07.467Z", "condition": "Near Mint", "printing": "Holofoil", "language": "English", "quantity": 1, "price": 4.99, "shipping_price": 1.49, "total_price": 6.48, "title": "Chinese umbreon masterball", "listing_type": "ListingWithPhotos" },
{ "date": "2026-11-05T08:35:52.437Z", "condition": "Near Mint", "printing": "Holofoil", "language": "English", "quantity": 1, "price": 175, "shipping_price": 0, "total_price": 175, "title": "Umbreon EX Chinese", "listing_type": "ListingWithPhotos" },
{ "date": "2026-11-03T03:00:40.003Z", "condition": "Near Mint", "printing": "Holofoil", "language": "English", "quantity": 1, "price": 1097, "shipping_price": 1.31, "total_price": 1098.31, "title": "Umbreon ex - 161/131", "listing_type": "ListingWithoutPhotos" }
]This is the trap in sales data. Four of the five rows are custom listings sold on the card's page: Chinese and Korean versions at $4.99 to $200, all labelled Near Mint English. Only the last row, titled with the product name, is the card itself, at $1,097 plus $1.31 shipping, and it is the only sale in Step 3's bucket for the week of November 2. Compare title with the product name before you average anything. Five is all TCGplayer shows; there is no page 2, so use price history for volume.
Step 5: List live offers, standard listings only
curl -s https://api.scavio.dev/api/v1/tcgplayer/listings \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": 610516, "condition": ["Near Mint"], "limit": 50}'75 Near Mint listings, 50 on the page, in 2.5 seconds. The first row and the first standard row, as captured:
[
{ "listing_id": 4034226, "price": 4.99, "shipping_price": 1.49, "total_price": 6.48, "quantity": 6, "condition": "Near Mint", "printing": "Holofoil", "language": "English", "listing_type": "custom", "custom_title": "Chinese umbreon masterball", "photo_count": 1, "seller": { "key": "b5186e16", "name": "GoPokemonGo123", "rating_percent": 99.7, "sales": "7315", "gold_star": true, "state": "NH" } },
{ "listing_id": 516456541, "price": 1039.99, "shipping_price": 0, "total_price": 1039.99, "quantity": 1, "condition": "Near Mint", "printing": "Holofoil", "language": "English", "listing_type": "standard", "custom_title": null, "photo_count": 0, "seller": { "key": "ca86f619", "name": "Cash Cow Games", "rating_percent": 100, "sales": "50000+", "gold_star": true, "state": null } }
](Some seller and listing fields trimmed.) The response's facets count 57 standard and 18 custom listings. Sorted by price plus shipping, the first ten rows were all custom: Chinese, Japanese and graded versions from $6.48 to $400.45. The cheapest standard Near Mint copy was $1,039.99 with free shipping, 12% under the $1,186.84 market price. Filter on listing_type == "standard" for repricing or buy alerts. The listing's seller.key feeds /seller, /seller-feedback and /seller-products.
Step 6: Price a whole set at once
When you track a set rather than a card, skip the per-card calls. Get a set's set_id from /sets (Delta Reign is 24831), then:
curl -s https://api.scavio.dev/api/v1/tcgplayer/price-guide \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"set_id": 24831, "limit": 500}'356 rows for 141 cards in 0.9 seconds, has_more false. The two rows for the set's chase card:
[
{ "product_id": 728061, "name": "Mega Rayquaza ex - 138/103", "url": "https://www.tcgplayer.com/product/728061", "number": "138/103", "rarity": "Special Illustration Rare", "printing": "Holofoil", "condition": "Lightly Played Holofoil", "market_price": 300.5, "low_price": 300, "product_type": "Cards", "set_name": "ME06: Delta Reign", "set_abbreviation": "DLR", "game": "Pokemon" },
{ "product_id": 728061, "name": "Mega Rayquaza ex - 138/103", "url": "https://www.tcgplayer.com/product/728061", "number": "138/103", "rarity": "Special Illustration Rare", "printing": "Holofoil", "condition": "Near Mint Holofoil", "market_price": 309.09, "low_price": 300, "product_type": "Cards", "set_name": "ME06: Delta Reign", "set_abbreviation": "DLR", "game": "Pokemon" }
]On foil rows condition carries the printing ("Near Mint Holofoil"); read printing for the printing. Save this once a day and you have a daily price history for every card in the set at 1 credit per 500 rows. product_type: "sealed" lists the set's booster boxes and bundles instead.
All 13 endpoints
| Endpoint | What it returns | Credits |
|---|---|---|
/api/v1/tcgplayer/search | Up to 50 cards or sealed products a page with market, median and lowest price, listing count and facets | 1 |
/api/v1/tcgplayer/product | One product with the market price, sale range and sale count of every SKU | 1 |
/api/v1/tcgplayer/price-history | Up to a year per SKU: market price, copies sold, transactions, low and high sale | 1 |
/api/v1/tcgplayer/sales | The 5 most recent sales with condition, price, shipping and title | 1 |
/api/v1/tcgplayer/listings | Live offers, up to 50 a page, with listing type and seller rating | 1 |
/api/v1/tcgplayer/price-guide | A whole set, one row per card per condition and printing, up to 500 rows | 1 |
/api/v1/tcgplayer/sets | Every set of a game, newest first, with set_id | 1 |
/api/v1/tcgplayer/games | All 71 product lines with url_name | 1 |
/api/v1/tcgplayer/suggestions | The search box's autocomplete with product ids | 1 |
/api/v1/tcgplayer/trending | The top 10 shopper searches, overall or per game | 1 |
/api/v1/tcgplayer/seller | A seller's profile and 365-day feedback summary | 1 |
/api/v1/tcgplayer/seller-feedback | Individual feedback from the last 365 days | 1 |
/api/v1/tcgplayer/seller-products | A seller's listed catalogue with their own prices | 1 |
Errors are not charged: an unknown product id or a range with no sales is a 404 and a temporary upstream failure a 502. Prices are tcgplayer.com's US marketplace prices in US dollars. There are no graded (PSA, BGS) prices and no buylist prices. For a side-by-side of every TCGplayer option, see the best TCGplayer price APIs; for sealed product stock at a warehouse club, see tracking Costco inventory for Pokemon cards.
Getting started
- Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required, enough for 50 TCGplayer calls.
- Copy your API key from the dashboard.
- Send a POST to
/api/v1/tcgplayer/price-historywith{"product_id": 610516, "range": "annual"}and your key in theAuthorizationheader.
Try the TCGplayer API free in the playground first, or call it from Claude and other agents through the MCP server.
Reference: TCGplayer API overview · price history · product · sales · listings · price guide · sets · search · suggestions
Frequently asked questions
How far back does TCGplayer price history go?
About a year through Scavio. /api/v1/tcgplayer/price-history takes four ranges: month (daily buckets), quarter (3-day), semi_annual and annual (weekly). The annual call for Umbreon ex 161/131 on November 9, 2026 started at the week of November 17, 2025. For anything older, store the data yourself from the day you start.
How is the TCGplayer market price calculated?
TCGplayer computes Market Price from recent sales of that condition and printing, not from current listings. Scavio's product endpoint shows the inputs next to each SKU's market price: the low and high of those sales and how many there were. For Umbreon ex 161/131 Near Mint, $1,186.84 rested on 25 sales between $1,059.67 and $1,379.99.
Can I see every past TCGplayer sale of a card?
No. TCGplayer shows only the five most recent sales of a product, and Scavio's /sales returns those five. For volume over time, price-history gives copies sold, transactions and the low and high sale price per day or week, which covers most tracking jobs without the individual sales.
Why does the cheapest TCGplayer listing look far below the market price?
Often it is not the same item. Custom listings can sell a different version or part of a product under the card's page: the cheapest Near Mint listings for Umbreon ex 161/131 were Chinese and Japanese versions from $4.99, against a $1,186.84 market price. Filter listings to listing_type standard; the cheapest standard copy was $1,039.99.
How much does TCGplayer price history cost with Scavio?
1 credit per call, whatever the range, $1 per 1,000 requests at the Growth rate of $1 per 1,000 credits. A year of history for 500 cards is 500 credits once. Errors such as a product with no sales in the range (404) are not charged, and new accounts get 50 free credits with no card.