OverwolfSpire Codex ya está en Overwolf. Saber más →

Slay the Spire 2 (STS2) Desarrolladores

Crea herramientas, bots y contenido con los datos de Spire Codex. Todo es gratuito y abierto.

Widget de tooltips

Añade tooltips al estilo Wowhead para cartas, reliquias y pociones a cualquier sitio web. Una etiqueta script, cero dependencias.

Instalación

<script src="https://spire-codex.com/widget/spire-codex-tooltip.js"></script>

Sintaxis

[[Strike]]Tooltip de carta (tipo por defecto)
[[card:Bash]]Carta (explícito)
[[relic:Burning Blood]]Reliquia
[[potion:Fire Potion]]Poción
[[character:Ironclad]]Personaje
[[monster:Jaw Worm]]Monstruo
[[power:Strength]]Poder
[[event:Neow]]Evento
[[encounter:Lagavulin]]Encuentro
[[enchantment:Sharp]]Encantamiento
[[keyword:Exhaust]]Palabra clave
[[orb:Lightning]]Orbe
[[affliction:Bound]]Aflicción
[[achievement:Minimalist]]Logro

API de JavaScript

SpireCodex.scan()Vuelve a escanear la página en busca de nuevos patrones [[...]] (para SPA)
SpireCodex.scan(element)Escanea un elemento DOM concreto

Widget de registro de cambios

Incrusta un visor de cambios compacto e interactivo que muestra el historial de actualizaciones de Spire Codex con cambio de versión.

Instalación

<div id="scx-changelog"></div>
<script src="https://spire-codex.com/widget/spire-codex-changelog.js"></script>
data-version="1.0.4"Muestra una versión concreta (por defecto: la última)

API REST

Base de datos completa del juego accesible a través de una API REST pública. Sin autenticación: la cuota web por IP cubre la navegación y las llamadas ocasionales, y el uso de la API sin clave recibe la tarifa base de abajo. Para scripts y herramientas, crea una clave de API y envíala en la cabecera X-API-Key. Crea una en tu página de perfil. Una clave agrupa tus peticiones por identidad en lugar de por IP (estable entre redes, nunca compartida con otros usuarios tras el mismo NAT) y te da seguimiento de uso; el límite de su nivel se aplica por endpoint. Las respuestas incluyen X-RateLimit-Remaining / X-RateLimit-Reset para que puedas dosificar las peticiones.

Límites de peticiones

Tráfico web300/minutepor IP
Sin clave de API15/minute
Usuario registrado60/minutecrea una en tu perfil
Académico100/minutese concede bajo petición
De pago120/minutecolaboradores

Todos los límites cuentan por endpoint: la tabla es tu cuota en cada ruta, no un fondo global. Algunos endpoints pesados tienen sus propios presupuestos que se aplican a todos los llamantes sin importar la clave (ver la exportación de partidas más abajo; el ZIP de idioma es 10/hora). Vigila X-RateLimit-Remaining y espera ante un 429 (se envía Retry-After).

Exportación masiva de partidas

GET /api/exports/runs?limit=1000&start=2026-06-01T00:00:00Z

Transmite las partidas oficiales como JSONL, una partida por línea.

limit Limita la página; una página completa devuelve un cursor para la siguiente.
start / end Restringen a una ventana semiabierta de fecha de envío. Mantenlos constantes al paginar; el cursor no los incluye.

Este endpoint tiene su propio presupuesto de 120 créditos por hora, compartido por llamantes con y sin clave: una petición paginada cuesta 1 crédito, una descarga sin límite cuesta 60. La sincronización continua funciona mejor con descargas paginadas espaciadas ~30 s; ante un 429, respeta Retry-After y reanuda con el mismo cursor.

¿Necesitas todo el corpus? Una llamada sin parámetros redirige a un archivo estático regenerado una vez al día, /exports/runs-latest.jsonl.gz, con la misma forma de línea; /api/exports/runs/manifest indica cuándo se generó y cuántas partidas contiene. Cada línea incluye player_token, un identificador seudónimo estable de la cuenta que envió la partida, null en partidas anónimas.

¿Solo un parche? /api/exports/runs?version=v0.111.0 redirige a un archivo estático por versión del mapa versions del manifiesto, /exports/runs-v0.111.0.jsonl.gz; combinado con limit y cursor pagina en su lugar un único parche.

