Cardmarket Deal Finder - Underpriced TCG Listings
Under maintenancePricing
from $9.00 / 1,000 results
Cardmarket Deal Finder - Underpriced TCG Listings
Under maintenanceCardmarket listings scraper and deal finder in one: every live offer of the cards you search (price, condition, language, ship-from country), or only offers 25%+ under the official trend price - condition- and language-aware. Pokémon, Magic, Yu-Gi-Oh!, Lorcana and 11 more. No seller data.
Pricing
from $9.00 / 1,000 results
Rating
0.0
(0)
Developer
Lowland Data
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
15 hours ago
Last modified
Categories
Share
Cardmarket Deal Finder — underpriced TCG listings
Finds live Cardmarket offers priced well under the card's own trend price — condition-aware, so a cheap damaged card never masquerades as a deal. Works on Pokémon, Magic, Yu-Gi-Oh!, Lorcana, One Piece and twelve more games. One row per underpriced offer: condition, language, price, ship-from country and the exact discount versus Cardmarket's official trend price.
Live health record: lowlanddata.com/status/cardmarket-deal-finder - 30-day success rate and daily canary results, failures included. Full input/output reference: tool page.
No seller identity is extracted — you get the offer and a link to buy it, not the person behind it.
Quick start (30 seconds)
- Type what you hunt: "charizard", "umbreon vmax", "black lotus".
- Set your bar: minimum 25% under trend and Excellent or better are the defaults.
- Hit Start. Each row is one live offer:
{"name": "Charizard (PGO 010)","game": "Pokémon","condition": "NM","language": "English","priceEur": 2.8,"quantity": 3,"locationCountry": "Germany","trendEur": 5.6,"avg30Eur": 5.1,"discountPct": 50,"productUrl": "https://www.cardmarket.com/en/Pokemon/Products/Singles/Pokemon-GO/Charizard-PGO010?language=1&minCondition=2","priceGuideDate": "2026-08-28"}
One honesty note about the link, stated up front: Cardmarket has no URL for an individual offer - not for us, not for anyone (their own wants-list emails link product pages too). So the actor engineers the next best thing, and it is exact: only offers with no cheaper equal-or-better copy in the same language are reported, and productUrl opens the offers pre-filtered to the row's language and condition, cheapest first. Put together, that means the row's offer is the first row of the page it links to - click, and your copy is at the top.
Who uses this
- Resellers run their want list on a schedule and buy NM copies at 30–50% under trend before anyone refreshes the page manually.
- Collectors set
minConditionto EX andlanguagesto their own, and stop scrolling through damaged Italian copies to find the one good deal. - Arbitrage players pair it with the TCG Price Arbitrage actor: buy the EU dip, sell where the market prices it higher.
- Discord deal channels pipe the rows into a webhook — every row already carries the discount percent and the buy link.
How it works
- Loads Cardmarket's official daily price guide — the trend price of every product — as the benchmark. That part is a published file, not scraping.
- Searches your query on the live site and opens the strongest candidate product pages (
maxProductsof them). - Reads the live offers, filters by your condition, language and price rules, and reports every offer at least
minDiscountPctunder trend, steepest first.
A deal is measured against Cardmarket's own trend price, not against a number we invent. discountPct: 50 means the offer sits at half the price the marketplace itself calls normal for that card.
One thing the offers list makes plain when you click through: it mixes conditions, languages and graded slabs - an ordinary card can run from a near-mint raw copy at €29.88 to a PSA 10 at €999, with BGS and CGC copies in between. Cardmarket's trend is computed across that mix, and the source publishes no raw-only figure. This actor is condition-aware, so it will not sell you a played copy as a bargain, but a slab priced like a slab is not a deal it can reason about.
How much does it cost?
$0.01 per deal row plus $0.005 per run, on the standard tier. You pay for deals found, not for pages checked — a run that finds nothing costs half a cent.
A daily hunt over one query returning ~10 deals: about $0.11 a day. The live-offer pages sit behind Cardmarket's protection, so runs use Apify's Site Unblocker proxy — platform usage of a few cents per run is billed by Apify alongside.
Not technical? Let your AI assistant set it up
Paste this to Claude, ChatGPT or Cursor along with what you hunt:
I want underpriced Cardmarket offers from the Apify actorlowlanddata/cardmarket-deal-finder. Build me the input JSON.Fields:- game: pokemon | magic | yugioh | lorcana | onepiece | digimon | fleshandblood |starwarsunlimited | dragonballsuper | finalfantasy and more (default pokemon)- searchQuery: what to hunt, e.g. "umbreon vmax" (required)- minDiscountPct: an offer counts as a deal at this % under trend (default 25)- minCondition: MT | NM | EX | GD | LP | PL | PO - ignore offers below it (default EX)- languages: array, e.g. ["English","German"] (optional)- priceMinEur / priceMaxEur: trend-price band, filters bulk and whales (optional)- maxProducts: candidate products to inspect per run (default 3)- maxItems: cap on delivered deal rows- keep proxyConfiguration exactly as prefilled (the site needs the Unblocker proxy)Here is what I hunt: <cards, conditions, languages, budget>Give me the JSON only, then tell me how to run it daily on a schedule.
Input
| Field | What it does |
|---|---|
game | Which TCG to hunt in (default pokemon). |
searchQuery | What to hunt for. |
minDiscountPct | The bar an offer must clear, in % under trend (default 25). |
minCondition | Ignore offers graded below this (default EX). |
languages | Only count offers in these languages. |
priceMinEur | Skip cards whose trend is below this — filters bulk noise. |
priceMaxEur | Skip cards whose trend is above this. |
maxProducts | Candidate products opened per run (default 3). |
maxItems | Cap on delivered deal rows. |
proxyConfiguration | Keep the prefill: Cardmarket requires the Site Unblocker proxy. |
Use it from your code
curl -X POST \"https://api.apify.com/v2/acts/lowlanddata~cardmarket-deal-finder/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"searchQuery":"umbreon vmax","minDiscountPct":30,"maxItems":20}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('lowlanddata/cardmarket-deal-finder').call({game: 'magic',searchQuery: 'ragavan',minCondition: 'NM',languages: ['English'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(token=os.environ["APIFY_TOKEN"])run = client.actor("lowlanddata/cardmarket-deal-finder").call(run_input={"searchQuery": "charizard ex","minDiscountPct": 30,})for deal in client.dataset(run["defaultDatasetId"]).iterate_items():print(deal["name"], deal["priceEur"], f'-{deal["discountPct"]}%', deal["productUrl"])
Use it with AI agents (MCP)
Claude, Cursor and other MCP-capable agents can run this actor as a tool through Apify's hosted MCP server:
$claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/cardmarket-deal-finder"
Cursor or Claude Desktop: add a custom connector with https://mcp.apify.com?actors=lowlanddata/cardmarket-deal-finder. Sign in with your Apify account when prompted — runs are billed to it. Details: Apify MCP docs.
Prompts that work once connected:
- "Find near-mint Umbreon VMAX offers at least 30% under trend."
- "Any English Black Lotus style deals on Cardmarket today? Budget €500."
- "Check my want list for deals and give me the buy links."
Is it legal to scrape Cardmarket offers?
The benchmark prices come from files Cardmarket publishes openly. The live offers are public listing data — price, condition, language, country — read the way a browser reads them, without login and without collecting any seller identity: no usernames, no ratings, no profiles, ever. That last part is by construction, not by configuration, and it is what makes the rows safe to store and forward.
FAQ
Why did a run find nothing? Your bar did its job — nothing on the market clears it right now. Deals at 25%+ under trend on liquid cards get bought fast; a schedule catches them when they appear.
Why does condition matter so much? A Played copy at 40% under a Near Mint trend price is not a deal, it is a fair price. The default minCondition: EX keeps the comparison honest; loosen it deliberately if you also trade played copies.
What does quantity mean? How many copies that offer sells at that price.
Why fewer rows than offers under the threshold? Dominated offers are dropped: a €1.49 Played copy is not a deal while a €0.89 Played copy of the same card sits on the same page. You get the best offer per condition level and language - each one the top row of its own link.
Can I hunt several cards at once? One searchQuery per run works best; run several tasks in parallel — each stays cheap because you pay per deal found.
Why the Unblocker proxy? The live offer pages sit behind anti-bot protection. The default input is preconfigured; keep it and everything works.
Related actors
- Cardmarket Price Guide — the daily benchmark itself, every card, every game.
- TCG Price Arbitrage — EU vs US spreads on the same cards.
Troubleshooting
- "Cardmarket did not answer after N attempts on fresh routes" — a temporary outage on their side or a hard block streak; the run reports it honestly instead of returning empty rows. Retry in a few minutes.
- Offers you saw on the site are missing — check
minConditionandlanguages; most "missing" offers fail one of the two filters. - A deal was gone when you clicked — that is the market: steep deals on liquid cards sell in minutes. Schedule the run and act on fresh rows.
Something else off? Open an issue on the Issues tab — it is read daily. And if the deals are paying for themselves, a rating on this page takes ten seconds.