OverwolfSpire Codex è ora su Overwolf. Scopri di più →

Slay the Spire 2 (STS2) Sviluppatori

Crea strumenti, bot e contenuti con i dati di Spire Codex. Tutto è gratuito e aperto.

Widget tooltip

Aggiungi tooltip al passaggio del mouse in stile Wowhead per carte, reliquie e pozioni a qualsiasi sito. Un tag script, zero dipendenze.

Installazione

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

Sintassi

[[Strike]]Tooltip carta (tipo predefinito)
[[card:Bash]]Carta (esplicito)
[[relic:Burning Blood]]Reliquia
[[potion:Fire Potion]]Pozione
[[character:Ironclad]]Personaggio
[[monster:Jaw Worm]]Mostro
[[power:Strength]]Potere
[[event:Neow]]Evento
[[encounter:Lagavulin]]Incontro
[[enchantment:Sharp]]Incantesimo
[[keyword:Exhaust]]Parola chiave
[[orb:Lightning]]Orbe
[[affliction:Bound]]Afflizione
[[achievement:Minimalist]]Obiettivo

API JavaScript

SpireCodex.scan()Riesamina la pagina per nuovi pattern [[...]] (per SPA)
SpireCodex.scan(element)Esamina un elemento DOM specifico

Widget changelog

Incorpora un visualizzatore di changelog compatto e interattivo con la cronologia degli aggiornamenti di Spire Codex e il cambio di versione.

Installazione