URL base

https://spire-codex.com

Canal beta (contenido no publicado de la rama beta de Steam): añade esto a cualquier endpoint de entidad: ?channel=beta. Versión beta actual: /api/beta/version. Diferencias completas respecto a main: /api/beta/diff.

The community stats pages were reorganized: /community-stats, /leaderboards/metrics, /charts, and the /meta page now live under /stats, /leaderboards/elo is /top-players, and run submission moved to /runs/submit. Old URLs redirect.

Endpoints

Documentación interactiva completa (generada automáticamente desde el backend, siempre actual): /docs

Entidades

GET/api/cardsTodas las cartas (filtros: color, type, rarity, keyword, tag, spawns, search)
GET/api/cards/{id}Una carta
GET/api/charactersTodos los personajes
GET/api/characters/{id}Un personaje
GET/api/relicsTodas las reliquias (filtros: rarity, pool, ancient, search)
GET/api/relics/{id}Una reliquia
GET/api/potionsTodas las pociones (filtros: rarity, pool, search)
GET/api/potions/{id}Una poción
GET/api/monstersTodos los monstruos (filtros: type, search)
GET/api/monsters/{id}Un monstruo
GET/api/powersTodos los poderes (filtros: type, stack_type, search)
GET/api/powers/{id}Un poder
GET/api/eventsTodos los eventos (filtros: type, act, search)
GET/api/events/{id}Un evento
GET/api/encountersTodos los encuentros (filtros: room_type, act, search)
GET/api/encounters/{id}Un encuentro
GET/api/enchantmentsTodos los encantamientos
GET/api/enchantments/{id}Un encantamiento
GET/api/keywordsPalabras clave de cartas
GET/api/keywords/{id}Una palabra clave
GET/api/intentsTodos los tipos de intención
GET/api/intents/{id}Una intención
GET/api/orbsTodos los tipos de orbe
GET/api/orbs/{id}Un orbe
GET/api/afflictionsTipos de aflicción
GET/api/afflictions/{id}Una aflicción
GET/api/modifiersModificadores del modo personalizado
GET/api/modifiers/{id}Un modificador
GET/api/achievementsTodos los logros
GET/api/achievements/{id}Un logro
GET/api/badgesTodas las insignias
GET/api/badges/{id}Una insignia
GET/api/epochsTodas las épocas
GET/api/epochs/{id}Una época
GET/api/storiesTodas las historias
GET/api/stories/{id}Una historia
GET/api/actsTodos los actos
GET/api/acts/{id}Un acto
GET/api/ascensionsTodos los niveles de ascensión
GET/api/ascensions/{id}Una ascensión
GET/api/glossaryTodos los términos del glosario
GET/api/glossary/{id}Un término

Agregaciones y consultas

GET/api/statsRecuento de entidades
GET/api/ancient-poolsTodas las reservas de reliquias de ancestros con condiciones
GET/api/ancient-pools/{id}Reservas de un ancestro
GET/api/unlocksEntidades desbloqueables agrupadas por tipo con contexto de época
GET/api/history/{entity_type}/{entity_id}Historial de versiones por entidad a partir de los registros de cambios
GET/api/update-history/{entity_type}/{entity_id}Historial de cambios por parche del juego para cada entidad
GET/api/names/{entity_type}/{entity_id}Consulta del nombre de una entidad en todos los idiomas
GET/api/searchBúsqueda unificada del sitio en entidades, entradas de referencia, mecánicas, guías, noticias, páginas y archivos de imagen, con tolerancia a errores de escritura (q, lang)
GET/api/search/semanticMeaning-based entity search, same item shape as /api/search (q, limit); empty when the feature is off
GET/api/merchant/configMerchant pricing config extracted from the game
GET/api/mechanics/constantsMechanics constants: room odds, gold ranges, ascension tuning
GET/api/mechanics/sectionsIndex of the mechanics pages
GET/api/mechanics/sections/{slug}One mechanics page as markdown with template tokens resolved
GET/api/changelogsTodos los registros de cambios
GET/api/changelogs/recent-additionsEntidades más recientes mostradas en la franja de la portada
GET/api/changelogs/{tag}Un registro de cambios por etiqueta (p. ej. v1.0.20)
GET/api/newsAnuncios de Steam (replicados localmente para conservarlos)
GET/api/news/{gid}Una noticia con el cuerpo saneado
GET/api/versionsVersiones de datos beta disponibles para el selector de versión
GET/api/news/codexSpire Codex site news, newest first
GET/api/news/codex/{slug}One site news entry
GET/api/announcementsActive site banner messages

