Desarrolladores

API pública de CardMetrics

Precios de cartas TCG en EUR y USD, en JSON y sin fricción: los mismos datos que alimentan CardMetrics (Magic, Pokémon, Yu-Gi-Oh!, Lorcana, One Piece, Star Wars: Unlimited y Digimon), con histórico ingerido a diario.

Empezar en 30 segundos

El endpoint de precios es anónimo — no necesitas cuenta ni API key. Pásale hasta 100 ids de carta separados por comas (ojo a la barra final antes de la query string: sin ella recibirás un 301):

curl "https://cards.faseconsulting.es/api/public/prices/?ids=0948e6dc-8af7-45d3-91de-a2aebee83e82"

Respuesta 200:

{
  "prices": [
    {
      "providerId": "0948e6dc-8af7-45d3-91de-a2aebee83e82",
      "amount": 4360.36,
      "currency": "EUR",
      "source": "cardmarket",
      "capturedAt": "2026-07-11T03:58:15.052Z"
    }
  ]
}

Referencia de endpoints

GET /api/public/prices/

Sin autenticación

Último precio conocido para un lote de cartas. Los ids sin precio simplemente no aparecen en la respuesta.

Parámetros

  • ids — obligatorio. Entre 1 y 100 providerIds separados por comas (caracteres permitidos: A–Z a–z 0–9 _ -).

Errores

  • 400 — ids ausente, vacío, >100 ids o con caracteres inválidos.

Respuestas cacheables en CDN: Cache-Control: public, s-maxage=300, stale-while-revalidate=600.

GET /api/public/cards/{providerId}/

Requiere API key (Bearer)

Ficha completa de una impresión de carta + su último precio. providerId admite hasta 80 caracteres (A–Z a–z 0–9 _ - : .).

Petición:

curl "https://cards.faseconsulting.es/api/public/cards/0948e6dc-8af7-45d3-91de-a2aebee83e82/" \
     -H "Authorization: Bearer cm_YOUR_API_KEY"

Respuesta 200:

{
  "providerId": "0948e6dc-8af7-45d3-91de-a2aebee83e82",
  "game": "mtg",
  "name": "Black Lotus",
  "setCode": "ced",
  "setName": "Collectors' Edition",
  "number": "233",
  "rarity": "rare",
  "language": "en",
  "printing": "standard",
  "imageUrl": "https://cards.scryfall.io/normal/front/0/9/0948e6dc-8af7-45d3-91de-a2aebee83e82.jpg?1782756162",
  "latest": {
    "source": "cardmarket",
    "currency": "EUR",
    "amount": 4360.36,
    "capturedAt": "2026-07-11T03:58:15.052Z"
  }
}

Errores

  • 400{"error":"invalid_provider_id"}
  • 401 — sin cabecera Authorization, o key desconocida/revocada/caducada:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="api"

{"error":"missing_authorization"}
  • 404{"error":"not_found"}
  • 429{"error":"rate_limited"} + Retry-After

GET /api/public/movers/

Sin autenticación

Las cartas que más suben o bajan — la misma consulta que alimenta las páginas de movers, con un límite pequeño pensado para bots y embeds. El ranking es por variación porcentual; cada fila lleva su propia divisa (nunca se mezclan EUR y USD en una misma variación).

Parámetros

  • game — opcional. Uno de: mtg · pokemon · yugioh · lorcana · onepiece · swu · digimon. Valores desconocidos → ranking global (sin 400).
  • directionup | down (por defecto up).
  • window7 | 30 | 90 días (por defecto 7).
  • limit — 1–10 (por defecto 5).

Contrato tolerante: cualquier parámetro inválido cae al valor por defecto en lugar de responder 400. El campo path viene sin locale — antepón /es/, /en/… al enlazar.

Petición:

curl "https://cards.faseconsulting.es/api/public/movers/?limit=1"

Respuesta 200:

{
  "window": 7,
  "direction": "up",
  "movers": [
    {
      "providerId": "swshp-SWSH153",
      "game": "pokemon",
      "name": "Pikachu",
      "setCode": "swshp",
      "setName": "SWSH Black Star Promos",
      "number": "SWSH153",
      "imageUrl": "https://images.pokemontcg.io/swshp/SWSH153_hires.png",
      "currency": "EUR",
      "currentAmount": 129.05,
      "priorAmount": 11.25,
      "pctChange": 1047.111111111111,
      "path": "/pokemon/swshp/pikachu-SWSH153/"
    }
  ]
}

Cache CDN: Cache-Control: public, s-maxage=600, stale-while-revalidate=3600.

GET /api/public/card-summary/

Sin autenticación

Resumen de una carta: identidad + cotización principal, cotización secundaria en la otra divisa y variación a 30 días. La cotización principal es la serie de precios más profunda y coherente (una sola fuente y divisa); la secundaria es la mejor serie en la OTRA divisa y se omite (null) si lleva más de 14 días sin actualizarse. delta30d se calcula solo sobre la serie principal.

Parámetros

  • id — obligatorio. Un providerId (1–80 caracteres: A–Z a–z 0–9 _ - : .).

Petición:

curl "https://cards.faseconsulting.es/api/public/card-summary/?id=sv1-258"

