API de Cardmarket: precios y ofertas de cartas coleccionables, con nombres en español (JSON)
En cardmarket.com/es, el precio «desde» de una carta casi nunca es lo que pagarías por una copia en español y en buen estado. Esta API reúne en un mismo JSON las tres piezas que lo explican: la guía de precios de Cardmarket, la media de venta de los últimos 30 días y la lista de ofertas con idioma de la carta, estado y país del vendedor, tal como las ve cualquiera sin iniciar sesión. Con `"language": "es"`, los nombres siguen la versión española de la web (Charizard Radiante, Astros Brillantes, Origen Perdido); ids y precios son los mismos en todos los idiomas. La API oficial de Cardmarket está reservada a vendedores profesionales con cuenta, que la usan para gestionar su propio stock. Con esta no se pone nada a la venta: se consulta el mercado.
Endpoints
| endpoint | Qué devuelve | Obligatorios |
|---|---|---|
| search | Búsqueda por nombre de carta o producto dentro de un juego (Pokémon por defecto; también Magic, One Piece, Yu-Gi-Oh!, Lorcana y otros, 21 en total): id, nombre en español y en inglés (`name_en`), expansión, número, rareza, artículos a la venta y el «desde» del índice del buscador. Filtro por categoría (Singles, Booster-Boxes…) y por productos con ofertas; 30, 50 o 100 filas por página. | query |
| expansions | Las expansiones de un juego, de la más reciente a la más antigua: nombre, código, número de cartas y fecha de salida. | todos opcionales |
| expansion/products | Todos los productos de una expansión, con las mismas filas que la búsqueda, filtrables por rareza y ordenables por número, precio o popularidad. | expansion |
| product/detail | Un producto por id o URL: guía de precios («desde», tendencia y medias de venta a 1, 7 y 30 días), la media de venta día a día de los últimos 30 días y las 50 primeras ofertas. | product_id |
| product/offers | Las ofertas públicas de un producto en el orden de Cardmarket: precio sin envío, cantidad, estado (de MT a PO), idioma de la carta, foil, firmada, primera edición, alterada, tipo y país del vendedor. Filtros por idioma de la carta, estado mínimo, país y tipo de vendedor. | product_id |
| search/suggest | Lo que Cardmarket propone mientras se escribe, a partir de tres caracteres: producto, expansión, enlace e imagen. | query |
Cada llamada se cobra en créditos. Las llamadas fallidas y bloqueadas son gratuitas.
Ejemplo que funciona
El 26 de octubre de 2026, la ficha del Charizard Radiante de Pokémon GO (PGO 011) marcaba un «desde» de 9,90 €, y era una copia italiana en estado Poor. La tendencia estaba en 18,24 € y la media de venta a 30 días en 19,60 €. Entre las 50 primeras ofertas de la ficha no había ni una carta en español, y solo un vendedor estaba en España. Con los tres filtros de la petición (carta en español, Near Mint o mejor, vendedor en España) quedan 11 ofertas, de 24,95 € a 99,99 €, y Cardmarket las filtra sobre toda la lista, no solo sobre esas 50. Fíjate en que `price_from` cambia con los filtros: en esta respuesta es la primera oferta de la lista filtrada, no el «desde» de la ficha.
curl -X POST https://api.reefapi.com/cardmarket/v1/product/offers \
-H "x-api-key: TU_CLAVE" \
-H "content-type: application/json" \
-d '{"product_id": 665245, "game": "Pokemon", "language": "es", "card_language": "es", "seller_country": "ES", "min_condition": "near_mint"}'{
"ok": true,
"data": {
"product": {
"product_id": 665245,
"name": "Charizard Radiante (PGO 011)",
"url": "https://www.cardmarket.com/es/Pokemon/Products/Singles/Pokemon-GO/Radiant-Charizard-PGO011",
"expansion": "Pokémon GO",
"number": "011",
"rarity": "Ultra Rare",
"available_items": 566,
"price_from": 24.95,
"price_trend": 18.24,
"currency": "EUR"
},
"offers": [
{
"offer_id": 2181976340,
"price": 24.95,
"currency": "EUR",
"price_excludes_shipping": true,
"quantity": 1,
"condition": "NM",
"condition_name": "Near Mint",
"card_language": { "code": "es", "name": "Spanish" },
"first_edition": false,
"comment": "Nm in front,good in the back",
"seller": { "type": "private", "country_code": "ES", "country": "Spain", ... },
"position": 1
},
{
"offer_id": 2169744041,
"price": 27.94,
"quantity": 3,
"condition": "NM",
"card_language": { "code": "es", "name": "Spanish" },
"comment": "Compra con Seguridad",
"seller": { "type": "professional", "country_code": "ES", ... },
"position": 2
},
{
"offer_id": 1401608173,
"price": 29.0,
"quantity": 1,
"condition": "NM",
"card_language": { "code": "es", "name": "Spanish" },
"comment": "Del sobre a toploader",
"seller": { "type": "private", "country_code": "ES", ... },
"position": 5
},
...
{
"offer_id": 1410475122,
"price": 99.99,
"quantity": 1,
"condition": "NM",
"card_language": { "code": "es", "name": "Spanish" },
"comment": "booster to sleeve",
"seller": { "type": "private", "country_code": "ES", ... },
"position": 11
}
],
"count": 11,
"has_more": false,
"filters_applied": { "card_language": ["es"], "min_condition": "near_mint", "seller_country": ["ES"] },
"scanned_offers": 11,
"offers_truncated": false,
"filter_mode": "server+local"
},
"meta": { "record_count": 11, "game": "Pokemon", "language": "es", "cache_hit": false, "mode": "live" }
}Scraping de Cardmarket: filtros que no filtran y un orden que cambia
Los filtros de ofertas de Cardmarket solo funcionan si se envían exactamente con la forma que usa su propio formulario. En septiembre de 2026, al reconstruirlos, comprobamos que una forma inventada (por ejemplo, el idioma o el país escritos con otra estructura) se ignora sin ningún aviso: vuelve la lista entera, sin filtrar, con aspecto de respuesta correcta. Con la forma del formulario, cada filtro se aplicaba a todas las filas: 50 de 50 en inglés, 17 de 17 de Reino Unido. Por eso cada oferta lleva aquí su idioma, su estado y su país, para que puedas comprobar el filtro tú mismo.
El orden por popularidad no es estable. En tres llamadas seguidas cambió el conjunto de cartas de la primera página, y en una de ellas la segunda página repetía una carta de la primera. Ordenando por nombre, las tres llamadas devolvieron lo mismo y sin repeticiones. Si vas a recorrer una expansión entera, ordena por nombre o por número.
En la página, el idioma de la carta y el país del vendedor no son texto sino iconos. Un parser que lea solo texto se queda sin las dos columnas que más mueven el precio; el motor las traduce leyendo el formulario de filtros de esa misma página. Además, Cardmarket corta las sesiones que piden demasiadas fichas seguidas: medimos un 429 a partir de la décima ficha en la misma sesión.
Si solo te interesa el mercado español, fija desde el principio los tres filtros (idioma de la carta, país del vendedor y estado mínimo) y guárdalos junto a cada precio. Un 24,95 € sin esa etiqueta no se distingue de un 9,90 €, y en la misma carta significan cosas muy distintas.
Más documentación en español
- Mercadona API — documentación
- MercadoLibre API — documentación
- Idealista API — documentación
- Wallapop API — documentación
- Falabella API — documentación
- Fotocasa API — documentación
- Coches.net API — documentación
- AutoScout24 API — documentación
- Milanuncios API — documentación
- API de Amazon.es — documentación
- Vinted API — anuncios de vinted.es
- idealo.es API — documentación
- AliExpress API — precios para España
Límites y notas honestas
- Cardmarket no ha desarrollado ni autorizado esta interfaz: es un acceso no oficial y no existe ninguna colaboración con Cardmarket.
- La traducción de la web es parcial. Con `language: es` llegan en español «Origen Perdido», «Astros Brillantes» o «Evoluciones», pero «Base Set», «Unbroken Bonds» o «Cosmic Eclipse» siguen en inglés, igual que las rarezas («Holo Rare», «Ultra Rare») y el nombre del idioma en `card_language.name` («Spanish»). `name_en` conserva siempre el nombre inglés.
- Sin cuenta, Cardmarket enseña como mucho las 50 primeras ofertas de cada producto. Con filtros, recibes las 50 más baratas que los cumplen, y `offers_truncated` indica si se llegó a ese tope.
- Ningún precio incluye el envío (`price_excludes_shipping: true`), y lo que cobra cada vendedor por enviar tampoco viene en la respuesta.
- El «desde» de cada fila de `search` sale del índice del buscador (`search_index_price_from`). En una medición sobre 18 productos, 8 no coincidían con la ficha; el de la ficha es `price_from` en `product/detail`.
- La búsqueda clásica tiene tope: «Charizard» devolvió un total de 294 con el aviso de Cardmarket de que pueden faltar resultados (`results_may_be_incomplete: true`). Para cubrir todas las cartas de un Pokémon, recorre las expansiones con `expansion/products`.
- Cada llamada cuesta 5 créditos, salvo `product/offers`, que cuesta 8.
- Las ofertas traen el nombre de usuario público de cada vendedor; en el ejemplo está omitido. Para estudiar precios no hace falta guardarlo.