Languages

GET/api/languagesAvailable languages with display names
GET/api/translationsTranslation maps for filter values and UI strings (lang)
GET/api/localizationsThe game's own localization tables as ICU MessageFormat, all of them or the ones named in ?tables= (max 50; unknown names are 404)
GET/api/localizations/tablesNames of the available localization tables
GET/api/localizations/{table}One localization table

Comunidad y envíos

GET/api/guidesTodas las guías (filtros: category, difficulty, tag, search)
GET/api/guides/{slug}Una guía con el markdown renderizado
POST/api/guidesEnviar una guía (webhook de Discord, con límite de peticiones)
POST/api/runsSubmit a run for community stats and leaderboards. The run is attached to an account only with Authorization: Bearer <jwt>; a bare steam_id is kept as a hint
POST/api/runs/claimAttach the signed-in account to previously-submitted anonymous runs by hash
GET/api/runs/listExplorar las partidas enviadas con filtros y paginación (incl. ascension_min/ascension_max y winrate_min/winrate_max según la tasa de victoria del remitente, los tramos de contenido) Cada fila incluye player_token, un identificador seudónimo estable de la cuenta que envió la partida, null en partidas anónimas. total_is_lower_bound is true when the exact count ran out of time and total is a capped lower bound.
GET/api/runs/leaderboardRun leaderboards (fastest, highest_ascension); filter by character, players, game_mode, ascension_min, winrate_min (the content brackets), build_id
GET/api/runs/shared/{run_hash}Una partida enviada por su hash (con límite de peticiones)
GET/api/runs/statsEstadísticas agregadas de la comunidad (filtrar por character, ascension, username)
GET/api/runs/community-statsThe /stats hub dataset: event decision splits, deadliest encounters, win rates by ascension/character, records. Takes the same bracket keys as the metrics tables; an unknown bracket returns HTTP 400
GET/api/charts/metaRegistro de gráficos para el explorador /charts: gráficos disponibles, filtros, divisiones y estadísticas de partidas
GET/api/charts/{chart}One pre-aggregated chart (filter: players, ascension, game_mode, username, split, bracket=a10|wr30|wr50|wr75, build_id, plus per-chart params). A saved chart id from the chart builder returns that saved chart instead
POST/api/chartsSave a chart spec to your profile (bearer token, 100 per account)
PATCH/api/charts/{id}Update the title, visibility or spec of your own saved chart; DELETE removes it
GET/api/charts/mineYour saved charts, newest first (bearer token)
GET/api/charts/publicNewest public saved charts (limit)
GET/api/tierlists/shared/{share_id}Public read-only view of a shared tier list
GET/api/beta/diffQué añade, cambia y elimina la beta actual por tipo de entidad; alimenta cada etiqueta BETA
GET/api/beta/versionLa versión beta actual
GET/api/runs/scores/{type}Codex Score + Codex Elo per entity (cards/relics/potions); ?bracket= grades within a run bracket (a10|wr30|wr50|wr75, a game version, or any metrics bracket; unknown is HTTP 400) (the in-game mod sends the same via ?stat_filter=a10|a10_wr30|a10_wr50|a10_wr75); relics accept ?act=1|2|3 to rank by acquisition act; ?character= switches to that character's slice (entries gain a scope field)
GET/api/runs/leaderboard/seed-rankSemilla + posición global para una semilla (?seed=&steam_id=); los campos de rango son null sin una partida ganada
POST/api/auth/steam/ticketCanjear un ticket de autenticación web de Steamworks por el JWT del sitio (inicio de sesión silencioso en el juego); 503 hasta que el servidor tenga una clave de Steam
GET/api/runs/metrics/{type}Dense metrics table for cards/relics/potions, one row per entity: Codex Score, win_rate with a Wilson 95% win_rate_ci, hold_rate, lift and lift_n over the floor-adjusted expectation (null under 20 seats), Codex Elo and pick_rate from free choice screens for cards and relics, a wax block on relics (Toy Box copies split out), and used/use_rate on potions. Counts are per seat, so a 4P run is four seats; the response carries total_runs, total_seats, total_wins and data_through. ?bracket=all|solo|2p|3p|4p|a10|daily|custom|wr30|wr50|wr75 or a composite like solo:standard; ?character= switches to that character's slice (rows gain per-character Elo and Pick%). An unknown bracket returns HTTP 400
GET/api/runs/metrics/shopsShop shelf table, one row per card, relic or potion: seen, bought, buy_rate, and the buyers' win_rate, win_rate_ci and lift. Same bracket keys as the other metrics tables
GET/api/runs/metrics/eventsEvent option table: chosen, share of that event's choices, win_rate, win_rate_ci and lift. Same bracket keys as the other metrics tables
GET/api/runs/metrics/campfiresRest-site choice table (rest, smith, and the rest) with a localized name per ?lang=: chosen, share, low_hp_share, win_rate, win_rate_ci and lift. Same bracket keys as the other metrics tables
GET/api/runs/versionsIDs de compilación del juego distintos con partidas enviadas
GET/api/runs/leaderboard/rank/{run_hash}Rank of one winning run within its ladder (category)
GET/api/leaderboards/eloTop players by Codex Elo over solo A10 standard runs, refreshed nightly; powers /top-players (limit, min_runs)
GET/api/runs/stats/{type}/{id}Community stats for one card, relic or potion, with per-bracket and per-character splits
GET/api/runs/stats/{type}/{id}/historyDaily Codex Score and Elo history for one entity (bracket=all|a10|wr30|wr50|wr75)
GET/api/runs/top/{type}/{character}Most-picked entities of a type for one character (limit)
GET/api/runs/encounter-statsPer-encounter appearances, fatal rate, avg damage and turns, per character too (act, room_type, multiplayer, bracket, build_id, encounter, page, limit)
GET/api/runs/encounter-seriesThe given encounters (max 20) rolled up per bracket and per recent game version
GET/api/runs/pulseCommunity run and win totals plus data_through
GET/api/runs/snapshot-statusWhether the stats are loaded or rebuilding
GET/api/runs/{run_hash}/similarNearest winning solo decks to a run and what they took that it didn't
GET/api/runs/archetypesCommunity deck archetypes, clustered nightly
GET/api/runs/encounter-buildsWhich archetypes die to an encounter and which walk past it (encounter)
GET/api/runs/deck-advisorWhat the winning decks nearest a partial deck carry that it doesn't yet (character, cards, relics)
GET/api/runs/pick-coachNearest archetypes for a partial deck and a score per offered card (character, cards, relics, offer, target)
GET/api/pairings/{item_type}/{item_id}Cards, relics and potions that show up in the same runs as this item
GET/api/draft-recs/{item_type}/{item_id}Cards players most often draft when they already hold this item
POST/api/draft-adviceRank the offered cards for the current deck
GET/api/replaysRuns with a replay to watch; same filters and row shape as /api/runs/list plus replay_url
GET/api/replays/summaryHow many replays are watchable, overall and per character
GET/api/runs/{run_hash}/replayThe stored replay journal as gzip; POST uploads one for a run you own, DELETE removes it
GET/api/players/{username}/insightsOne player's public insights with community comparison; 404 for unknown or private profiles
GET/api/players/{username}/statsEstadísticas propias de cartas, reliquias, pociones, eventos, tiendas y hogueras de un jugador con Lift personal; mismos filtros y privacidad que insights
GET/api/presence/activeLive runs from the in-game mod, deepest first
GET/api/presence/{steam_id}One player's live run; 404 when they aren't in one
GET/api/thanksGitHub contributors, special thanks, and public supporters
GET/api/mod/latestLatest mod build and the game version it was verified against
GET/api/rate-limitsThe public rate-limit tiers
POST/api/feedbackEnviar comentarios (webhook de Discord)

