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). -
direction — up | down (por defecto up). -
window — 7 | 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).