API Cardmarket : prix, tendance et offres des cartes à collectionner en JSON
Combien vaut un Dracaufeu du Set de Base en français, en état Excellent, chez un vendeur installé en France ? Sur cardmarket.com, la réponse est répartie entre trois endroits : le guide des prix, l'historique des ventes et la liste des offres. Les trois arrivent ici dans un même JSON, tels que les voit un visiteur sans compte. Avec `"language": "fr"`, les noms suivent la version française du site (Dracaufeu, Flammes Obsidiennes, Zénith Suprême) ; identifiants et prix restent les mêmes d'une langue à l'autre, et tout est affiché en euros. L'API officielle de Cardmarket, elle, est réservée aux vendeurs professionnels, exige un compte et sert à gérer son propre stock. Ici, rien n'est mis en vente : on lit le marché.
Endpoints
| endpoint | Ce qui est renvoyé | Obligatoires |
|---|---|---|
| search | Recherche par nom de carte ou de produit dans un jeu (Pokémon par défaut, mais aussi Magic, One Piece, Lorcana… 21 jeux au total) : identifiant, nom français et nom anglais (`name_en`), extension, numéro, rareté, nombre d'articles en vente et prix « à partir de » issu de l'index de recherche. Filtre par catégorie (Singles, Booster-Boxes…) et produits disponibles ; 30, 50 ou 100 lignes par page. | query |
| expansions | Les extensions d'un jeu, de la plus récente à la plus ancienne : nom, code, nombre de cartes et date de sortie. | tous optionnels |
| expansion/products | Tous les produits d'une extension (Base-Set, 151…), avec les mêmes lignes que la recherche, filtrables par rareté et triables par numéro, prix ou popularité. | expansion |
| product/detail | Un produit désigné par son identifiant ou son adresse : guide des prix (à partir de, tendance, moyennes de vente sur 1, 7 et 30 jours), prix moyen de vente jour par jour sur les 30 derniers jours, et les 50 premières offres. | product_id |
| product/offers | Les offres publiques d'un produit, dans l'ordre de Cardmarket : prix hors frais de port, quantité, état (de MT à PO), langue de la carte, première édition, signée, altérée, type et pays du vendeur. Filtres sur la langue de la carte, l'état minimum, le pays et le type de vendeur. | product_id |
| search/suggest | Ce que Cardmarket propose pendant la saisie, dès trois caractères tapés : produit, extension, lien et image. | query |
Chaque appel est facturé en crédits. Les appels en échec ou bloqués sont gratuits.
Exemple qui fonctionne
Pour le Dracaufeu du Set de Base (BS 4), `product/detail` affichait le 25 octobre 2026 un prix « à partir de » de 99,99 € : un exemplaire allemand en état Poor, alors que la tendance était à 495,13 €. Une fois limitée aux cartes françaises en état Excellent ou mieux, vendues depuis la France, la liste commence à 690 € et compte 31 offres. Parmi elles, 15 sont marquées `first_edition: true`, une est affichée à 100 000 €, et 18 annoncent une gradation (PSA, PCA, BGS, Beckett…) que l'on ne trouve que dans `comment`. Avant de parler de « cote » pour un Dracaufeu français hors Édition 1, passez `first_edition: false` et lisez les commentaires. Attention : ce filtre, comme `foil`, n'est pas appliqué par Cardmarket mais seulement aux 50 offres renvoyées ; ici, les 31 offres tenaient dans ce bloc.
curl -X POST https://api.reefapi.com/cardmarket/v1/product/offers \
-H "x-api-key: VOTRE_CLE" \
-H "content-type: application/json" \
-d '{"product_id": 273699, "game": "Pokemon", "language": "fr", "card_language": "fr", "min_condition": "excellent", "seller_country": "FR"}'{
"ok": true,
"data": {
"product": {
"product_id": 273699,
"name": "Dracaufeu (BS 4)",
"url": "https://www.cardmarket.com/fr/Pokemon/Products/Singles/Base-Set/Charizard-V1-BS4",
"expansion": "Set de Base",
"number": "4",
"rarity": "Holo Rare",
"price_from": 690.0,
"price_trend": 495.13,
"currency": "EUR"
},
"offers": [
{
"offer_id": 2158901338,
"price": 690.0,
"currency": "EUR",
"price_excludes_shipping": true,
"quantity": 1,
"condition": "EX",
"condition_name": "Excellent",
"card_language": { "code": "fr", "name": "French" },
"first_edition": false,
"comment": "+sleeve >TopLoader",
"seller": { "type": "private", "country_code": "FR", ... },
"position": 1
},
{
"offer_id": 2096372284,
"price": 799.99,
"condition": "EX",
"card_language": { "code": "fr", "name": "French" },
"first_edition": false,
"comment": "Envoi rapide et soigné, Gradé PSA 5",
"seller": { "type": "private", "country_code": "FR", ... },
"position": 3
},
{
"offer_id": 1389466862,
"price": 1500.0,
"condition": "EX",
"card_language": { "code": "fr", "name": "French" },
"first_edition": true,
"comment": "carte française / me contacter pour photo",
"seller": { "type": "private", "country_code": "FR", ... },
"position": 13
},
...
],
"count": 31,
"has_more": false,
"filters_applied": { "card_language": ["fr"], "min_condition": "excellent", "seller_country": ["FR"] },
"scanned_offers": 31,
"offers_truncated": false,
"available_filters": { "card_languages": ["de", "en", "es", "fr", "it", "nl", "pt"], "extras": ["signed", "first_edition", "altered"] }
},
"meta": { "record_count": 31, "game": "Pokemon", "language": "fr", "cache_hit": false, "mode": "live" }
}Scraper Cardmarket : ce que la page ne dit pas
Le 4 octobre 2026 au matin, Cardmarket était en maintenance. Le site répondait par une page « Maintenance | Cardmarket » avec un statut HTTP 429, un code que l'on prend d'ordinaire pour une limitation de débit ou un blocage anti-robot, et annonçait un retour vers 14 h, heure de Paris. Notre propre moteur a d'abord pris cette réponse pour un blocage et a renvoyé TARGET_BLOCKED pendant plusieurs heures. Depuis, il lit le contenu de la page : une maintenance revient comme une erreur à part, avec l'heure de fin publiée par Cardmarket.
Un identifiant qui n'existe plus ne donne pas de 404. `?idProduct=999999999` atterrit sur la page générale des produits, l'adresse d'un produit supprimé sur la liste de son extension, une extension inconnue sur la liste des cartes. Un script qui se fie au seul code 200 stocke alors une page de liste à la place de la fiche. Le moteur compare l'adresse finale à la demande et renvoie NOT_FOUND ou INVALID_PARAM.
La recherche classique a un plafond. « Dracaufeu » sur la version française annonce un total de 300, et Cardmarket affiche au-dessus de la liste un avertissement indiquant que des résultats peuvent manquer ; le moteur le transmet dans `results_may_be_incomplete`. Pour couvrir toutes les cartes d'un Pokémon, parcourez plutôt les extensions une à une avec `expansion/products`.
Une dernière chose, à régler dès la conception : une carte gradée PSA 8 et une carte non gradée en état Excellent doivent-elles entrer dans la même moyenne ? Cardmarket les range dans la même liste d'offres, et aucun champ structuré ne les sépare.
Autres documentations en français
- leboncoin API — documentation
- Carrefour API — documentation
- Rakuten API — documentation
- Cdiscount API — documentation
- Fnac API — documentation
- AliExpress API — documentation
- Mubawab API — documentation
- API Vinted — annonces de vinted.fr
- idealo.fr API — documentation
- AutoScout24 API — documentation (autoscout24.fr)
- Moteur.ma API — documentation
Limites et remarques honnêtes
- Cardmarket ne fournit pas cette API et n'y est associé d'aucune manière : il ne s'agit pas d'un accès officiel, et aucun partenariat n'existe.
- Sans compte, Cardmarket ne montre que le premier bloc de 50 offres par produit ; `page` au-delà de 1 est donc refusé au lieu de revenir vide. Avec des filtres, vous obtenez les 50 offres correspondantes les moins chères, et `offers_truncated` indique si cette limite a été atteinte.
- Les prix des offres s'entendent hors frais d'envoi (`price_excludes_shipping: true`) ; les frais de port ne sont pas renvoyés.
- La gradation n'a pas de champ dédié. Sur les 31 offres de l'exemple, 18 mentionnaient PSA, PCA, BGS, Beckett ou un autre organisme, et uniquement dans `comment`. La mention « Shadowless » n'apparaissait, elle aussi, que dans le commentaire.
- La tendance et les moyennes sur 1, 7 et 30 jours sont des prix de vente, pas des prix d'offre. Sur le Dracaufeu du Set de Base, la moyenne d'un jour (1 025 €) dépassait le double de la moyenne sur 30 jours (452,42 €) : ne la prenez pas pour une cote.
- Le prix « à partir de » d'une ligne de `search` vient de l'index de recherche (`search_index_price_from`) et peut différer de la fiche ; le chiffre de la page produit est `price_from` dans `product/detail`.
- Langues du site : en (par défaut), de, fr, it et es. Sans `"language": "fr"`, les noms reviennent en anglais (Charizard) ; avec, `name_en` garde le nom anglais à côté du nom français.
- Cardmarket fait passer ses visiteurs par une vérification JavaScript, quel que soit le jeu : une requête peut donc être plus lente ou refusée avec RATE_LIMITED, et ces échecs ne sont pas facturés. Nos trois appels du 25 octobre 2026 ont répondu en 1,4 à 2 secondes.
- La réponse réelle contient le pseudo public de chaque vendeur, masqué ici dans l'exemple. Pour une étude de prix, cette colonne ne sert à rien : laissez-la de côté.