Descargas masivas

GET/api/exports/runsFlujo JSONL de partidas oficiales (paginación limit/start/end/cursor; presupuesto propio de 120 créditos por hora, ver Exportación masiva arriba)
GET/api/exports/runs/manifestWhen the daily full run dump was generated and how many runs it holds
GET/api/exports/{lang}ZIP con todo el JSON de entidades de un idioma (10/hora)
GET/api/imagesCategorías de la galería de imágenes
GET/api/images/searchBuscar imágenes por nombre de archivo
GET/api/images/game/{version}/{category}/browseNavegación paginada por carpetas de un volcado completo de recursos (path, offset, limit)
GET/api/images/game/{version}/{category}/downloadZIP con los archivos de una carpeta del volcado (path; máximo 2000 archivos)

Multiidioma

Añade este parámetro de consulta a cualquier endpoint: ?lang=jpn. 15 idiomas compatibles:

eng, deu, esp, fra, ita, jpn, kor, pol, ptb, rus, spa, tha, tur, zhs, zht

Inicio rápido

cURL

curl https://spire-codex.com/api/cards?color=ironclad&rarity=Rare

Python

import requests
cards = requests.get("https://spire-codex.com/api/cards", params={"color": "ironclad"}).json()
for card in cards:
    print(f"{card['name']} - {card['type']} ({card['rarity']})")

