OverwolfO Spire Codex agora está no Overwolf. Saiba mais →

Slay the Spire 2 (STS2) Desenvolvedores

Crie ferramentas, bots e conteúdo com os dados do Spire Codex. Tudo é gratuito e aberto.

Widget de tooltip

Adicione tooltips ao passar o mouse no estilo Wowhead para cartas, relíquias e poções em qualquer site. Uma tag script, zero dependências.

Instalação

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

Sintaxe

[[Strike]]Tooltip de carta (tipo padrão)
[[card:Bash]]Carta (explícito)
[[relic:Burning Blood]]Relíquia
[[potion:Fire Potion]]Poção
[[character:Ironclad]]Personagem
[[monster:Jaw Worm]]Monstro
[[power:Strength]]Poder
[[event:Neow]]Evento
[[encounter:Lagavulin]]Encontro
[[enchantment:Sharp]]Encantamento
[[keyword:Exhaust]]Palavra-chave
[[orb:Lightning]]Orbe
[[affliction:Bound]]Aflição
[[achievement:Minimalist]]Conquista

API JavaScript

SpireCodex.scan()Verifica a página novamente em busca de novos padrões [[...]] (para SPAs)
SpireCodex.scan(element)Verifica um elemento DOM específico

Widget de changelog

Incorpore um visualizador de changelog compacto e interativo mostrando o histórico de atualizações do Spire Codex com troca de versão.

Instalação

<div id="scx-changelog"></div>
<script src="https://spire-codex.com/widget/spire-codex-changelog.js"></script>
data-version="1.0.4"Mostra uma versão específica (padrão: mais recente)

API REST

Banco de dados completo do jogo acessível por uma API REST pública. Sem autenticação: a cota do site por IP cobre navegação e chamadas casuais, e o uso da API sem chave recebe a taxa base abaixo. Para scripts e ferramentas, crie uma chave de API e envie-a no cabeçalho X-API-Key. Crie uma na página do seu perfil. Uma chave agrupa suas requisições por identidade em vez de IP (estável entre redes, nunca compartilhada com outros usuários atrás do mesmo NAT) e oferece acompanhamento de uso; o limite do nível se aplica por endpoint. As respostas trazem X-RateLimit-Remaining / X-RateLimit-Reset para você dosar as requisições.

Limites de requisições

Tráfego do site300/minutepor IP
Sem chave de API15/minute
Usuário registrado60/minutecrie uma no seu perfil
Acadêmico100/minuteconcedido sob solicitação
Pago120/minuteapoiadores

Todos os limites contam por endpoint: a tabela é a sua cota em cada rota, não um pool global. Alguns endpoints pesados têm orçamentos próprios que valem para todo chamador, com ou sem chave (veja a exportação de partidas abaixo; o ZIP de idioma é 10/hora). Observe X-RateLimit-Remaining e recue ao receber 429 (Retry-After é definido).

Exportação em massa de partidas

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

Transmite as partidas oficiais como JSONL, uma partida por linha.

limit Limita a página; uma página cheia retorna um cursor para a próxima.
start / end Restringem a uma janela semiaberta de data de envio. Mantenha-os constantes ao paginar; o cursor não os inclui.

Este endpoint tem orçamento próprio de 120 créditos por hora, compartilhado por chamadores com e sem chave: uma requisição paginada custa 1 crédito, uma busca sem limite custa 60. Sincronização contínua funciona melhor com buscas paginadas espaçadas ~30 s; em 429, respeite o Retry-After e retome com o mesmo cursor.

Precisa do corpus inteiro? Uma chamada sem parâmetros redireciona para um arquivo estático reconstruído uma vez por dia, /exports/runs-latest.jsonl.gz, com o mesmo formato de linha; /api/exports/runs/manifest informa quando foi gerado e quantas runs contém. Cada linha traz player_token, um identificador pseudônimo estável da conta que enviou a run, null em runs anônimas.

Só um patch? /api/exports/runs?version=v0.111.0 redireciona para um arquivo estático por versão do mapa versions do manifesto, /exports/runs-v0.111.0.jsonl.gz; combinado com limit e cursor, ele pagina um único patch.

URL base

https://spire-codex.com

Canal beta (conteúdo não lançado do ramo beta da Steam): adicione isto a qualquer endpoint de entidade: ?channel=beta. Versão beta atual: /api/beta/version. Diferença completa em relação ao 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

Documentação interativa completa (gerada automaticamente do backend, sempre atual): /docs