<div id="scx-changelog"></div>
<script src="https://spire-codex.com/widget/spire-codex-changelog.js"></script>
data-version="1.0.4"Mostra una versione specifica (predefinita: l'ultima)

API REST

Database completo del gioco accessibile tramite un'API REST pubblica. Nessuna autenticazione richiesta: la quota del sito per IP copre la navigazione e le chiamate occasionali, e l'uso dell'API senza chiave ottiene la tariffa base qui sotto. Per script e strumenti, crea una chiave API e inviala nell'header X-API-Key. Creane una nella pagina del tuo profilo. Una chiave raggruppa le tue richieste per identità invece che per IP (stabile tra reti, mai condivisa con altri utenti dietro lo stesso NAT) e ti dà il tracciamento dell'uso; il limite del suo livello si applica per endpoint. Le risposte includono X-RateLimit-Remaining / X-RateLimit-Reset per regolare il ritmo delle richieste.

Limiti di richieste

Traffico del sito300/minuteper IP
Senza chiave API15/minute
Utente registrato60/minutecreane una nel tuo profilo
Accademico100/minuteconcesso su richiesta
A pagamento120/minutesostenitori

Tutti i limiti contano per endpoint: la tabella è la tua quota su ogni rotta, non un pool globale. Alcuni endpoint pesanti hanno budget propri che valgono per ogni chiamante a prescindere dalla chiave (vedi l'export delle partite qui sotto; lo ZIP della lingua è 10/ora). Controlla X-RateLimit-Remaining e rallenta in caso di 429 (Retry-After è impostato).

Export massivo di partite

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

Trasmette le partite ufficiali come JSONL, una partita per riga.

limit Limita la pagina; una pagina piena restituisce un cursore per la successiva.
start / end Limitano a una finestra semiaperta di data di invio. Tienili costanti durante la paginazione; il cursore non li include.

Questo endpoint ha un budget proprio di 120 crediti all'ora, condiviso tra chiamanti con e senza chiave: una richiesta paginata costa 1 credito, un prelievo illimitato (senza limit) ne costa 60. La sincronizzazione continua funziona quindi meglio con prelievi paginati distanziati di ~30 s; in caso di 429, rispetta Retry-After e riprendi con lo stesso cursore.

Serve l'intero corpus? Una chiamata senza parametri reindirizza a un file statico rigenerato una volta al giorno, /exports/runs-latest.jsonl.gz, con la stessa forma di riga; /api/exports/runs/manifest indica quando è stato generato e quante partite contiene. Ogni riga include player_token, un identificatore pseudonimo stabile dell'account che ha inviato la partita, null per le partite anonime.

Solo una patch? /api/exports/runs?version=v0.111.0 reindirizza a un file statico per versione dalla mappa versions del manifest, /exports/runs-v0.111.0.jsonl.gz; combinato con limit e cursor scorre invece una sola patch a pagine.

URL di base

https://spire-codex.com

Canale beta (contenuti non pubblicati dal ramo beta di Steam): aggiungi questo a qualsiasi endpoint di entità: ?channel=beta. Versione beta attuale: /api/beta/version. Diff completo rispetto 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.

Endpoint

Documentazione interattiva completa (generata automaticamente dal backend, sempre aggiornata): /docs

Entità

GET/api/cardsTutte le carte (filtri: color, type, rarity, keyword, tag, spawns, search)
GET/api/cards/{id}Singola carta
GET/api/charactersTutti i personaggi
GET/api/characters/{id}Singolo personaggio
GET/api/relicsTutte le reliquie (filtri: rarity, pool, ancient, search)
GET/api/relics/{id}Singola reliquia
GET/api/potionsTutte le pozioni (filtri: rarity, pool, search)
GET/api/potions/{id}Singola pozione
GET/api/monstersTutti i mostri (filtri: type, search)
GET/api/monsters/{id}Singolo mostro
GET/api/powersTutti i poteri (filtri: type, stack_type, search)
GET/api/powers/{id}Singolo potere
GET/api/eventsTutti gli eventi (filtri: type, act, search)
GET/api/events/{id}Singolo evento
GET/api/encountersTutti gli incontri (filtri: room_type, act, search)
GET/api/encounters/{id}Singolo incontro
GET/api/enchantmentsTutti gli incantesimi
GET/api/enchantments/{id}Singolo incantesimo
GET/api/keywordsParole chiave delle carte
GET/api/keywords/{id}Singola parola chiave
GET/api/intentsTutti i tipi di intento
GET/api/intents/{id}Singolo intento
GET/api/orbsTutti i tipi di sfera
GET/api/orbs/{id}Singola sfera
GET/api/afflictionsTipi di afflizione
GET/api/afflictions/{id}Singola afflizione
GET/api/modifiersModificatori della modalità personalizzata
GET/api/modifiers/{id}Singolo modificatore
GET/api/achievementsTutti gli obiettivi
GET/api/achievements/{id}Singolo obiettivo
GET/api/badgesTutti i badge
GET/api/badges/{id}Singolo badge
GET/api/epochsTutte le epoche
GET/api/epochs/{id}Singola epoca
GET/api/storiesTutte le storie
GET/api/stories/{id}Singola storia
GET/api/actsTutti gli atti
GET/api/acts/{id}Singolo atto
GET/api/ascensionsTutti i livelli di ascensione
GET/api/ascensions/{id}Singola ascensione
GET/api/glossaryTutti i termini del glossario
GET/api/glossary/{id}Singolo termine

Aggregazioni e ricerche

GET/api/statsConteggio delle entità
GET/api/ancient-poolsTutti i pool di reliquie degli antichi con condizioni
GET/api/ancient-pools/{id}Pool di un singolo antico
GET/api/unlocksEntità sbloccabili raggruppate per tipo con contesto di epoca
GET/api/history/{entity_type}/{entity_id}Cronologia delle versioni per entità dai changelog
GET/api/update-history/{entity_type}/{entity_id}Cronologia degli aggiornamenti per patch di gioco per entità
GET/api/names/{entity_type}/{entity_id}Ricerca del nome di un'entità in tutte le lingue
GET/api/searchRicerca unificata del sito su entità, voci di riferimento, meccaniche, guide, notizie, pagine e file immagine, con tolleranza agli errori di battitura (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/changelogsTutti i changelog
GET/api/changelogs/recent-additionsEntità più recenti mostrate nella fascia della home page
GET/api/changelogs/{tag}Singolo changelog per tag (es. v1.0.20)
GET/api/newsAnnunci Steam (copiati in locale per conservarli)
GET/api/news/{gid}Singola notizia con corpo sanificato
GET/api/versionsVersioni dei dati beta disponibili per il selettore di versione
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

Community e invii

GET/api/guidesTutte le guide (filtri: category, difficulty, tag, search)
GET/api/guides/{slug}Singola guida con markdown renderizzato
POST/api/guidesInvia una guida (webhook Discord, con limite di richieste)
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/listSfoglia le partite inviate con filtri e paginazione (incl. ascension_min/ascension_max e winrate_min/winrate_max per tasso di vittoria di chi invia, le fasce di contenuto) Ogni riga include player_token, un identificatore pseudonimo stabile dell'account che ha inviato la partita, null per le partite anonime. 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}Singola partita inviata per hash (con limite di richieste)
GET/api/runs/statsStatistiche aggregate della community (filtra per 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 dei grafici per l'esploratore /charts: grafici disponibili, filtri, suddivisioni e statistiche delle partite
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/diffCosa aggiunge, cambia e rimuove la beta attuale per tipo di entità; alimenta ogni etichetta BETA
GET/api/beta/versionLa versione beta attuale
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-rankSeed + posizione globale per un seed (?seed=&steam_id=); i campi di rango sono null senza una partita vinta
POST/api/auth/steam/ticketScambia un ticket di autenticazione web Steamworks con il JWT del sito (accesso silenzioso in gioco); 503 finché il server non ha una chiave 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/versionsID di build del gioco distinti con partite inviate
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}/statsStatistiche personali di un giocatore su carte, reliquie, pozioni, eventi, negozi e falò con Lift personale; stessi filtri e privacy di 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/feedbackInvia feedback (webhook Discord)

Download massivi

GET/api/exports/runsStream JSONL delle partite ufficiali (paginazione limit/start/end/cursor; budget proprio di 120 crediti all'ora, vedi Export massivo sopra)
GET/api/exports/runs/manifestWhen the daily full run dump was generated and how many runs it holds
GET/api/exports/{lang}ZIP di tutti i JSON delle entità per una lingua (10/ora)
GET/api/imagesCategorie della galleria immagini
GET/api/images/searchCerca immagini per nome file
GET/api/images/game/{version}/{category}/browseNavigazione paginata delle cartelle di un dump completo degli asset (path, offset, limit)
GET/api/images/game/{version}/{category}/downloadZIP dei file di una cartella del dump (path; massimo 2000 file)

Multilingua

Aggiungi questo parametro di query a qualsiasi endpoint: ?lang=jpn. 15 lingue supportate:

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

Avvio rapido

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 carta in miniatura

Riproduci la miniatura della carta usata in gioco (nelle schermate Cronologia partite / Game Over) in qualsiasi progetto web. Sei livelli PNG composti con mask-image CSS, niente canvas, niente WebGL, solo sprite colorati. I colori provengono direttamente dal codice decompilato del gioco: NTinyCard, CardPoolModel.DeckEntryCardColor.

Anteprima

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

Risorse sprite

Tutti i 10 PNG sono serviti con CORS abilitato, anteponi l'URL di base a ogni nome file. Ogni sprite è 128×128, RGBA, bianco su trasparente (pensato per essere colorato 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

Colori del pool (dorso carta)

Fonte: CardPoolModel.DeckEntryCardColor. Abbinali al campo color restituito da /api/cards.

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

Colori di rarità (banner)

Fonte: NTinyCard.GetBannerColor. Abbinali al campo rarity.

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

Ricetta minima HTML + CSS

Nome file del ritratto: attack = Carte Attacco, power = Carte Potere, skill = tutto il resto (Abilità, Stato, Maledizione, …)

<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

Versione React pronta all'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" />

Immagini complete delle carte

Ogni carta di /api/cards include due URL pronti all'uso della carta completa renderizzata dal gioco (cornice, illustrazione, banner e testo, esattamente come appare in gioco). Le carte degli antichi sono webp animati.

  • image_url_card — La carta base. null per l'unica carta senza render (mad_science); lì usa image_url (l'illustrazione del ritratto) come ripiego.
  • image_url_card_upg — La carta potenziata. null quando la carta non ha potenziamento.
// 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"
}

I render localizzati si trovano in una sottocartella per lingua, ad esempio: cards-full/stable/jpn/bash.webp. Tutte le 15 lingue sono disponibili.

Render delle carte incantate

Ogni carta viene renderizzata anche con ogni incantesimo che può legalmente ricevere, esattamente come la disegna l'anteprima incantesimo in gioco (badge, valore e testo aggiunto). Gli URL seguono un unico schema:

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}: id minuscoli da /api/enchantments e /api/cards (es. sharp, corrupted, sown).
  • Esistono solo le combinazioni valide di carta e incantesimo (l'export usa le regole di applicabilità del gioco), quindi una combinazione non valida restituisce 404. I campi card_type / applicable_to su /api/enchantments descrivono quali carte sono idonee.
  • Esistono varianti base e potenziata per ogni combinazione, in tutte le 14 lingue, con il testo dell'incantesimo completamente localizzato.

Esportazioni dati

Scarica tutti i dati del gioco in un unico archivio ZIP. Ogni archivio contiene file JSON per ogni tipo di entità (carte, reliquie, mostri, poteri e altro).

Scarica i dati in inglese (ZIP)

15 lingue disponibili. Download di esempio: Giapponese, Coreano, Cinese, Francese, Tedesco

Documentazione interattiva dell'API

Documentazione Swagger/OpenAPI completa con funzione di prova.

Apri la documentazione dell'API →

Open source

Spire Codex è open source. La pipeline di estrazione dei dati, l'API e il frontend sono tutti disponibili su GitHub.

Vedi su GitHub →