ScavioScavio
Pricing
Tools
Sign InsGet Startedg
Blog
Tcgplayer7 min readNov 9, 2026

Struggling to Find a Pokemon Card Price API With Historical Data? Pull a Year of TCGplayer History, Then Keep Your Own

Scavio's TCGplayer API returns a year of weekly market price and copies sold for any Pokemon card or sealed product in one call; a weekly refresh extends it.

Scavio Team

Nov 9, 2026

Try the TCGplayer API free
scavio
Pokemon tcg / Price history
Tcgplayer

Yes, there is one now. Scavio's TCGplayer API returns TCGplayer's market price for any Pokemon card or sealed product, and POST /api/v1/tcgplayer/price-history with "range": "annual" adds a year of weekly market price, copies sold and the low and high sale per condition, in one call. Backfill each item in your portfolio with that call once, then refresh it weekly with "range": "month" and store the rows: the history keeps growing past a year. Every call is 1 credit, and Japanese sets are covered too.

The question comes from r/PokeInvesting, in a thread Google's AI Overview cites for "pokemon card price api". The poster was building a portfolio tracker for a TCG collection, had tried scraping TCGplayer and found it unreliable, and wanted "decent historical data, not just current market prices", with Japanese sets as a bonus. One reply noted that TCGplayer stopped giving out API access, which is still true: its developer docs say "We are no longer granting new API access at this time." Here is what the history looks like as data, captured on November 9, 2026.

What one call returns for a sealed product

Investors track sealed product as much as singles, so take the Prismatic Evolutions Elite Trainer Box (product 593355, found with /search and "product_type": "sealed"):

Bash
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": 593355, "range": "annual"}'

Captured (48 of 52 weekly buckets trimmed):

JSON
{
  "product_id": 593355,
  "range": "annual",
  "sku_count": 1,
  "totals": { "quantity_sold": 11479, "transaction_count": 6917 },
  "skus": [
    {
      "sku_id": 8355061,
      "condition": "Unopened",
      "printing": "Normal",
      "language": "English",
      "total_quantity_sold": 11479,
      "total_transaction_count": 6917,
      "average_daily_quantity_sold": 31,
      "average_daily_transaction_count": 19,
      "bucket_days": 7,
      "buckets": [
        { "date": "2026-11-02", "market_price": 117.06, "quantity_sold": 229, "transaction_count": 172, "low_sale_price": 99.39, "low_sale_price_with_shipping": 110, "high_sale_price": 125, "high_sale_price_with_shipping": 147.98 },
        { "date": "2026-10-05", "market_price": 123.35, "quantity_sold": 635, "transaction_count": 289, "low_sale_price": 99.99, "low_sale_price_with_shipping": 104.49, "high_sale_price": 209.29, "high_sale_price_with_shipping": 239.28 },
        { "date": "2026-03-16", "market_price": 211.83, "quantity_sold": 114, "transaction_count": 81, "low_sale_price": 187, "low_sale_price_with_shipping": 196.99, "high_sale_price": 229.99, "high_sale_price_with_shipping": 242.98 },
        { "date": "2025-11-17", "market_price": 128.16, "quantity_sold": 125, "transaction_count": 85, "low_sale_price": 104.79, "low_sale_price_with_shipping": 114.78, "high_sale_price": 154.99, "high_sale_price_with_shipping": 161.98 }
      ]
    }
  ]
}

That is the whole year for one box: 11,479 sold in 6,917 transactions. The market price was $128.16 in the week of November 17, 2025, peaked at $211.83 in the week of March 16, 2026, and was $117.06 on November 9, 44.7% under the peak and 8.7% under a year earlier. The busiest week was October 5, with 635 boxes sold. Two weekly lows in the year read $1 and $3.01, which are not boxes at those prices; for portfolio value use market_price, not the lowest sale.

Single cards work the same way, one series per condition. For Umbreon ex 161/131, one annual call returned 52 weeks for each of its 5 conditions: Near Mint went from $836.13 in January to $1,580.97 in May and $1,186.84 now, on 289 copies sold. How to get TCGplayer price history walks through that card call by call, with the chart.

Japanese sets

TCGplayer lists Japanese Pokemon as a separate product line, pokemon-japan, so you search it with "game": "pokemon-japan":

Bash
curl -s https://api.scavio.dev/api/v1/tcgplayer/search \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "umbreon ex", "game": "pokemon-japan", "product_type": "cards", "sort": "price_desc", "limit": 5}'

It returned 14 products. The first, as captured (featured listings and five fields trimmed):

JSON
{
  "product_id": 602681,
  "name": "Umbreon ex - 217/187",
  "url": "https://www.tcgplayer.com/product/602681/pokemon-japan-sv8a-terastal-fest-ex-umbreon-ex-217-187",
  "game": "Pokemon Japan",
  "game_id": 85,
  "set_name": "SV8a: Terastal Fest ex",
  "set_code": "SV8a",
  "set_id": 23909,
  "number": "217/187",
  "rarity": "Special Art Rare",
  "release_date": "2024-12-06",
  "market_price": 360.3,
  "median_price": null,
  "lowest_price": 10.99,
  "listing_count": 53
}

The product_id feeds /product and /price-history like any English card. These are TCGplayer's US marketplace prices in US dollars, not Japanese market prices in yen.

The portfolio tracker, in about 30 lines

Backfill once, refresh weekly, and keep every bucket. A month call returns 30 daily buckets, so a weekly refresh overlaps the last refresh and the upsert fills any gap.

Python
import sqlite3, requests

API = "https://api.scavio.dev/api/v1/tcgplayer/price-history"
HEADERS = {"Authorization": "Bearer sk_live_your_key"}  # load from your secret store
PORTFOLIO = {593355: 2, 610516: 1}  # product_id: quantity held