Entidades

GET/api/cardsTodas as cartas (filtros: color, type, rarity, keyword, tag, spawns, search)
GET/api/cards/{id}Uma carta
GET/api/charactersTodos os personagens
GET/api/characters/{id}Um personagem
GET/api/relicsTodas as relíquias (filtros: rarity, pool, ancient, search)
GET/api/relics/{id}Uma relíquia
GET/api/potionsTodas as poções (filtros: rarity, pool, search)
GET/api/potions/{id}Uma poção
GET/api/monstersTodos os monstros (filtros: type, search)
GET/api/monsters/{id}Um monstro
GET/api/powersTodos os poderes (filtros: type, stack_type, search)
GET/api/powers/{id}Um poder
GET/api/eventsTodos os eventos (filtros: type, act, search)
GET/api/events/{id}Um evento
GET/api/encountersTodos os encontros (filtros: room_type, act, search)
GET/api/encounters/{id}Um encontro
GET/api/enchantmentsTodos os encantamentos
GET/api/enchantments/{id}Um encantamento
GET/api/keywordsPalavras-chave de cartas
GET/api/keywords/{id}Uma palavra-chave
GET/api/intentsTodos os tipos de intenção
GET/api/intents/{id}Uma intenção
GET/api/orbsTodos os tipos de orbe
GET/api/orbs/{id}Um orbe
GET/api/afflictionsTipos de aflição
GET/api/afflictions/{id}Uma aflição
GET/api/modifiersModificadores do modo personalizado
GET/api/modifiers/{id}Um modificador
GET/api/achievementsTodas as conquistas
GET/api/achievements/{id}Uma conquista
GET/api/badgesTodos os emblemas
GET/api/badges/{id}Um emblema
GET/api/epochsTodas as épocas
GET/api/epochs/{id}Uma época
GET/api/storiesTodas as histórias
GET/api/stories/{id}Uma história
GET/api/actsTodos os atos
GET/api/acts/{id}Um ato
GET/api/ascensionsTodos os níveis de ascensão
GET/api/ascensions/{id}Uma ascensão
GET/api/glossaryTodos os termos do glossário
GET/api/glossary/{id}Um termo

Agregações e consultas

GET/api/statsContagem de entidades
GET/api/ancient-poolsTodos os conjuntos de relíquias dos ancestrais com condições
GET/api/ancient-pools/{id}Conjuntos de um ancestral
GET/api/unlocksEntidades desbloqueáveis agrupadas por tipo com contexto de época
GET/api/history/{entity_type}/{entity_id}Histórico de versões por entidade a partir dos changelogs
GET/api/update-history/{entity_type}/{entity_id}Histórico de atualizações por patch do jogo para cada entidade
GET/api/names/{entity_type}/{entity_id}Consulta do nome de uma entidade em todos os idiomas
GET/api/searchBusca unificada do site em entidades, entradas de referência, mecânicas, guias, notícias, páginas e arquivos de imagem, com tolerância a erros de digitação (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 os changelogs
GET/api/changelogs/recent-additionsEntidades mais recentes exibidas na faixa da página inicial
GET/api/changelogs/{tag}Um changelog por tag (ex.: v1.0.20)
GET/api/newsAnúncios da Steam (espelhados localmente para permanência)
GET/api/news/{gid}Uma notícia com o corpo sanitizado
GET/api/versionsVersões de dados beta disponíveis para o seletor de versão
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

Comunidade e envios

GET/api/guidesTodos os guias (filtros: category, difficulty, tag, search)
GET/api/guides/{slug}Um guia com o markdown renderizado
POST/api/guidesEnviar um guia (webhook do Discord, com limite de requisições)
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/listNavegar pelas partidas enviadas com filtros e paginação (incl. ascension_min/ascension_max e winrate_min/winrate_max pela taxa de vitória do remetente, as faixas de conteúdo) Cada linha traz player_token, um identificador pseudônimo estável da conta que enviou a run, null em runs 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}Uma partida enviada pelo hash (com limite de requisições)
GET/api/runs/statsEstatísticas agregadas da comunidade (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 o explorador /charts: gráficos disponíveis, filtros, divisões e estatí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/diffO que a beta atual adiciona, altera e remove por tipo de entidade; alimenta cada rótulo BETA
GET/api/beta/versionA versão beta atual
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-rankSemente + posição global para uma semente (?seed=&steam_id=); os campos de rank são null sem uma partida vencida
POST/api/auth/steam/ticketTrocar um ticket de autenticação web da Steamworks pelo JWT do site (login silencioso no jogo); 503 até o servidor ter uma chave 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 build do jogo distintos com 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}/statsEstatísticas próprias de um jogador de cartas, relíquias, poções, eventos, lojas e fogueiras com Lift pessoal; mesmos filtros e privacidade de 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 feedback (webhook do Discord)