JavaScript

const res = await fetch("https://spire-codex.com/api/relics?pool=ironclad");
const relics = await res.json();
console.log(relics.map(r => r.name));

Sprite de carta en miniatura

Reproduce la miniatura de carta del juego (usada en las pantallas de Historial de partidas / Fin de partida) en cualquier proyecto web. Seis capas PNG compuestas con mask-image de CSS, sin canvas, sin WebGL, solo sprites teñidos. Los colores salen directamente del código descompilado del juego: NTinyCard, CardPoolModel.DeckEntryCardColor.

Vista previa

Ironclad / Attack / Common
Silent / Skill / Uncommon
Defect / Power / Rare
Necrobinder / Skill / Rare
Regent / Attack / Uncommon
Curse
Event
Quest

Recursos de sprites

Los 10 PNG se sirven con CORS habilitado, antepón la URL base a cada nombre de archivo. Cada sprite es de 128×128, RGBA, blanco sobre transparente (pensado para teñirse con CSS).

https://spire-codex.com/static/images/ui/run_history_card/
  card_back.png           ← tinted by pool
  desc_box.png            ← dark description area (render at 25% opacity)
  attack_portrait.png     ← portrait per card type
  attack_portrait_shadow.png
  skill_portrait.png
  skill_portrait_shadow.png
  power_portrait.png
  power_portrait_shadow.png
  banner_shadow.png       ← render at 60% opacity
  banner.png              ← tinted by rarity

Colores de reserva (dorso de carta)

Fuente: CardPoolModel.DeckEntryCardColor. Compáralos con el campo color que devuelve /api/cards.

ironclad#D62000
silent#5EBD00
defect#3EB3ED
necrobinder#CD4EED
regent#E36600
colorless#A3A3A3
event#A3A3A3
curse#585B61
quest#24476A
status#FFFFFF
token#FFFFFF

Colores de rareza (banner)

Fuente: NTinyCard.GetBannerColor. Compáralos con el campo rarity.

Basic#9C9C9C
Starter#9C9C9C
Common#9C9C9C
Uncommon#64FFFF
Rare#FFDA36
Curse#E669FF
Event#13BE1A
Ancient#13BE1A
Quest#F46836
Status#9C9C9C
Token#9C9C9C

Receta mínima de HTML + CSS

Nombre de archivo del retrato: attack = Cartas de Ataque, power = Cartas de Poder, skill = todo lo demás (Habilidad, Estado, Maldición, …)

<div class="tiny-card" style="
  --back: #D62000;   /* pool color, Ironclad */
  --banner: #FFDA36; /* rarity color, Rare */
  position: relative;
  width: 64px;
  height: 64px;