db = sqlite3.connect("portfolio.db")
db.execute("""CREATE TABLE IF NOT EXISTS history (
  sku_id INTEGER, product_id INTEGER, condition TEXT, printing TEXT,
  date TEXT, market_price REAL, quantity_sold INTEGER,
  PRIMARY KEY (sku_id, date))""")

def pull(product_id, rng):
    r = requests.post(API, headers=HEADERS, json={"product_id": product_id, "range": rng}, timeout=60)
    if r.status_code == 404:  # no sales in the range, not charged
        return
    r.raise_for_status()
    for sku in r.json()["data"]["skus"]:
        for b in sku["buckets"]:
            db.execute("INSERT OR REPLACE INTO history VALUES (?, ?, ?, ?, ?, ?, ?)",
                       (sku["sku_id"], product_id, sku["condition"], sku["printing"],
                        b["date"], b["market_price"], b["quantity_sold"]))

def backfill():          # once per new item: a year of weekly buckets
    for pid in PORTFOLIO:
        pull(pid, "annual")

def refresh():           # every week: 30 daily buckets
    for pid in PORTFOLIO:
        pull(pid, "month")
    db.commit()

Value the portfolio from the newest market_price of the SKU you actually hold (Near Mint Holofoil English, Unopened, and so on), and skip rows where it is 0 or missing, which mean no sales yet. Weekly and daily rows sit side by side after the first refresh; group by week if you chart the whole span.

What this can and cannot tell you

  • About a year back, then yours: the oldest bucket is about 52 weeks old. Everything older has to come from your own stored rows, so start storing now.
  • Market price, not a quote: market_price is TCGplayer's Market Price, computed from recent sales. For what a copy costs right now, /listings returns live offers; filter to listing_type standard, because custom listings sell other versions on the same page (the cheapest Near Mint Umbreon listings were Chinese and Japanese copies from $4.99).
  • Individual sales: /sales returns the 5 most recent only, and four of the Umbreon's five were those custom listings. Use history for volume.
  • Not covered: graded (PSA, BGS) prices, buylist prices, and markets other than TCGplayer's US marketplace. For eBay listings of graded cards, see eBay card prices by API.

A 300-item portfolio costs 300 credits to backfill and about 1,300 a month to refresh weekly, $1.30 at the Growth rate of $1 per 1,000 credits. The 50 free credits on signup cover the backfill of 50 items. To value a whole set at once, /price-guide returns up to 500 rows per call by condition. For every other way to get TCGplayer prices, see the best TCGplayer price APIs.

Try the TCGplayer API free, 50 credits, no card, or run the price-history call in the playground.

Reference: TCGplayer API overview · price history docs · search docs · product docs · listings docs · how to get TCGplayer price history

Frequently asked questions

Is there an API for Pokemon card prices with history?

Yes. Scavio's TCGplayer API returns TCGplayer's market price for any Pokemon card or sealed product, and /api/v1/tcgplayer/price-history adds up to a year of weekly market price, copies sold and the sale range per condition in one 1-credit call. There is no official Pokemon price API, and TCGplayer's own API is closed to new developers.

Does a Pokemon price API cover Japanese cards?

TCGplayer lists Japanese Pokemon as its own product line, pokemon-japan, so the same endpoints work on it. A search for Umbreon ex in pokemon-japan on November 9, 2026 returned 14 products, led by the Terastal Fest ex Special Art Rare at a $360.30 market price. Prices are in US dollars from TCGplayer's US marketplace.

How do I get Pokemon price history older than a year?

Store it. TCGplayer's history, and so any API reading it, goes back about a year. Backfill each card once with an annual price-history call, then refresh it every week with the month range, which returns daily buckets, and keep every row. Your history grows past a year from the day you start.

Is it better to scrape TCGplayer myself?

For a side project, usually not. Pages change, requests get blocked, and you end up maintaining the scraper instead of the tracker. An API returns the same data as JSON, does not charge for failed calls, and costs about $1.30 a month at the Growth rate to keep a year of weekly history fresh for 300 items.

Pokemon price history as JSON

  • A year of weekly prices in one call
  • Cards and sealed, English and Japanese
  • 1 credit a call, no TCGplayer key
Try the TCGplayer API free

50 free credits, no credit card

On this page

  1. What one call returns for a sealed product
  2. Japanese sets
  3. The portfolio tracker, in about 30 lines
  4. What this can and cannot tell you

Related articles

View all
  • scavio
    Trading cards / Price history
    Tcgplayer
    How to Get TCGplayer Price History Through an API: Market Price and Copies Sold per Condition
  • scavio
    Comparison / Trading cards
    Tcgplayer
    7 Best TCGplayer Price APIs in 2026: Scavio Prices a Whole Set by Condition in One Call, Plus a Year of Sold Volume
ScavioScavio

One scraper API for every social, search, e-commerce and real estate platform. Built for AI agents.

Product

  • Features
  • Pricing
  • Dashboard
  • Affiliates

Developers

  • Documentation
  • API Reference
  • Quickstart
  • MCP Integration
  • Python SDK

Alternatives

  • Tavily Alternative
  • SerpAPI Alternative
  • Firecrawl Alternative
  • Exa Alternative
  • Serper Alternative
  • Tavily vs Scavio
  • SerpAPI vs Scavio
  • All alternatives
  • Compare Scavio vs alternatives

Search APIs

  • Google Search API
  • Amazon Product API
  • YouTube API
  • Reddit API
  • Walmart Product API
  • TikTok API
  • Instagram API

Tools

  • All Tools

© 2026 Scavio. All rights reserved.

Featured on TAAFT
Terms of ServicePrivacy Policy