Respuesta 200:

{
  "providerId": "sv1-258",
  "game": "pokemon",
  "name": "Basic Fighting Energy",
  "setCode": "sv1",
  "setName": "Scarlet & Violet",
  "number": "258",
  "rarity": "Hyper Rare",
  "imageUrl": "https://images.pokemontcg.io/sv1/258_hires.png",
  "path": "/pokemon/sv1/basic-fighting-energy-258/",
  "primary": {
    "amount": 4.76,
    "currency": "EUR",
    "source": "cardmarket",
    "capturedAt": "2026-07-11T03:45:50.476Z"
  },
  "secondary": {
    "amount": 7.35,
    "currency": "USD",
    "source": "tcgplayer",
    "capturedAt": "2026-07-11T03:45:50.476Z"
  },
  "delta30d": 4.2857142857142785
}

Errores

  • 400{"error":"expected ?id=<providerId>"} (id ausente o con caracteres inválidos)
  • 404{"error":"card_not_found"}

Cache CDN: Cache-Control: public, s-maxage=300, stale-while-revalidate=600.

GET /api/public/set-completion/

Sin autenticación

Foto de completado de un set: total de impresiones, valor del set completo y un mapa providerId → precio, todo en UNA sola divisa (la que cotiza más cartas del set; EUR en caso de empate). Pensado para calcular el coste de completar una colección en el cliente sin subir tu lista de cartas: faltan = totalCards − tuyas; coste = totalValue − Σ prices[id]. Las cartas sin precio en esa divisa no aparecen en el mapa.

Parámetros

  • game — obligatorio. Uno de: mtg · pokemon · yugioh · lorcana · onepiece · swu · digimon.
  • setCode — obligatorio. Código del set (1–40 caracteres: A–Z a–z 0–9 espacio _ - .).

Si el set supera las 3.000 impresiones la respuesta llega con oversized: true y el mapa prices vacío (válvula de seguridad; los totales sí se devuelven).

Petición:

curl "https://cards.faseconsulting.es/api/public/set-completion/?game=pokemon&setCode=sv1"

Respuesta 200:

{
  "game": "pokemon",
  "setCode": "sv1",
  "setName": "Scarlet & Violet",
  "totalCards": 258,
  "pricedCards": 258,
  "currency": "USD",
  "totalValue": 853.08,
  "prices": {
    "sv1-1": 0.12,
    "sv1-2": 0.11,
    … 258 entradas (providerId → precio) …
  },
  "oversized": false
}

Errores

  • 400{"error":"expected ?game=<TcgGame>&setCode=<code>"}
  • 404{"error":"set_not_found"}

Cache CDN: Cache-Control: public, s-maxage=600, stale-while-revalidate=3600 (los 404 se cachean 300 s).

Autenticación y API keys

El endpoint de cartas requiere una API key. Se crean gratis desde tu cuenta (sección “API keys”): inicia sesión y genera una — la clave (prefijo cm_) se muestra UNA sola vez; si la pierdes, revócala y crea otra.

Qué desbloquea una key hoy: el endpoint GET /api/public/cards/{providerId} (ficha completa de carta + último precio). El endpoint de precios en lote seguirá siendo anónimo.

Crear una API key en tu cuenta →

Límites de uso

Cada key tiene un token bucket propio: por defecto 1.000 peticiones/hora (configurable entre 10 y 10.000 al crearla). Cada respuesta incluye las cabeceras x-ratelimit-limit y x-ratelimit-remaining; al agotarse recibirás 429 con Retry-After. El endpoint anónimo de precios se cachea 5 minutos en CDN — usa ids ordenados para compartir caché y sé razonable con la frecuencia.

¿De dónde salen los providerId?

Son los identificadores canónicos de cada impresión de carta (para Magic, el UUID de Scryfall). Puedes descubrirlos con el buscador interno GET /api/search?q=… (campo i de cada resultado) — ese endpoint es interno y su forma puede cambiar sin aviso; los endpoints /api/public/ de esta página son estables (los cambios incompatibles saldrán bajo /v2/).

Atribución (obligatoria)

Si publicas datos obtenidos de esta API debes atribuirlos a CardMetrics con un enlace visible a cards.faseconsulting.es (por ejemplo: “Datos de CardMetrics”).

Nuestros datos se construyen sobre fuentes que también exigen atribución — consérvala aguas abajo cuando muestres sus datos:

  • Precios: Cardmarket (EUR) y TCGplayer (USD, vía TCGCSV).
  • Catálogos: Scryfall (Magic), pokemontcg.io y TCGdex (Pokémon), YGOPRODeck (Yu-Gi-Oh!), Lorcast (Lorcana), OPTCG API (One Piece), SWU-DB (Star Wars: Unlimited) y DigimonCard.io (Digimon).
  • Las imágenes (imageUrl) se sirven desde los CDN oficiales de cada fuente y quedan sujetas a sus términos — enlázalas, no las copies.

Uso razonable

  • Identifícate con un User-Agent descriptivo (nombre del proyecto + contacto).
  • Nada de mirroring masivo ni reventa de los datos; la API es para apps, bots e integraciones, no para replicar la base de datos.
  • Los precios son informativos (mercado secundario), no asesoramiento de compra.