Cardmarket API: Kartenpreise und Angebote als JSON
Abgefragt wird cardmarket.com aus Sicht eines Käufers ohne Konto: Einzelkarten und Sealed-Produkte, die Preisübersicht mit ab-Preis, Preistrend und den Durchschnittspreisen über 1, 7 und 30 Tage, dazu die Angebote mit Zustand, Kartensprache und Herkunftsland des Verkäufers. Mit `"language": "de"` kommen die Namen so zurück, wie sie auf der deutschen Seite stehen, also Glurak statt Charizard und Obsidianflammen statt Obsidian Flames; Preise und IDs bleiben in jeder Sprache gleich. Cardmarkets eigene Schnittstelle ist laut ihrer Dokumentation professionellen Verkäufern vorbehalten, braucht ein Konto und dient vor allem der Pflege des eigenen Bestands. Hier geht es um die Käuferseite: was der Markt gerade anbietet und zu welchem Preis.
Endpunkte
| endpoint | Was zurückkommt | Pflicht |
|---|---|---|
| search | Suche nach Karten- oder Produktnamen innerhalb eines Spiels: Produkt-ID, Name, Erweiterung, Sammlernummer, Seltenheit, Anzahl verfügbarer Artikel und der ab-Preis aus dem Suchindex. Filter auf Kategorie (Singles, Booster-Boxes …) und nur verfügbare Produkte, Sortierung wie auf der Seite. | query |
| expansions | Alle Erweiterungen eines Spiels, neueste zuerst: Name, Slug, Set-Kürzel, Kartenanzahl und Erscheinungsdatum. | alle optional |
| expansion/products | Alle Produkte einer Erweiterung mit denselben Zeilen wie die Suche, filterbar nach Seltenheit, sortierbar nach Sammlernummer, Preis oder Beliebtheit. | expansion |
| product/detail | Ein Produkt über ID oder URL: Erweiterung, Nummer, Seltenheit, Bild, verfügbare Artikel, die Preisübersicht (ab-Preis, Preistrend, Durchschnitt 1/7/30 Tage) und der tägliche Durchschnittsverkaufspreis der letzten 30 Tage. | product_id |
| product/offers | Die öffentlichen Angebote zu einem Produkt in Cardmarkets eigener Reihenfolge: Preis, Menge, Zustand, Kartensprache, Foil/Signiert/Erstauflage/Altered, Verkäufertyp und -land. Filter auf Kartensprache, Mindestzustand, Verkäuferland, Verkäufertyp und die Sonderkennzeichen. | product_id |
| search/suggest | Die Vorschläge des Cardmarket-Suchfelds ab drei Zeichen: Produktname, Erweiterung, Link und Bild. | query |
Jeder Aufruf wird in Credits abgerechnet. Fehlgeschlagene und blockierte Aufrufe sind kostenlos.
Funktionierendes Beispiel
Für Glurak ex aus 151 (MEW 006) nennt `product/detail` einen ab-Preis von 4,55 €. Das ist das günstigste Angebot überhaupt, gleich in welcher Sprache und welchem Zustand. Mit deutscher Kartensprache, mindestens Near Mint und Verkäufern aus Deutschland beginnt die Liste bei 7,22 €, also knapp beim Preistrend von 7,66 €. Wer den ab-Preis als Marktpreis für deutsche NM-Karten abspeichert, liegt hier gut ein Drittel zu tief. In der gefilterten Antwort unten ist `price_from` deshalb aus den passenden Angeboten neu berechnet (7,22 €).
curl -X POST https://api.reefapi.com/cardmarket/v1/product/offers \
-H "x-api-key: IHR_SCHLUESSEL" \
-H "content-type: application/json" \
-d '{"product_id": 733601, "game": "Pokemon", "language": "de", "card_language": "de", "min_condition": "near_mint", "seller_country": "DE"}'{
"ok": true,
"data": {
"product": {
"product_id": 733601,
"name": "Glurak ex (MEW 006)",
"url": "https://www.cardmarket.com/de/Pokemon/Products/Singles/151/Charizard-ex-V1-MEW006",
"expansion": "151",
"number": "006",
"rarity": "Double Rare",
"available_items": 679,
"price_from": 7.22,
"price_trend": 7.66,
"currency": "EUR"
},
"offers": [
{
"offer_id": 2187487542,
"price": 7.22,
"currency": "EUR",
"price_excludes_shipping": true,
"quantity": 3,
"condition": "NM",
"condition_name": "Near Mint",
"card_language": { "code": "de", "name": "German" },
"foil": false,
"first_edition": false,
"seller": { "type": "professional", "country_code": "DE", "sales": 2500, ... },
"position": 1
},
{
"offer_id": 2184914931,
"price": 7.29,
"quantity": 1,
"condition": "NM",
"card_language": { "code": "de", "name": "German" },
"seller": { "type": "private", "country_code": "DE", "sales": 5, ... },
"position": 2
},
...
],
"count": 50,
"has_more": false,
"filters_applied": { "card_language": ["de"], "min_condition": "near_mint", "seller_country": ["DE"] },
"filter_mode": "server+local",
"offers_truncated": true,
"available_filters": { "card_languages": ["de", "en", "es", "fr", "it", "pt"], "extras": ["signed", "altered"] }
},
"meta": { "record_count": 50, "game": "Pokemon", "language": "de", "cache_hit": false, "mode": "live" }
}Eigener Cardmarket-Scraper: woran er seit September scheitert
Am 17. September 2026 hat Cardmarket den Pokémon-Bereich hinter eine JavaScript-Prüfung gestellt, die nur ein echter Browser besteht. Wir haben damals browserlose Zugriffe der Reihe nach durchgemessen: neun TLS-Profile, Anfragen aus sieben Ländern, Chrome-, Firefox- und sogar Googlebot-Kennung. Auf die Pokémon-Seiten kam keiner davon durch. Ein Skript mit requests oder curl bekommt dort seitdem nur die Challenge-Seite zu sehen, während Magic oder Yu-Gi-Oh! zunächst weiter offen blieben.
Der zweite Fall war unser eigener Fehler, und er liegt in jedem Eigenbau nahe. Die Angebotsfilter haben wir zunächst selbst auf die ersten 50 Angebote angewendet. Bei einer Karte mit 641 Angeboten fand der Filter Niederlande + Englisch + Near Mint darin nichts und meldete 0 Treffer, obwohl es passende Angebote gab. Seit dem 7. Oktober übernimmt Cardmarket das Filtern selbst, über die Parameter der Produkt-URL, und liefert die günstigsten 50 Treffer aus der vollständigen Liste.
Auch die Trefferliste der Suche kann täuschen: ihr ab-Preis stammt aus dem Suchindex, nicht von der Produktseite. Beim Bau wichen 8 von 18 Produkten ab (etwa 0,02 € gegenüber 2,00 €). Deshalb heißt das Feld dort `search_index_price_from`, und der Wert der Produktseite steht in `product/detail`.
Wer Preise für Ankauf, Inventur oder eine Sammlungsbewertung zieht, sollte vorher festlegen, welcher Wert gemeint ist: ab-Preis, Preistrend oder das günstigste passende Angebot. Für dieselbe Karte lagen die drei im Beispiel oben zwischen 4,55 € und 7,66 €.
Weitere Dokumentation auf Deutsch
- idealo API — Dokumentation
- AutoScout24 API — Dokumentation
- mobile.de API — Dokumentation
- Kleinanzeigen API — Dokumentation
- Immowelt API — Dokumentation
- OTTO API — Dokumentation
- willhaben API — Dokumentation
- MediaMarkt API — Dokumentation
- Zalando API — Dokumentation
- Amazon API (amazon.de) — Dokumentation
- Zara API — Preise Deutschland
Grenzen und ehrliche Hinweise
- Cardmarket ist an dieser Schnittstelle nicht beteiligt; es ist kein offizieller Zugang, und eine Vereinbarung mit Cardmarket gibt es nicht.
- Ohne Anmeldung zeigt Cardmarket pro Produkt nur den ersten Block von 50 Angeboten; wer weitere nachladen will, wird zur Anmeldung geschickt. `page` größer als 1 wird deshalb abgelehnt, statt leer zurückzukommen. Mit Filtern sind es die günstigsten 50 passenden Angebote, `offers_truncated` zeigt, ob die Grenze erreicht ist.
- Angebotspreise verstehen sich ohne Versand (`price_excludes_shipping: true`); Versandkosten liefert die Schnittstelle nicht.
- Preistrend und die Durchschnitte über 1, 7 und 30 Tage sind Verkaufspreise, keine Angebotspreise. Der 1-Tages-Wert kann weit danebenliegen: beim Bau stand er bei einer Karte bei 3.071,67 €, der 30-Tage-Wert bei 682,48 €.
- Im Beispiel oben haben wir den Verkäufernamen weggekürzt; die echte Antwort enthält den öffentlichen Cardmarket-Benutzernamen. Wer die Daten weitergibt, sollte prüfen, ob diese Spalte wirklich gebraucht wird.
- Die Filter `foil` und `first_edition` setzt Cardmarket über die URL nicht um; sie wirken nur auf die 50 Angebote, die ohnehin zurückkommen. Ein leeres Ergebnis heißt dann nicht, dass es keine passenden Angebote gibt.
- Der Pokémon-Bereich steht bei Cardmarket hinter einer JavaScript-Prüfung. Dort kann eine Anfrage spürbar länger dauern oder mit `RATE_LIMITED` abgelehnt werden; solche Fehlschläge werden nicht berechnet und dürfen nach kurzer Pause wiederholt werden.
- Seitensprachen sind en (Standard), de, fr, it und es; für deutsche Namen gehört `"language": "de"` in jede Anfrage. Die Währung ist immer Euro.