TCGplayer Price Monitor
Pricing
Pay per event
TCGplayer Price Monitor
Monitor TCGplayer market prices and listed medians per product/printing, with run-over-run change detection. Pure JSON API, no browser.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Vic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Monitors TCGplayer market price and listed median price for trading-card products (Pokemon, Magic: The Gathering, Yu-Gi-Oh!, Lorcana, One Piece, and more) — one row per product x printing (Normal / Foil / 1st Edition ...), with optional run-over-run change detection so you only react to prices that actually moved.
Pure JSON-over-HTTP (no browser), built for cheap scheduled monitoring runs.
Quickstart (3 lines)
- Enter one or more search queries (e.g.
charizard ex obsidian flames) or paste known product IDs / product URLs (e.g.610532orhttps://www.tcgplayer.com/product/610532). - Run the Actor — each product yields one dataset row per printing with
marketPriceandlistedMedianPrice. - Schedule it (e.g. daily) with a fixed
productIdslist: withenableChangeDetectionon, every row carriespriceChanged,prevMarketPrice, andmarketPriceDeltaversus your previous run.
What it does
- Resolves search queries via TCGplayer's product search (paginated, capped by
maxResultsPerQuery). - Accepts explicit
productIds(skips search; metadata is resolved in one batched lookup) — the reliable mode for scheduled monitoring. - Fetches per-printing price points for every unique product:
marketPrice,listedMedianPrice,buylistMarketPrice. - Joins in search metadata: set name, rarity, card number, lowest listed price, listing count.
- Change detection: keeps a snapshot of your last run in a named key-value store (
tcgplayer-price-monitor-state) and emitspriceChanged/prevMarketPrice/prevListedMedianPrice/marketPriceDelta/changedAt. - Contract test on every run: a known-good product's response shape is validated; on upstream schema drift the run warns loudly (status message + one uncharged
warningrow) instead of silently emitting garbage.
What it does NOT do
- No seller-level listings or seller-filtered pages (those are disallowed by tcgplayer.com robots.txt — we do not touch them).
- No buying, sniping, or cart automation.
- No historical backfill — price history accrues from your own scheduled runs.
- No fabricated values: if TCGplayer has no market price for a printing, you get
null(a price of 0 is also treated as "no price").
Input examples
One-shot search:
{"queries": ["charizard ex obsidian flames"],"productLine": "pokemon","maxResultsPerQuery": 25}
Scheduled daily monitor of a fixed list (recommended):
{"productIds": ["610532", "113670", "https://www.tcgplayer.com/product/477236"],"printings": ["Foil"],"enableChangeDetection": true}
Output example (real rows from a test run, 2026-08-29)
{"productId": 610532,"productName": "Teal Mask Ogerpon ex - 177/131","setName": "SV: Prismatic Evolutions","productLine": "Pokemon","rarity": "Hyper Rare","number": "177/131","printingType": "Foil","marketPrice": 8.79,"listedMedianPrice": 9.86,"buylistMarketPrice": null,"lowestPrice": 6.78,"listingCount": 189,"sealed": false,"url": "https://www.tcgplayer.com/product/610532","scrapedAt": "2026-08-29T14:32:23.077Z","prevMarketPrice": null,"prevListedMedianPrice": null,"marketPriceDelta": null,"priceChanged": false,"changedAt": null}
On a later run, after the market price moved:
{"productId": 610532,"printingType": "Foil","marketPrice": 8.79,"prevMarketPrice": 7.50,"marketPriceDelta": 1.29,"priceChanged": true,"changedAt": "2026-08-29T14:33:16.634Z"}
(second example abbreviated; all rows always contain the full field set)
Notes on fields:
priceChangedistruewhenmarketPriceorlistedMedianPricediffers from the previous snapshot for that product+printing.- On the very first run there is no previous snapshot, so all rows have
priceChanged: falseandprev*: null. productTypeNameis emitted for completeness but TCGplayer's search payload currently does not populate it; use thesealedboolean to separate sealed products from singles.
Pricing (pay per event)
| Event | Price | Charged when |
|---|---|---|
| Run start | $0.001 | once per run |
| Product price row | $0.003 | for every product x printing row delivered to the dataset |
| Price change row | $0.004 (additional) | only for delivered rows with priceChanged: true |
Failed fetches, filtered-out printings, nonexistent/unknown product IDs, and the schema-drift warning row are never charged.
Worked example: monitoring 500 rows daily (a row = one product x printing; use
the printings filter to get exactly one row per product) where ~10% move per
day costs about 500 x $0.003 + 50 x $0.004 + $0.001 = **$1.70/day
($51/month)**. A daily 100-row watchlist under the same assumptions is
$0.34/day ($10/month).
Scheduling recipe
- Create an Apify Schedule (e.g. daily at 09:00) pointing at this Actor with your fixed
productIdsinput. - Add an Actor integration/webhook on run success and consume the dataset filtered to
priceChanged = true(the dataset API supports field filtering), or plug the dataset into Make/Zapier/Google Sheets. - The change snapshot lives in the named key-value store
tcgplayer-price-monitor-statein your account — delete it to reset change detection.
Data source & respect
Data comes from TCGplayer's public, unauthenticated JSON endpoints (the same ones the website itself uses) over plain HTTP — no browser, no login, no CAPTCHA circumvention. The Actor is deliberately polite: low concurrency, spacing between requests, exponential backoff on 429/5xx, and a descriptive User-Agent identifying this Actor. It never crawls HTML pages and never touches seller-filtered pages, which tcgplayer.com's robots.txt disallows. Prices are public market data; no personal information is collected.
Limitations
- These are unofficial endpoints; TCGplayer can change them without notice. A schema contract test runs on every run and flags drift immediately; we target same-day fixes, 14 days worst case.
- Search relevance is TCGplayer's — broad queries return whatever the site's search ranks first (may include sealed products; filter with
sealed/productLine). lowestPrice/listingCountcome from the search payload and arenullfor products whose metadata lookup failed.- If more than 30% of requests to an endpoint fail, the run aborts with a clear error rather than emitting partial garbage.
Support
Use the Issues tab on this Actor's page — reports are answered within 24 hours, and breaking upstream changes are fixed within 14 days (usually much faster).