TCGplayer Scraper - Card Prices & Price History
Pricing
from $2.30 / 1,000 tcgplayer card price delivereds
TCGplayer Scraper - Card Prices & Price History
Scrape TCGplayer card prices by card name, set or product URL for Pokemon, Magic, Yu-Gi-Oh!, One Piece, Lorcana and more: market, lowest and median price, price by condition and printing, listings count, set, rarity, optional price history with sales. Compare with the last run. Pay per card.
Pricing
from $2.30 / 1,000 tcgplayer card price delivereds
Rating
0.0
(0)
Developer
Scrapewise Data
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
3
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
TCGplayer Scraper pulls trading card prices from TCGplayer.com for Pokemon, Magic: The Gathering, Yu-Gi-Oh!, One Piece, Disney Lorcana and every other game on the site: market price, lowest price, median price, listings count, price by condition and printing, and a dated price history with sales. It is built for card shops, resellers and collectors who need a reference price, and for spreadsheets, pricing bots and AI agents that read it.
No login, no API key, no browser. The Actor reads the same public prices the TCGplayer website shows, and runs are fast.
What the TCGplayer scraper fixes
- One market price per card is not enough to price a shop. Each product can carry every variant it is sold in (printing, language and condition, each with its own stable
skuId) with the market price and 30 day sales of each, at no extra cost. - Big lists with gaps or repeats. A product is delivered and charged once per run, even when several terms find it or it moves between result pages.
- No public price history. The same series TCGplayer draws in its price chart comes back as rows: market price, quantity sold, number of sales, lowest and highest sale per period, up to 12 months.
- TCGplayer's developer API is closed to new access. This reads the public data the website shows any visitor.
- Paying for searches that found nothing. Empty searches, unknown sets, invalid links and blocked requests come back as free rows with an
errorCode.
TCGplayer scraper at a glance
- Price: US$ 3.00 per 1,000 products on Free, US$ 2.30 on Gold and above; from 1 Nov 2026 each run also has an Actor start event of US$ 0.005
- Price by condition and printing: included
- Price history: US$ 3.00 per 1,000 products, only when asked
- Games: every product line on TCGplayer, singles and sealed
- Filters: game, set, rarity, market price range, TCGplayer sort orders
Switching from another TCGplayer scraper? Your existing input works
| Their field | Read here as |
|---|---|
queries, searchQuery, query, q | searchQueries |
category, productLine | game |
set, expansion / rarityFilter | setName / rarity |
sortOption ("Best Selling", "Price: High to Low") | sortBy |
maxResults, limit (0 = no limit) | maxItems |
pageCount (50 products per page), maxListings | maxItemsPerQuery |
enrichData, scrapeDetails | includeDetails |
includeSalesHistory, range | includePriceHistory, historyRange |
min_price, max_price | minPrice, maxPrice |
TCGplayer scraper input examples
Search Pokemon for "charizard", 60 products (run of 2026-11-07, under 4 seconds):
{ "searchQueries": ["charizard"], "game": "pokemon", "maxItems": 60 }
Most expensive Lightning Bolt printings in Magic, with price by printing and condition:
{ "searchQueries": ["lightning bolt"], "game": "magic", "sortBy": "priceHighLow", "includeDetails": true, "maxItems": 5 }
Every chase card of one set, most expensive first:
{ "game": "pokemon", "setName": "151", "rarity": ["Special Illustration Rare"], "sortBy": "priceHighLow" }
Products you already know, by productId, with every variant priced:
{ "productUrls": ["8819", "38253"] }
Price history for cards you track:
{ "mode": "priceHistory", "productUrls": ["8819", "38253"], "historyRange": "annual" }
With an empty input the Actor searches "charizard" in Pokemon and returns 30 products.
Monitor TCGplayer prices on a schedule
- Run the search or product list you want to watch, then save the input as a Task.
- Turn on
compareWithPreviousRun. - Attach an Apify Schedule to the Task, for example daily.
{ "mode": "products", "productUrls": ["42382", "1174"], "compareWithPreviousRun": true }
Each run returns every product as usual, plus what changed since the run before: previousPrice (market price last time), priceChange and priceChangePct, isNewProduct (not seen before by this input), firstSeenAt and previousSeenAt. On the first run every product is new. The history lives in a key-value store on your own account named tcgplayer-prices-... (Storage, Key-value stores), and is saved after the products are delivered. To start over, delete that store or set a new snapshotName. It is not used in priceHistory mode.
What data the TCGplayer scraper returns
A product row with details (product ID 1174 in productUrls, run of 2026-11-07), shortened:
{"type": "product","productId": 1174,"productName": "Lightning Bolt","game": "Magic: The Gathering","setName": "Alpha Edition","rarity": "Common","currency": "USD","marketPrice": 630.0,"lowestPrice": 292.5,"lowestPriceWithShipping": 292.5,"medianPrice": 639.99,"totalListings": 19,"sellersCount": 10,"inStock": true,"nearMintMarketPrice": 630.0,"quantitySold30d": 1,"variantsCount": 5,"conditionPrices": [{"skuId": 15322, "printing": "Normal", "language": "English", "condition": "Near Mint", "marketPrice": 630.0, "quantitySold30d": 0, "lowSalePrice30d": null, "highSalePrice30d": null},{"skuId": 364268, "printing": "Normal", "language": "English", "condition": "Lightly Played", "marketPrice": 450.0, "quantitySold30d": 1, "lowSalePrice30d": 450.0, "highSalePrice30d": 450.0},{"skuId": 332752, "printing": "Normal", "language": "English", "condition": "Moderately Played", "marketPrice": null, "quantitySold30d": null, "lowSalePrice30d": null, "highSalePrice30d": null}],"attributes": {"description": "Lightning Bolt does 3 damage to one target.", "fullType": "Instant", "convertedCost": "1"},"url": "https://www.tcgplayer.com/product/1174/magic-alpha-edition-lightning-bolt"}
A variant with no sale in 30 days keeps its skuId with null prices, so the list of variants is the same from run to run.
A price history row (mode: priceHistory, 3 months), last points of the series:
{"type": "priceHistory","productId": 113670,"productName": "M Charizard EX","setName": "Generations","printing": "Holofoil","condition": "Near Mint","periodStart": "2026-06-19","periodEnd": "2026-09-14","currentMarketPrice": 163.98,"startMarketPrice": 157.66,"marketPriceChangePercent": 4.01,"totalQuantitySold": 25,"history": [{"date": "2026-09-11", "marketPrice": 163.98, "quantitySold": 1, "transactionCount": 1, "lowSalePrice": 144, "highSalePrice": 144},{"date": "2026-09-14", "marketPrice": 163.98, "quantitySold": 0, "transactionCount": 0, "lowSalePrice": null, "highSalePrice": null}]}
The dataset has four views: Card prices, Price by condition, Price history summary and Price history series (one line per date, ready for a chart).
TCGplayer price data fields
| Field | Description |
|---|---|
type | product, priceHistory or error |
productId, productName, game, setName, setCode | Product and set; reuse productId in productUrls |
cardNumber, rarity, cardType, energyType, sealed, releaseDate | Card attributes |
attributes | Other card attributes, by game: hp, stage, attack1, weakness (Pokemon), convertedCost, power, toughness (Magic), description, flavorText |
marketPrice | TCGplayer market price in USD, based on recent sales |
lowestPrice, lowestPriceWithShipping, medianPrice | Cheapest listing now, and median listed price |
totalListings, inStock | Listings offering it, and whether any copy can be bought right now |
sellersCount, productType, artist | With details: sellers offering it, product type (Cards, Sealed Products), artist |
marketPriceNormal, marketPriceFoil, printingPrices | Prices per printing, with buylist market price |
conditionPrices, variantsCount | With details: every variant (skuId, printing, language, condition) with market price, units sold and lowest and highest sale in 30 days |
nearMintMarketPrice, quantitySold30d | Near Mint English market price, and units sold in 30 days across variants |
currentMarketPrice, startMarketPrice, marketPriceChangePercent | History summary for the period |
lowestSalePrice, highestSalePrice, totalQuantitySold | Sales summary for the period |
history | Series of date, marketPrice, quantitySold, transactionCount, lowSalePrice, highSalePrice |
imageUrl, url, searchQuery, position, scrapedAt | Image, product page, the term that found the row and its position in that search, collection time |
previousPrice, priceChange, priceChangePct, isNewProduct, firstSeenAt, previousSeenAt | With compareWithPreviousRun: market price in the previous run and the change |
errorCode, error | Only on error rows |
TCGplayer scraper pricing
US$ 3.00 per 1,000 products (Bronze 2.70, Silver 2.50, Gold and above 2.30). Price by condition and printing is included. Price history is a separate event at US$ 3.00 per 1,000 products with history, one charge per product however many conditions and dates it returns. 1,000 Pokemon cards with price by condition cost US$ 3; with a 12 month history, US$ 6. Error rows and duplicates are free.
TCGplayer scraper limitations
- Prices are USD from the US marketplace, as TCGplayer shows them.
- Individual seller listings and the latest sales feed are not collected. You get aggregates: lowest price, median, listings, sellers and sales per period.
- TCGplayer returns at most 50 products per page and 10,000 per search. Split broad searches by game, set or rarity.
maxItemsis filled by search terms in order; setmaxItemsPerQueryto balance terms.bestMatchis TCGplayer's relevance order and it moves a little between runs (5 of 60 products near the cut changed in two runs minutes apart). For an identical list every run, useaToZor a price sort, or paste theproductIds inproductUrls.- A product can have no market price (no recent sales) or no history in the period; fields are then
null, and history-only products come back as freeNO_PRICE_HISTORYrows.
Error codes (never charged)
| errorCode | Meaning |
|---|---|
NO_RESULTS | The search found nothing |
SET_NOT_FOUND | No set matches setName |
INVALID_GAME | The game is not a TCGplayer product line |
INVALID_PRODUCT, PRODUCT_NOT_FOUND | The link or ID is not a product, or it was removed |
NO_PRICE_HISTORY | No sales in the history period |
BLOCKED | TCGplayer refused the request after retries |
TCGplayer scraper FAQ
Why not the official TCGplayer API? TCGplayer's developer API is closed to new access, so most people cannot get a key. This Actor needs no key or login and returns market, lowest and median prices, price by condition and printing, and a dated price history from the public website data.
What is the difference between market price, lowest price and median price? Market price is TCGplayer's estimate from recent completed sales. Lowest price is the cheapest listing now. Median price is the middle of current listings. Shops usually price from market price; buyers look at lowest price with shipping.
How do I get the Near Mint price of a card? Turn on includeDetails (or use products mode). Each product gets nearMintMarketPrice and the full conditionPrices list.
How far back does the history go? Up to 12 months with historyRange: "annual" (weekly points); month gives daily points.
How many products per run? As many as maxItems. A run of 320 products took under 90 seconds in our tests; 60 products without details took under 4 seconds.
Will I get the same product twice? No. A product is delivered and charged once per run, even when two terms find it or TCGplayer moves it between result pages, and a product sliding to the next page is still delivered. A run restarted by the platform continues from what was already delivered.
Can I use it from Google Sheets, n8n or an AI agent? Yes, through Apify integrations, the Apify nodes for n8n and Make, or the Apify MCP server (https://mcp.apify.com).
Is it legal? It reads public product prices without logging in and collects no seller or buyer data; how you use the data is your responsibility.
Japanese prices for the same card? Our Mercari Japan Scraper returns on-sale and sold listings from Mercari Japan in JPY, with price, condition and category filters, so a card can be compared between the US and Japan.
Related scrapers
- Mercari Japan Scraper: Mercari Japan listings, sold prices and image search.
- Yahoo Auctions Japan Scraper: sold prices and live listings from Yahoo Auctions Japan.
- Depop Scraper: Depop listings, prices, brands, sizes and shops.
- Google Shopping Scraper: Google Shopping prices, offers and EAN lookup.
Changelog
- 2026-11-07: output fields updated:
conditionPriceslists every variant of the product (stableskuId, printing, language, condition) even without recent sales, plusvariantsCount; newinStockandattributes(hp, stage, attacks, mana cost, power, toughness, flavor text...). Search pages no longer skip a product that moves between pages. - 2026-10-20: price monitoring:
compareWithPreviousRunadds the previous market price and the change to every product row. - 2026-09-15: first version: search with filters and sort orders, product details with price by condition, price history mode, four dataset views, free error rows, input names of other TCGplayer scrapers.