# Cardmarket Price Guide - TCG Card Prices (`lowlanddata/cardmarket-price-guide`) Actor

Daily EU market prices for 19 trading card games - Pokémon, Magic, Yu-Gi-Oh!, Lorcana, One Piece and more. Trend price, lowest listing, 1/7/30-day averages, foil variants and momentum per card, from Cardmarket's official daily price guide. No scraping, no seller data. Runs in seconds.

- **URL**: https://apify.com/lowlanddata/cardmarket-price-guide.md
- **Developed by:** [Lowland Data](https://apify.com/lowlanddata) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Cardmarket Price Guide — daily EU card prices for 19 TCGs

Daily European market prices for **every trading card game on Cardmarket** — Pokémon, Magic: The Gathering, Yu-Gi-Oh!, Disney Lorcana, One Piece and 16 more — as clean, analysis-ready JSON. One row per card: trend price, lowest listing, 1/7/30-day sale averages, foil variants, a momentum signal, and a direct link to the card's own Cardmarket page.

**Live health record:** [lowlanddata.com/status/cardmarket-price-guide](https://lowlanddata.com/status/cardmarket-price-guide/) - 30-day success rate and daily canary results, failures included. Full input/output reference: [tool page](https://lowlanddata.com/tools/cardmarket-price-guide/).

No scraping is involved: the actor reads the price guide files Cardmarket itself publishes daily. That is why a filtered run finishes in seconds, never breaks on a site redesign, and never touches a seller — there is no personal data in the source or the output.

### Quick start (30 seconds)

1. Pick a **game** (Pokémon is the default).
2. Type a **card name filter** — try the prefill — or leave it empty to export the whole game.
3. Hit **Start**. Seconds later you have rows like:

```json
{
  "productId": 274406,
  "name": "Charizard ex [151]",
  "game": "Pokémon",
  "expansionId": 5320,
  "priceLowEur": 3.9,
  "priceAvgEur": 28.56,
  "priceTrendEur": 23.99,
  "avg1DayEur": 17,
  "avg7DayEur": 15.43,
  "avg30DayEur": 27.11,
  "foilTrendEur": 14.01,
  "foilAvg30DayEur": 11.47,
  "trendVsAvg30Pct": -11.5,
  "currency": "EUR",
  "priceGuideDate": "2026-08-28",
  "productUrl": "https://www.cardmarket.com/en/Pokemon/Products?idProduct=274406"
}
```

`productUrl` opens the card's own page on Cardmarket — offers, versions, the lot.

### What the price means, and what you will see when you click

Worth being straight about, because it surprises people: **the number on that page will usually not be the number in your row, and neither is wrong.**

Cardmarket's card page leads with **From**, the cheapest copy on sale right now. This actor leads with `priceTrendEur`, Cardmarket's own **trend price** — what the card has actually been selling for. The two drift apart in both directions, and the gap is often large:

| Card (2026-09-09 guide)   | Trend price | Cheapest offer on the page |
| ------------------------- | ----------- | -------------------------- |
| Sobble (S-P 146)          | €53.84      | €29.88                     |
| Celebratory Fanfare (254) | €230.12     | €400.00                    |

If you want the number the page shows, use **`priceLowEur`** — that is the same figure as **From**, to the cent. Use `priceTrendEur` when you want what the market pays, and `priceLowEur` when you want what it costs to buy one today.

Two more things the page makes obvious:

- **The offers mix conditions, languages and graded slabs.** On one ordinary card the list runs from a €29.88 near-mint raw copy to a €999 PSA 10, with BGS and CGC copies in between. Cardmarket's averages are computed across that mix, so a single "price" for a card is inherently a blend, not a quote for a specific copy.
- **Graded cards are not separated out.** There is no field that says "raw only", because the source does not publish one.

### Freshness

Cardmarket publishes one price guide per game per day, overnight — today's Pokémon file was stamped 02:45 CET. `priceGuideDate` on every row tells you exactly which file the numbers came from. Running more often than daily returns the same file again, so a daily schedule is the most this data can support.

### Who uses this

- **Shop owners and repricers** bulk-price inventory against today's EU market: one run, one game, every card, then `priceTrendEur` into the repricing sheet.
- **Collectors** value a binder without clicking through hundreds of product pages — filter by `expansionIds` and export the set.
- **Arbitrage hunters** sort by `momentum` to catch cards trading ahead of their own 30-day average before the rest of the market prices it in.
- **Data analysts** schedule a daily run and keep the datasets: that is a price history for an entire game, at a fraction of what card-data APIs charge.

### What you can do with it

- **Price a collection or shop inventory** in bulk — the whole Pokémon guide is ~65,000 priced cards, one run.
- **Spot movers**: `trendVsAvg30Pct` at +25 means a card trades a quarter above its recent norm — heating up. Sort by `momentum` to rank the whole game.
- **Feed repricers, spreadsheets and bots**: stable JSON columns, EUR everywhere, one id per product, a clickable page per row.
- **Compare markets**: this is the EU side of the market, from the marketplace where Europe actually buys. Pair it with the [TCG Price Arbitrage](https://apify.com/lowlanddata/tcg-price-arbitrage) actor for the EU-vs-US spread.

### Which games are covered?

All 21 games Cardmarket publishes a price guide for. Card counts were read from Cardmarket's own files on 2026-09-09; "priced" means the marketplace has published a trend or average price, and the rest are catalogued but have not sold often enough yet.

| Game                 | Input value         | Cards priced | Cards catalogued |
| -------------------- | ------------------- | -----------: | ---------------: |
| Magic: The Gathering | `magic`             |      123,781 |          126,715 |
| Yu-Gi-Oh!            | `yugioh`            |       78,770 |           89,213 |
| Pokémon              | `pokemon`           |       69,617 |           78,244 |
| Cardfight!! Vanguard | `cardfightvanguard` |       26,468 |           28,409 |
| Weiss Schwarz        | `weissschwarz`      |       24,640 |           29,193 |
| Flesh and Blood      | `fleshandblood`     |       16,552 |           18,002 |
| Dragon Ball Super    | `dragonballsuper`   |       13,504 |           13,859 |
| One Piece            | `onepiece`          |       12,802 |           13,187 |
| Digimon              | `digimon`           |        9,549 |            9,806 |
| Star Wars Unlimited  | `starwarsunlimited` |        7,890 |            8,146 |
| Force of Will        | `forceofwill`       |        7,736 |            8,629 |
| World of Warcraft    | `worldofwarcraft`   |        7,662 |            7,904 |
| Final Fantasy TCG    | `finalfantasy`      |        5,476 |            5,587 |
| Disney Lorcana       | `lorcana`           |        3,587 |            3,636 |
| Star Wars: Destiny   | `starwarsdestiny`   |        1,842 |            2,361 |
| My Little Pony       | `mylittlepony`      |        1,803 |            2,345 |
| Battle Spirits Saga  | `battlespiritssaga` |        1,787 |            1,916 |
| The Spoils           | `thespoils`         |        1,642 |            2,340 |
| Riftbound            | `riftbound`         |        1,522 |            1,550 |
| Dragoborne           | `dragoborne`        |          679 |              747 |
| Cyberpunk            | `cyberpunk`         |            2 |              313 |

### Not supported yet

**Gundam.** Cardmarket publishes a product catalogue for it but no price-guide
file, so there is nothing to price against. It goes in as soon as they publish one.

A game the marketplace has only just listed carries a full catalogue and an almost empty price guide, which is why Cyberpunk sits at the bottom of that table. A run on one of those comes back empty under the default `onlyPriced` and says so, rather than looking broken; set `onlyPriced` to false to export the catalogue anyway.

**Gundam** is the one game not covered: Cardmarket publishes its product catalogue but no price guide file, so there is nothing to price against. It goes in the day they publish one.

### How much does it cost?

**$0.29 per 1,000 rows** plus $0.005 per run, on the standard tier. Filtering happens *before* delivery, so you only pay for rows you keep:

- Watching one set (~250 cards) daily: about **$0.08 a day**.
- A name filter like "charizard" across all of Pokémon: a few cents.
- The full Pokémon guide (~65k rows): about **$19** — the bulk-export case, priced accordingly.

Compare that with card-price APIs at $19–149/month for the same underlying numbers.

### Not technical? Let your AI assistant set it up

Paste this to Claude, ChatGPT or Cursor along with what you want to track:

```text
I want daily card prices from the Apify actor lowlanddata/cardmarket-price-guide.
Build me the input JSON.

Fields:
- game: one of pokemon, magic, yugioh, lorcana, onepiece, digimon, fleshandblood,
  starwarsunlimited, dragonballsuper, finalfantasy, weissschwarz, cardfightvanguard,
  battlespiritssaga, riftbound, forceofwill, starwarsdestiny, mylittlepony,
  worldofwarcraft, thespoils (default pokemon)
- searchQuery: case-insensitive name filter, empty = whole game (optional)
- expansionIds: array of numeric Cardmarket expansion ids (optional)
- priceMinEur / priceMaxEur: price band on the trend price (optional)
- onlyPriced: skip cards with no price data (default true)
- sortBy: trend_desc | trend_asc | momentum | name (default trend_desc)
- maxItems: cap on delivered rows (default 1000)

Here is what I want to track: <describe your cards, sets or price band>

Give me the JSON only, then tell me how to schedule this daily on the actor page.
```

### Input

| Field                         | What it does                                                     |
| ----------------------------- | ---------------------------------------------------------------- |
| `game`                        | Which TCG to price (default `pokemon`).                          |
| `searchQuery`                 | Case-insensitive name filter. Empty = the whole game.            |
| `expansionIds`                | Keep only these Cardmarket expansion ids (visible in every row). |
| `priceMinEur` / `priceMaxEur` | Price band on the trend price.                                   |
| `onlyPriced`                  | Skip cards with no regular-variant price data (default on).      |
| `sortBy`                      | `trend_desc` (default), `trend_asc`, `momentum`, or `name`.      |
| `maxItems`                    | Cap on delivered rows.                                           |

#### Finding an expansion id

Cardmarket publishes no public list of set names, so sets are filtered by numeric id. Run once with a name filter, read `expansionId` off the rows you want — the run log also lists the dominant ids in your result — then re-run with just the ids and a high `maxItems`. Opening any row's `productUrl` shows which set an id belongs to.

### Use it from your code

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/lowlanddata~cardmarket-price-guide/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"game":"pokemon","searchQuery":"charizard","sortBy":"momentum","maxItems":100}'
```

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('lowlanddata/cardmarket-price-guide').call({
  game: 'magic',
  expansionIds: [5320],
  maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

```python
from apify_client import ApifyClient

client = ApifyClient(token=os.environ["APIFY_TOKEN"])
run = client.actor("lowlanddata/cardmarket-price-guide").call(run_input={
    "game": "lorcana",
    "priceMinEur": 5,
    "sortBy": "trend_desc",
})
for card in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(card["name"], card["priceTrendEur"])
```

Even a whole-game export fits comfortably inside the 300-second synchronous wall — the data is a file read, not a crawl.

### 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 — the agent picks the filters and reads the prices, no glue code.

Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com/?actors=lowlanddata/cardmarket-price-guide"
```

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

```text
https://mcp.apify.com?actors=lowlanddata/cardmarket-price-guide
```

Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp), or start from this actor's own MCP page: [apify.com/lowlanddata/cardmarket-price-guide/api/mcp](https://apify.com/lowlanddata/cardmarket-price-guide/api/mcp).

Prompts that work once connected:

- "What are the ten fastest-rising Pokémon cards on Cardmarket right now?"
- "Price my list of Magic cards at today's EU trend prices."
- "Which Lorcana cards over €5 are trading below their 30-day average?"

### Is it legal to use Cardmarket's price guide?

Yes. Cardmarket publishes these price files openly, refreshed daily — the actor reads exactly what the marketplace itself makes public. Nothing is crawled, no login, no anti-bot measures, nothing circumvented. And the data is aggregate market statistics: no seller identity, no listing text, no personal data of any kind, so the output is safe to store, share and resell downstream.

### FAQ

**Where do the prices come from?** Cardmarket's official daily price guide — the same figures shown on cardmarket.com product pages.

**How fresh is the data?** Refreshed once a day by Cardmarket; every row carries its `priceGuideDate`. A daily schedule right after the refresh (early morning CET) gives you a continuous price history if you keep the datasets.

**What is the trend price?** Cardmarket's own smoothed market price — the number the marketplace shows as "the" price of a card. `avg1/avg7/avg30` are averages of actual sales over 1, 7 and 30 days; `priceLowEur` is the cheapest current listing.

**What does `trendVsAvg30Pct` mean?** How far today's trend price sits from the card's own 30-day sale average, in percent. Sort by `momentum` to rank the whole game by it.

**What are the foil columns?** The same statistics for the foil/holo variant, where one exists. `null` means Cardmarket has no data for that variant.

**Why do some cards have no prices at all?** Very illiquid products may have no recent sales. They are skipped by default; set `onlyPriced` to false to include them.

**Does this include graded cards (PSA/BGS)?** No — Cardmarket trades raw cards, and this guide prices raw singles. Graded cards are a different market.

**What's the cheapest way to watch 50 specific cards?** Filter one expansion plus a price band, or run per-name tasks. `maxItems` hard-caps spend either way.

**Can I see individual offers or sellers?** Not here — this is the aggregate guide. For live underpriced *offers* on specific cards, use the [Cardmarket Deal Finder](https://apify.com/lowlanddata/cardmarket-deal-finder).

### Related actors

- [Cardmarket Deal Finder](https://apify.com/lowlanddata/cardmarket-deal-finder) — live offers priced well under trend, per card.
- [TCG Price Arbitrage](https://apify.com/lowlanddata/tcg-price-arbitrage) — EU (Cardmarket) vs US (TCGplayer) spreads on the same cards.

### Troubleshooting

- **A card you expected is missing** — check `onlyPriced`: illiquid cards without price data are skipped by default.
- **`productUrl` is null** — a handful of games (Star Wars: Destiny, My Little Pony, World of Warcraft, The Spoils) have no stable public site path; the prices are still real.
- **Zero rows on a name filter** — the catalog names variants in brackets ("Mew ex \[Genome Hacking]"); try a shorter fragment of the name.

Something else off? Open an issue on the **Issues tab** — it is read daily. And if the prices are earning their keep, a rating on this page takes ten seconds and helps other card people find the data.

# Actor input Schema

## `game` (type: `string`):

Which trading card game to price.

## `searchQuery` (type: `string`):

Case-insensitive name filter, e.g. "charizard" or "black lotus". Leave empty for the whole game.

## `expansionIds` (type: `array`):

Cardmarket expansion ids to keep. Ids are numeric because Cardmarket publishes no public list of set names: run once with a name filter, read expansionId off the rows you want (the run log also lists the dominant ids), then re-run with just the ids. Opening any row's productUrl shows which set an id belongs to.

## `priceMinEur` (type: `integer`):

Keep cards whose trend price is at least this.

## `priceMaxEur` (type: `integer`):

Keep cards whose trend price is at most this.

## `onlyPriced` (type: `boolean`):

Skip cards without any regular-variant price data.

## `sortBy` (type: `string`):

Order of the delivered rows.

## `maxItems` (type: `integer`):

Upper bound on delivered rows.

## Actor input object example

```json
{
  "game": "pokemon",
  "searchQuery": "charizard",
  "onlyPriced": true,
  "sortBy": "trend_desc",
  "maxItems": 1000
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per card with daily EU market prices and trends.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "game": "pokemon",
    "searchQuery": "charizard"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/cardmarket-price-guide").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "game": "pokemon",
    "searchQuery": "charizard",
}

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/cardmarket-price-guide").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "game": "pokemon",
  "searchQuery": "charizard"
}' |
apify call lowlanddata/cardmarket-price-guide --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lowlanddata/cardmarket-price-guide"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/lEJHCdFWPAaj7ql7k/builds/lSQAfb4yq2MbnWuus/openapi.json
