PriceCharting Product Scraper
Pricing
from $1.50 / 1,000 products
PriceCharting Product Scraper
Scrape PriceCharting product data: current prices for every condition and grade, full price history, PSA/BGS/CGC values, POP report, recent sold listings, and images. Export as JSON, CSV, Excel.
Pricing
from $1.50 / 1,000 products
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
PriceCharting Product Scraper
Scrape PriceCharting product data by page URL or product ID — current prices for every condition and grade, the full month-by-month price history, PSA / BGS / CGC / SGC graded values, the graded POP report, per-grade sales volume, recent sold listings, and full-resolution images.
| Paste PriceCharting product URLs or numeric IDs and get back structured pricing for games, trading cards, comics, coins, Funko Pops, and LEGO sets — 20+ fields per product including a stable six-slot price mapping, the complete on-page price guide with every grading company, per-condition price-history series, and opt-in eBay / TCGPlayer / Goldin / PWCC / Heritage sold listings. |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.
Actor: parsebird/pricecharting-product-scraper — Scrape PriceCharting product prices, price history, graded values, POP report, and recent sales.Usage: from apify_client import ApifyClient; client = ApifyClient("YOUR_TOKEN"); run = client.actor("parsebird/pricecharting-product-scraper").call(run_input={"products": ["https://www.pricecharting.com/game/pokemon-base-set/charizard-4", "7141"], "scrapeProductDetails": True, "includeRecentSales": False, "proxyConfiguration": {"useApifyProxy": True}, "maxConcurrency": 3, "requestDelaySecs": 1, "maxItems": 0})Inputs: products (array, required — one product page URL or numeric product ID per line), scrapeProductDetails (bool, default true — include the full priceHistory series), includeRecentSales (bool, default false — adds recentSales, ~5x item size), priceChartingToken (string, secret, optional — resolves numeric IDs via the official API when details are off), proxyConfiguration (object, default Apify datacenter), maxConcurrency (int, default 3), requestDelaySecs (int, default 1, max 10), maxItems (int, default 0 = unlimited)Output fields: productId, productName, consoleName, category, url, releaseDate, genre, upc, epid, asin, imageUrl, images, flags, currency, prices {loose,cib,new,graded,boxOnly,manualOnly}, fullPrices (verbatim on-page labels), salesVolume, populationReport (cards: PSA & CGC per grade 1-10), recentSales (opt-in), priceHistory (per condition: {date, price}), source (scrape|api), scrapedAtFailures: unfetched inputs are not billed and are listed in the run's SUMMARY key-value record.API spec: https://apify.com/parsebird/pricecharting-product-scraper/apiGet token: https://console.apify.com/account/integrations
What is PriceCharting Product Scraper?
PriceCharting Product Scraper turns any PriceCharting product page into structured JSON. Give it a list of product page URLs or numeric product IDs and it returns current market prices for every condition slot, the complete on-page price guide (with PSA 10, BGS 10, CGC 10, SGC 10, plus Black Label and Pristine variants for cards), the full price-history time series, the graded population report, and — when you ask for it — the recent sold listings behind those prices.
It works as a PriceCharting API alternative: the official PriceCharting API needs a paid subscription and returns only current prices with no history, no images, and no sold listings. This scraper needs no subscription and returns all of it. If you do have a subscription, drop your token in and it will resolve numeric IDs through the official API when you only need current prices.
What can PriceCharting Product Scraper do?
- 💲 Current prices for all six PriceCharting condition/grade slots, with a stable key mapping you read per category (see the table below)
- 📊 Full price guide (
fullPrices) — every row of the on-page guide with labels exactly as shown: for cards that means Ungraded, Grade 1 … Grade 9.5, then TAG 10, ACE 10, SGC 10, CGC 10, PSA 10, BGS 10, BGS 10 Black, CGC 10 Pristine; for games Loose, Complete, Graded CIB, and more - 📈 Price history (
priceHistory) — the month-by-month series behind every chart, one array of{ date, price }points per condition - 🏆 Population report (
populationReport) — PSA and CGC population counts per grade 1–10 for cards - 🧾 Recent sold listings (
recentSales, opt-in) — up to ~30 sold listings per grade with date, title, price, marketplace (eBay, TCGPlayer, Goldin, PWCC, Heritage), item ID, and link - 🖼️ Images — cover photo plus the full gallery (card backs, box / cart / manual shots) at 1600 px
- 🏷️ Catalog metadata — category, release date, genre, UPC, ASIN, eBay ePID, and product-type flags (
isCard,isComic,isCoin,isSystem,isLegoSet,isFunkoPop, …) - 🔀 Works across video games, trading cards, comics, coins, Funko Pops, and LEGO sets — the same six slots, labelled per the on-site convention
- 🗂️ Failure report — inputs that can't be fetched are never billed and are listed in the run's
SUMMARYkey-value record so you can inspect and retry them
What data can you extract from PriceCharting?
| Field | Description |
|---|---|
productId | PriceCharting's numeric product ID |
productName, consoleName | Product and console / set name (e.g. Charizard #4, Pokemon Base Set) |
category | PriceCharting category (e.g. video-games, pokemon-cards, lego-sets) |
url | Canonical product page URL |
releaseDate, genre, upc, epid, asin | Catalog metadata where available |
imageUrl / images | Cover photo and full gallery, 1600 px |
flags | Product-type booleans: isCard, isComic, isCoin, isSystem, isFunkoPop, isLegoSet, … |
currency | Always USD |
prices | Current price per condition slot — loose, cib, new, graded, boxOnly, manualOnly |
fullPrices | Every row of the on-page Full Price Guide, labels verbatim (null = grade tracked, no sales yet) |
salesVolume | Number of recent sold listings per grade/condition, same labels as the site |
populationReport | Cards only: PSA and CGC population counts per grade 1–10 |
recentSales | Opt-in: recent sold listings per grade — { date, title, price, source, itemId, url } |
priceHistory | Per-condition arrays of { date, price } points |
source | scrape or api |
scrapedAt | ISO timestamp |
What the six price slots mean
PriceCharting reuses the same six columns with different labels per category. This actor keeps stable keys and you read them per category:
| Key | Video games | Trading cards | LEGO sets |
|---|---|---|---|
prices.loose | Loose (cart / disc only) | Ungraded | Pieces only |
prices.cib | Complete in box | Grade 7 | Complete |
prices.new | New / sealed | Grade 8 | New / sealed |
prices.graded | Graded | Grade 9 | Pieces & manual |
prices.boxOnly | Box only | Grade 9.5 | Box only |
prices.manualOnly | Manual only | PSA 10 | Manual only |
priceHistory uses these same keys, with one exception: the Ungraded / Loose series is under used (not loose). So for a card, priceHistory.manualOnly is the PSA 10 price over time and priceHistory.used is the Ungraded price over time.
If the six slots aren't enough, read fullPrices instead — it carries the site's complete price guide with the labels exactly as shown on the page, and for cards it includes every grading company (TAG / ACE / SGC / CGC / PSA / BGS, plus Black Label and Pristine variants). Price history exists only for the six slots above — PriceCharting publishes no time series for the company-specific grades, so fullPrices is their current market value.
How to scrape PriceCharting
- Open PriceCharting Product Scraper on Apify Store and click Try for free.
- In Products, add one product per line: a full product page URL (e.g.
https://www.pricecharting.com/game/pokemon-base-set/charizard-4) or a numeric product ID (e.g.7141). - Leave Scrape full product details on to get the price-history series, or turn it off if you only need current prices.
- Turn on Include recent sold listings if you need the individual sales behind each grade (this makes each record roughly 5x larger).
- Leave Proxy configuration on Automatic — Apify datacenter proxies are reliable here and the cheapest option.
- Click Start, then download the results as JSON, CSV, Excel, or XML, or pull them through the API.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
products | array | Yes | — | One product page URL or numeric product ID per line |
scrapeProductDetails | boolean | No | true | Include the full priceHistory series. Images and current prices are always included for scraped products |
includeRecentSales | boolean | No | false | Add recentSales (up to ~30 sold listings per grade). Increases item size ~5x |
priceChartingToken | string (secret) | No | — | Optional PriceCharting API token. Resolves numeric IDs through the official API when full details are off |
proxyConfiguration | object | No | Apify datacenter | Proxy used for scraping. Switch to residential only if you see repeated failed requests |
maxConcurrency | integer | No | 3 | Parallel requests (kept low to be respectful) |
requestDelaySecs | integer | No | 1 | Politeness delay in seconds between requests (max 10) |
maxItems | integer | No | 0 | Stop after N results (0 = unlimited) |
Input example
{"products": ["https://www.pricecharting.com/game/pokemon-base-set/charizard-4","7141"],"scrapeProductDetails": true,"includeRecentSales": false,"proxyConfiguration": { "useApifyProxy": true },"maxConcurrency": 3,"requestDelaySecs": 1,"maxItems": 0}
Output example
{"productId": 630417,"productName": "Charizard #4","consoleName": "Pokemon Base Set","category": "pokemon-cards","url": "https://www.pricecharting.com/game/pokemon-base-set/charizard-4","releaseDate": "January 9, 1999","genre": "Pokemon Card","upc": null,"epid": null,"asin": null,"imageUrl": "https://storage.googleapis.com/images.pricecharting.com/hpgpcpsd42huitud/1600.jpg","images": ["https://storage.googleapis.com/images.pricecharting.com/hpgpcpsd42huitud/1600.jpg","https://storage.googleapis.com/images.pricecharting.com/kmwn5qjyipwzbuwm/1600.jpg"],"flags": { "isCard": true, "isComic": false, "isCoin": false, "isLegoSet": false, "isFunkoPop": false },"currency": "USD","prices": {"loose": 437.00,"cib": 772.69,"new": 1312.50,"graded": 2909.38,"boxOnly": 7397.73,"manualOnly": 26566.47},"fullPrices": {"Ungraded": 437.00,"Grade 7": 772.69, "Grade 8": 1312.50, "Grade 9": 2909.38, "Grade 9.5": 7397.73,"TAG 10": null, "ACE 10": null,"SGC 10": 15940.00, "CGC 10": 7040.65, "PSA 10": 26566.47,"BGS 10": 34536.00, "BGS 10 Black": 172680.00, "CGC 10 Pristine": 20800.00},"salesVolume": { "Ungraded": 59, "PSA 10": 30, "CGC 10": 30, "Grade 9": 30 },"populationReport": {"PSA": { "1": 4096, "2": 3573, "9": 8455, "10": 486 },"CGC": { "8": 1, "9": 2, "10": 4 }},"priceHistory": {"used": [ { "date": "2020-12-01", "price": 225.00 }, { "date": "2021-01-01", "price": 282.40 } ],"manualOnly": [ { "date": "2020-12-01", "price": 9800.00 } ]},"source": "scrape","scrapedAt": "2026-08-26T04:24:21+00:00"}
With Include recent sold listings on, each record also carries:
"recentSales": {"PSA 10": [{"date": "2026-05-04","title": "1999 Pokemon Base Set Charizard #4 Holo PSA 10","price": 30100.00,"source": "ebay","itemId": "157...","url": "https://www.ebay.com/itm/157..."}]}
Download every run in JSON, CSV, Excel, or XML from the dataset tab or the API.
Use cases
- 📉 Price monitoring — schedule a daily run over your watchlist and track the six price slots plus PSA 10 / BGS 10 over time
- 💼 Collection valuation — value a whole collection at once by feeding a list of product IDs
- 🃏 Card grading decisions — compare Ungraded vs PSA 10 vs BGS 10 spreads and pull the POP report to gauge scarcity before submitting a card
- 🛒 Reseller sourcing — cross-check a listing against
recentSalesfrom eBay, Goldin, PWCC, and Heritage - 📚 Dataset building — build a structured price database for games, cards, comics, or LEGO sets with full history
- 🤖 AI agent tooling — give an LLM live PriceCharting values through the Apify API or MCP
How it works
- Each line in
productsis resolved to a product page: numeric IDs becomepricecharting.com/game/<id>, URLs are used as-is. - Pages are fetched through Apify proxies with browser-grade TLS fingerprinting and a small politeness delay; anti-bot challenges are retried with backoff on a rotated IP.
- The page's embedded price data, chart series, population data, and sold-listing tables are parsed into the fields above — no data is invented, and a field with no value on the page is returned as
null. - When Scrape full product details is off and a PriceCharting API token is supplied, numeric IDs are resolved through the official
/api/productendpoint instead (source: "api"). - Records are pushed to the dataset as they're scraped; failures are collected into the
SUMMARYkey-value record and the run's status message reports how many succeeded.
How much does it cost to scrape PriceCharting?
This actor uses one pay-per-event billable:
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
product-scraped (per product saved) | $0.003 / $3.00 per 1,000 | $0.0025 / $2.50 per 1,000 | $0.002 / $2.00 per 1,000 | $0.0015 / $1.50 per 1,000 |
Scraping 1,000 products costs about $3 on the Free tier, dropping to $1.50 on Gold. Inputs that fail to fetch are not saved and not billed. Apify's monthly free platform credits are enough to test the actor. Platform compute is included in the event price — you only pay for saved products.
Comparison to the alternatives
| Capability | This actor | Official API ($49/mo) | Roll your own | Manual lookups |
|---|---|---|---|---|
| Current prices, every condition | ✅ | ✅ | ⚠️ you maintain it | 🐌 one at a time |
| Month-by-month price history | ✅ | ❌ | ⚠️ reverse-engineer the charts | ❌ |
| Graded values — PSA / BGS / CGC / SGC / TAG / ACE (incl. Black Label, Pristine) | ✅ fullPrices | ❌ | ⚠️ you maintain it | 🐌 one grade at a time |
| Recent sold listings (eBay, TCGPlayer, Goldin, PWCC, Heritage) | ✅ opt-in | ❌ | ⚠️ affiliate links to unwrap | ✂️ copy-paste |
| POP report & per-grade sales volume | ✅ | ❌ | ⚠️ you maintain it | ❌ |
| Product images (1600 px) | ✅ | ❌ | ⚠️ you maintain it | 💾 manual saves |
| Cost for 1,000 products / month | ≈ $3 (≈ $1.50 on Gold) | $49 flat | your dev time + proxies | hours of your life |
| Setup time | ~60 seconds | subscription + coding | days, breaks on site changes | — |
| Export JSON / CSV / Excel / API | ✅ built-in | DIY | DIY | DIY |
Integrations and API access
PriceCharting Product Scraper runs on the Apify platform, which gives you:
- Scheduling — run daily, weekly, or on any custom schedule
- API access — start runs and fetch results programmatically (API reference)
- Webhooks & integrations — connect to Google Sheets, Slack, Zapier, Make, and more
- Export formats — JSON, CSV, Excel, or XML
Python example
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("parsebird/pricecharting-product-scraper").call(run_input={"products": ["https://www.pricecharting.com/game/pokemon-base-set/charizard-4","7141",],"scrapeProductDetails": True,"includeRecentSales": False,"proxyConfiguration": {"useApifyProxy": True},})for item in client.dataset(run["defaultDatasetId"]).iterate_items():p = item["prices"]print(f"{item['productName']} ({item['consoleName']}) — loose {p['loose']} / graded {p['graded']}")
JavaScript example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('parsebird/pricecharting-product-scraper').call({products: ['https://www.pricecharting.com/game/pokemon-base-set/charizard-4','7141',],scrapeProductDetails: true,includeRecentSales: false,proxyConfiguration: { useApifyProxy: true },});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(i => console.log(`${i.productName}: loose ${i.prices.loose} / graded ${i.prices.graded}`));
Is it legal to scrape PriceCharting?
Scraping publicly available data is generally legal, as reaffirmed by the US Ninth Circuit in hiQ Labs v. LinkedIn (2022). PriceCharting Product Scraper reads only publicly visible information from PriceCharting product pages — the same data any visitor sees without logging in — and does not access private accounts or bypass authentication or payment systems.
You are responsible for making sure your use case complies with applicable laws and with PriceCharting's terms of use. For more background, see Apify's guide to web scraping and the law.
Related actors
- eBay Sold Listings Scraper — real sold prices from eBay across 8 marketplaces
- Vinted Scraper — prices and listings from the Vinted secondhand marketplace
- AliExpress Scraper — product prices, ratings, and variants from AliExpress
- Data Cleaner — clean, filter, and reshape any Apify dataset
- Data Deduplicator — remove duplicate records from any Apify dataset
FAQ
Do I need a PriceCharting subscription or API token?
No. The scraper works on public product pages without any account. A token is only useful if you already pay for PriceCharting and want numeric IDs resolved through the official API when scrapeProductDetails is off.
What's the difference between prices and fullPrices?
prices is the stable six-slot mapping (loose, cib, new, graded, boxOnly, manualOnly) you read per category. fullPrices is every row of the on-page price guide with the site's own labels — for cards that includes each grading company (PSA, BGS, CGC, SGC, TAG, ACE, plus Black Label and Pristine).
Why is priceHistory missing some grades?
PriceCharting only publishes a time series for the six main slots. Company-specific card grades (BGS 10, CGC 10 Pristine, …) have a current value in fullPrices but no history.
Why are upc, epid, or asin sometimes null?
Those fields only exist for products PriceCharting has catalogued with them — common for modern games, rare for vintage cards. When the page doesn't show a value, the field is null rather than guessed.
How do I get the recent sold listings?
Turn on Include recent sold listings. Each record then gets a recentSales object keyed by grade, with up to ~30 sales each (date, title, price, source, itemId, url). It roughly 5x's item size, so leave it off if you only need prices.
Some of my inputs didn't come back — where are they?
Failed inputs are never written to the dataset and never billed. Open the run's key-value store and read the SUMMARY record — it lists every failure with the input and the reason so you can fix and retry.
What proxy should I use?
Leave it on Automatic (Apify datacenter) — it's reliable for PriceCharting and the cheapest option. Switch to residential only if you start seeing failed requests in the SUMMARY record.
Can I schedule recurring runs? Yes. Use Apify's scheduling to run daily or weekly, and pair it with webhooks or integrations to push new prices into Google Sheets, a database, or Slack. Found a bug or missing field? Open an issue on the actor's Issues tab.