
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Scrape seller offers from Cardmarket card pages: seller, country, condition, language, quantity, price and comment, plus the card price trend and averages.
Get every seller offer from any Cardmarket card page: seller, item location, seller type, condition, language, foil / signed / first-edition flags, quantity, price in EUR and USD, the seller's comment and the card's price trend and 30/7/1-day averages. Works for Magic, Pokémon, Yu-Gi-Oh!, One Piece, Lorcana and every other Cardmarket game. No account or login needed.
https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200). Paste one or more into Card URLs, or type card names into Card names to search and pick the game.| Field | What it does |
|---|---|
productUrls | Cardmarket card (product) URLs, any game and any site language. Filters already in the URL are kept. |
searchQueries | Card names to look up; the first maxCardsPerSearch matching singles are scraped. |
game | Game the card names are searched in (Pokémon, Magic, Yu-Gi-Oh!, One Piece, Lorcana, ...). |
maxListingsPerCard | Offers to save per card, cheapest first. |
minCondition | MT, NM, EX, GD, LP, PL or PO and better. |
languages, sellerCountries, sellerTypes | Only offers in these languages, from these countries or from these kinds of sellers. |
minPrice, maxPrice, minQuantity | Price range in EUR and the minimum number of copies per offer. |
foil, signed, altered, firstEdition | any, yes or no. On Pokémon, foil is the reverse holo filter. |
{
"productUrls": [
"https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200",
"https://www.cardmarket.com/en/Magic/Products/Singles/Commander-Masters/Jeweled-Lotus"
],
"maxListingsPerCard": 20,
"minCondition": "NM",
"languages": ["English", "German"],
"sellerCountries": ["DE", "NL"]
}
One row per offer. Main fields:
| Field | Description |
|---|---|
cardName, setName, game, rarity, cardNumber | The card |
sellerName, sellerUrl, sellerCountry, sellerType | The seller, its item location and Private / Professional / Powerseller |
sellerSales, sellerAvailableItems | The seller's sales count and items for sale |
condition, conditionName, language | Offer condition (MT, NM, EX, GD, LP, PL, PO) and card language |
isFoil, isReverseHolo, isSigned, isFirstEdition, isAltered, isPlayset | Offer flags |
quantity, price, currency, priceUsd, eurUsdRate | Copies, price and the USD conversion (ECB daily rate) |
sellerComment, photoUrl | The seller's note and the photo of the actual card, when given |
priceTrend, priceFrom, avg30Days, avg7Days, avg1Day, availableItems | Card-level market prices and offer count |
position, listingId, productUrl, listingsUrl, imageUrl, scrapedAt | Rank (cheapest = 1), ids and links |
Example (from a real run, trimmed):
{
"position": 1,
"cardName": "Blastoise ex (MEW 200)",
"setName": "151",
"game": "Pokémon",
"rarity": "Special Illustration Rare",
"cardNumber": "200",
"listingId": "2170239522",
"sellerName": "examplecards",
"sellerUrl": "https://www.cardmarket.com/en/Pokemon/Users/examplecards",
"sellerCountry": "Italy",
"sellerType": "Private",
"sellerSales": 498,
"condition": "GD",
"conditionName": "Good",
"language": "Italian",
"isFoil": false,
"isFirstEdition": false,
"quantity": 1,
"price": 69.99,
"currency": "EUR",
"priceUsd": 78.63,
"eurUsdRate": 1.1234,
"sellerComment": null,
"priceTrend": 156.88,
"avg30Days": 149.89,
"avg7Days": 180.17,
"avg1Day": 176.5,
"availableItems": 589,
"productUrl": "https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200"
}
The run's OUTPUT record lists every input with its status (listings saved, no matching offers, or the error).
You pay $4.50 per 1,000 listings ($0.0045 per saved offer). Cards with no matching offers, failed inputs and duplicates cost nothing.
Platform usage (compute and the hosted browser that passes Cardmarket's site check) is billed on top. In our test runs a one-card run used about $0.01–0.015 of usage and a 29-card run about $0.04.
Worked examples:
Is it legal to scrape Cardmarket? The scraper reads only public offer pages that anyone can open without an account. Check Cardmarket's terms and your local law for your use case.
Do I need a Cardmarket account or a proxy? No. The scraper needs no login, cookies or proxy settings; it passes the site check itself.
How many offers can I get per card? As many as the card has. Cardmarket shows visitors the 50 cheapest offers per filter combination; above 50 the scraper splits the offers by language and seller country, which takes a few extra page loads per card (more for very popular cards).
Why did a card return 0 rows? No offer matched the filters at that moment. Relax the condition, language or price filters. The OUTPUT record says "no offers match the filters" for such cards.
What if a field is empty? Some fields only exist on some offers: sellerComment and photoUrl only when the seller added them, sellerSales is hidden for brand-new sellers, and rarity is missing on products without one.
Can I schedule it or use the API? Yes. Save your input as a task, schedule it daily, and read the dataset through the API, webhooks or integrations.
OUTPUT record notes when some groups still had more than 50 offers.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
productUrlsarrayOptionalCard URLs
Cardmarket product pages to scrape, one per line, e.g. https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200. Works for every game (Magic, Pokémon, Yu-Gi-Oh!, One Piece, Lorcana, ...) and any site language. Filters already in the URL are kept.
searchQueriesarrayOptionalCard names to search
Optional. Card names to look up on Cardmarket (e.g. "Charizard ex", "Black Lotus"). The first matching singles are scraped, up to 'Cards per search'.
gameenumOptionaldefault "Pokemon"Game for searches
The Cardmarket game the card names are searched in. Card URLs carry their own game.
maxCardsPerSearchintegerOptionaldefault 5Cards per search
How many matching cards to scrape for each card name (the first results of the Cardmarket search).
maxListingsPerCardintegerOptionaldefault 20Max listings per card
Listings to save for each card, cheapest first. Cardmarket shows visitors the 50 cheapest offers at once; above 50 the scraper splits the offers by card language and seller country to collect more (a few extra page loads per card).
Narrow the offers. Condition, language, seller and card-property filters are applied by Cardmarket itself, so the cheapest matching offers come first.
minConditionenumOptionalMinimum condition
Only offers in this condition or better. Leave empty for any condition.
languagesarrayOptionalCard languages
Only offers in these card languages. Leave empty for any language.
sellerCountriesarrayOptionalSeller countries
Only offers from sellers in these countries. Leave empty for any country.
sellerTypesarrayOptionalSeller types
Only offers from these kinds of sellers. Leave empty for all.
minPricenumberOptionalMin price (EUR)
Only offers at or above this price in euros.
maxPricenumberOptionalMax price (EUR)
Only offers at or below this price in euros.
minQuantityintegerOptionalMin copies per offer
Only offers with at least this many copies available (e.g. 4 for playsets).
foilenumOptionaldefault "any"Foil / reverse holo
Foil offers only (yes), non-foil only (no), or both. On Pokémon this is the reverse holo filter.
signedenumOptionaldefault "any"Signed
Signed cards only (yes), unsigned only (no), or both.
alteredenumOptionaldefault "any"Altered art
Altered cards only (yes), unaltered only (no), or both.
firstEditionenumOptionaldefault "any"First edition
First edition only (yes), unlimited only (no), or both. Used by Yu-Gi-Oh! and other games with editions.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| position | number | |
| cardName | string | |
| setName | string | null | |
| game | string | null | |
| category | string | null | |
| rarity | string | null | |
| cardNumber | string | null | |
| productId | number | null | |
| productUrl | string | |
| listingId | string | null | |
| sellerName | string | null | |
| sellerUrl | string | null | |
| sellerCountry | string | null | |
| sellerType | string | null | |
| sellerSales | number | null | |
| sellerAvailableItems | number | null | |
| condition | string | null | |
| conditionName | string | null | |
| language | string | null | |
| isFoil | boolean | null | |
| isReverseHolo | boolean | null | |
| isSigned | boolean | null | |
| isFirstEdition | boolean | null | |
| isAltered | boolean | null | |
| isPlayset | boolean | null | |
| otherAttributes | array | null | |
| quantity | number | null | |
| price | number | null | |
| currency | string | null | |
| priceUsd | number | null | |
| eurUsdRate | number | null | |
| sellerComment | string | null | |
| photoUrl | string | null | |
| priceFrom | number | null | |
| priceTrend | number | null | |
| avg30Days | number | null | |
| avg7Days | number | null | |
| avg1Day | number | null | |
| availableItems | number | null | |
| imageUrl | string | null | |
| listingsUrl | string | null | |
| searchQuery | string | null | |
| scrapedAt | string |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Listing | One seller offer (listing) from a Cardmarket card page saved to the dataset. | $0.0045 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/cardmarket-scraper').call({
"productUrls": [
"https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200"
],
"maxListingsPerCard": 20
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/cardmarket-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/cardmarket-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.