">
  <!-- 1. card back, tinted by pool -->
  <div class="layer" style="
    background-color: var(--back);
    mask: url(https://spire-codex.com/static/images/ui/run_history_card/card_back.png) center/contain no-repeat;
    -webkit-mask: url(https://spire-codex.com/static/images/ui/run_history_card/card_back.png) center/contain no-repeat;
  "></div>

  <!-- 2. description box -->
  <img class="layer" src="https://spire-codex.com/static/images/ui/run_history_card/desc_box.png" style="opacity:.25">

  <!-- 3. portrait shadow + portrait (attack/skill/power) -->
  <img class="layer" src="https://spire-codex.com/static/images/ui/run_history_card/attack_portrait_shadow.png">
  <img class="layer" src="https://spire-codex.com/static/images/ui/run_history_card/attack_portrait.png"
       style="filter: brightness(.95) sepia(.15)">

  <!-- 4. banner shadow + banner tinted by rarity -->
  <img class="layer" src="https://spire-codex.com/static/images/ui/run_history_card/banner_shadow.png" style="opacity:.6">
  <div class="layer" style="
    background-color: var(--banner);
    mask: url(https://spire-codex.com/static/images/ui/run_history_card/banner.png) center/contain no-repeat;
    -webkit-mask: url(https://spire-codex.com/static/images/ui/run_history_card/banner.png) center/contain no-repeat;
  "></div>
</div>

<style>
  .tiny-card .layer {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    object-fit: contain;
  }
</style>

Componente de React

Versión de React lista para usar. Fuente: TinyCard.tsx

import TinyCard from "./TinyCard";

// Feed in the three fields from /api/cards:
<TinyCard color="ironclad" type="Attack" rarity="Rare" className="w-16 h-16" />

Imágenes completas de cartas

Cada carta de /api/cards incluye dos URL listas para usar de la carta completa renderizada por el juego (marco, arte, banner y texto, exactamente como se ve en el juego). Las cartas de ancestros son webp animados.

  • image_url_card — La carta base. null para la única carta sin render (mad_science); usa image_url (el arte del retrato) como alternativa ahí.
  • image_url_card_upg — La carta mejorada. null cuando la carta no tiene mejora.
// e.g. /api/cards/bash
{
  "id": "BASH",
  "image_url":          "/static/images/cards/bash.webp",  // portrait art
  "image_url_card":     "https://cdn.spire-codex.com/cards-full/stable/bash.webp",
  "image_url_card_upg": "https://cdn.spire-codex.com/cards-full/stable/bash_upg.webp"
}

Los renders localizados están en una subcarpeta de idioma, por ejemplo: cards-full/stable/jpn/bash.webp. Los 15 idiomas están disponibles.

Renders de cartas encantadas

Cada carta también se renderiza con cada encantamiento que puede recibir legalmente, exactamente como la dibuja la vista previa de encantamiento del juego (insignia, valor y texto añadido). Las URL siguen un único patrón:

https://cdn.spire-codex.com/cards-full/stable/ench/{enchantment}/{card}.webp        // English, base
https://cdn.spire-codex.com/cards-full/stable/ench/{enchantment}/{card}_upg.webp    // English, upgraded
https://cdn.spire-codex.com/cards-full/stable/{lang}/ench/{enchantment}/{card}.webp // localized

// e.g. Anger with Corrupted, in Japanese:
https://cdn.spire-codex.com/cards-full/stable/jpn/ench/corrupted/anger.webp
  • {enchantment} / {card}: ids en minúsculas de /api/enchantments y /api/cards (p. ej. sharp, corrupted, sown).
  • Solo existen combinaciones válidas de carta y encantamiento (la exportación usa las reglas de aplicabilidad del propio juego), así que una combinación inválida da 404. Los campos card_type / applicable_to de /api/enchantments describen qué cartas cumplen.
  • Existen variantes base y mejorada para cada combinación, en los 14 idiomas, con el texto del encantamiento totalmente localizado.

Exportaciones de datos

Descarga todos los datos del juego en un único archivo ZIP. Cada archivo contiene ficheros JSON para cada tipo de entidad (cartas, reliquias, monstruos, poderes y más).

Descargar datos en inglés (ZIP)

15 idiomas disponibles. Descargas de ejemplo: Japonés, Coreano, Chino, Francés, Alemán

Documentación interactiva de la API

Documentación completa Swagger/OpenAPI con función para probar las llamadas.

Abrir la documentación de la API →

Código abierto

Spire Codex es de código abierto. El pipeline de extracción de datos, la API y el frontend están disponibles en GitHub.

Ver en GitHub →