Downloads em massa

GET/api/exports/runsStream JSONL de partidas oficiais (paginação limit/start/end/cursor; orçamento próprio de 120 créditos por hora, veja Exportação em massa acima)
GET/api/exports/runs/manifestWhen the daily full run dump was generated and how many runs it holds
GET/api/exports/{lang}ZIP com todo o JSON de entidades de um idioma (10/hora)
GET/api/imagesCategorias da galeria de imagens
GET/api/images/searchBuscar imagens por nome de arquivo
GET/api/images/game/{version}/{category}/browseNavegação paginada pelas pastas de um dump completo de assets (path, offset, limit)
GET/api/images/game/{version}/{category}/downloadZIP com os arquivos de uma pasta do dump (path; limitado a 2000 arquivos)

Vários idiomas

Adicione este parâmetro de consulta a qualquer endpoint: ?lang=jpn. 15 idiomas suportados:

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

Início 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 em miniatura

Reproduza a miniatura de carta do jogo (usada nas telas de Histórico de partidas / Fim de jogo) em qualquer projeto web. Seis camadas PNG compostas com mask-image do CSS, sem canvas, sem WebGL, só sprites coloridos. As cores vêm direto do código descompilado do jogo: NTinyCard, CardPoolModel.DeckEntryCardColor.

Prévia

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

Recursos de sprite

Todos os 10 PNGs são servidos com CORS habilitado, basta colocar a URL base antes de cada nome de arquivo. Cada sprite tem 128×128, RGBA, branco sobre transparente (feito para ser colorido via 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

Cores do conjunto (verso da carta)

Fonte: CardPoolModel.DeckEntryCardColor. Compare com o campo color retornado por /api/cards.

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

Cores de raridade (faixa)

Fonte: NTinyCard.GetBannerColor. Compare com o campo rarity.

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

Receita mínima de HTML + CSS

Nome do arquivo do retrato: attack = Cartas de Ataque, power = Cartas de Poder, skill = todo o resto (Habilidade, Status, Maldição, …)

<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 React

Versão React pronta para uso. Fonte: 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" />

Imagens completas de cartas

Cada carta de /api/cards inclui duas URLs prontas para uso da carta completa renderizada pelo jogo (moldura, arte, faixa e texto, exatamente como no jogo). Cartas dos ancestrais são webps animados.

  • image_url_card — A carta base. null para a única carta sem render (mad_science); use image_url (a arte do retrato) como alternativa nesse caso.
  • image_url_card_upg — A carta aprimorada. null quando a carta não tem aprimoramento.
// 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"
}

Renders localizados ficam em uma subpasta de idioma, por exemplo: cards-full/stable/jpn/bash.webp. Todos os 15 idiomas estão disponíveis.

Renders de cartas encantadas

Cada carta também é renderizada com cada encantamento que pode receber legalmente, exatamente como a prévia de encantamento do jogo a desenha (emblema, valor e texto adicionado). As URLs seguem um único padrão:

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 em minúsculas de /api/enchantments e /api/cards (ex.: sharp, corrupted, sown).
  • Só existem combinações válidas de carta e encantamento (a exportação usa as regras de aplicabilidade do próprio jogo), então uma combinação inválida retorna 404. Os campos card_type / applicable_to em /api/enchantments descrevem quais cartas se qualificam.
  • Existem variantes base e aprimorada para cada combinação, em todos os 14 idiomas, com o texto do encantamento totalmente localizado.

Exportações de dados

Baixe todos os dados do jogo em um único arquivo ZIP. Cada arquivo contém JSONs para cada tipo de entidade (cartas, relíquias, monstros, poderes e mais).

Baixar dados em inglês (ZIP)

15 idiomas disponíveis. Exemplos de download: Japonês, Coreano, Chinês, Francês, Alemão

Documentação interativa da API

Documentação completa Swagger/OpenAPI com função de teste.

Abrir documentação da API →

Código aberto

O Spire Codex é de código aberto. O pipeline de extração de dados, a API e o frontend estão todos disponíveis no GitHub.

Ver no GitHub →