API per sviluppatori

API pubblica, gratuita e in sola lettura. Sono file JSON statici: nessuna chiave, nessun account, solo richieste GET. Questa pagina è l'indirizzo stabile della documentazione.

Indirizzo base: https://statcade.com/api/

Indice macchina: /api/index.json · Licenza: uso libero con attribuzione

Endpoint

Ogni file ha in cima version, generated_at e license. La versione attuale dello schema è 1. Un aggiornamento può aggiungere campi, non cambiare il significato di quelli già pubblicati: se un campo cambia significato, version sale.

MetodoPercorsoContenuto
GET/api/index.jsonVersione, data di generazione, elenco degli endpoint e link alla licenza.
GET/api/games.jsonElenco dei giochi in catalogo, con i campi principali.
GET/api/games/{appid}.jsonScheda completa di un gioco. Esempio: /api/games/730.json.
GET/api/rankings.jsonClassifiche correnti: giocatori connessi su Steam e copie vendute.
GET/api/releases.jsonUscite in calendario, le stesse della pagina Uscite.

appid è l'id Steam numerico (730) oppure w- seguito da uno slug per i titoli non Steam (w-tetris). Un appid assente risponde con la pagina 404 del sito, in HTML, non con un JSON di errore.

Esempi di richiesta

curl:

curl -s https://statcade.com/api/games/730.json

fetch, da una pagina su un altro dominio (il CORS è aperto, vedi sotto):

const res = await fetch("https://statcade.com/api/rankings.json");
if (!res.ok) throw new Error(res.status);
const data = await res.json();
const top = data.rankings.players.entries[0];
console.log(top.rank, top.name, top.players);

Esempi di risposta

Estratto di /api/games.json. L'elenco vero contiene tutto il catalogo, ordinato per giocatori connessi decrescenti; i giochi senza quel dato stanno in fondo, a parità di nome. Qui c'è una sola riga e count vale 1 perché l'esempio torni: nel file pubblicato count è il numero di elementi di games.

{
  "version": 1,
  "generated_at": "2026-10-17T05:22:00Z",
  "license": "https://statcade.com/api/licenza/",
  "data_updated": "2026-10-17T05:22:00Z",
  "count": 1,
  "games": [
    {
      "appid": "730",
      "name": "Counter-Strike 2",
      "short": "CS2",
      "steam": true,
      "players": 568345,
      "sales_millions": null,
      "sales_scope": null,
      "sales_note": null,
      "genres": ["Sparatutto", "Azione", "Free-to-Play"],
      "tags": ["Free-to-Play"],
      "developer": "Valve",
      "publisher": "Valve",
      "release": "21 ago 2012",
      "platform": null,
      "free": true,
      "price": "Gratis",
      "early_access": false,
      "metacritic": null,
      "cover": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/730/header.jpg",
      "url": "https://statcade.com/api/games/730.json"
    }
  ]
}

Estratto di /api/games/730.json. Nel file vero description, about, screenshots e news sono completi.

{
  "version": 1,
  "generated_at": "2026-10-17T05:22:00Z",
  "license": "https://statcade.com/api/licenza/",
  "data_updated": "2026-10-17T05:22:00Z",
  "game": {
    "appid": "730",
    "name": "Counter-Strike 2",
    "players": 568345,
    "sales_millions": null,
    "genres": ["Sparatutto", "Azione", "Free-to-Play"],
    "developer": "Valve",
    "publisher": "Valve",
    "price": "Gratis",
    "description": "Per oltre due decenni, Counter-Strike ha offerto un'esperienza competitiva…",
    "screenshots": ["https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/730/ss_1.jpg"],
    "website": "http://counter-strike.net/",
    "news": [
      {
        "title": "Counter-Strike 2 Update",
        "url": "https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1846651706675829",
        "date": 1792018968,
        "source": "Community Announcements",
        "summary": "Demo/Replay viewer improvements…"
      }
    ],
    "page": "https://statcade.com/giochi/730.html"
  }
}

Estratto di /api/rankings.json. Le due classifiche sono rankings.players e rankings.sales. Ogni elenco qui ha una riga e count vale 1: nel file vero count è la lunghezza di entries.

{
  "version": 1,
  "generated_at": "2026-10-17T05:22:00Z",
  "license": "https://statcade.com/api/licenza/",
  "data_updated": "2026-10-17T05:22:00Z",
  "rankings": {
    "players": {
      "id": "players",
      "title": "Giocatori connessi su Steam",
      "unit": "players",
      "count": 1,
      "entries": [
        {"rank": 1, "appid": "730", "name": "Counter-Strike 2", "players": 568345, "url": "https://statcade.com/api/games/730.json"}
      ]
    },
    "sales": {
      "id": "sales",
      "title": "Copie vendute",
      "unit": "millions_of_copies",
      "count": 1,
      "entries": [
        {"rank": 1, "appid": "w-tetris", "name": "Tetris", "sales_millions": 520.0, "sales_scope": "tutte le piattaforme", "publisher": "Vari editori su licenza (Elorg, poi The Tetris Company)", "release": "1988", "url": "https://statcade.com/api/games/w-tetris.json"}
      ]
    }
  }
}

Campi

null vuol dire «non disponibile» o «non si applica». Non è uno zero. I nomi dei campi restano in inglese; i valori testuali (generi, prezzi, date di uscita del catalogo) sono in italiano, come sul sito.

Involucro, su ogni file

CampoTipoSignificato
versionnumeroVersione dello schema. Oggi 1.
generated_atstringaIstante UTC YYYY-MM-DDTHH:MM:SSZ dell'ultima volta in cui il contenuto di quel file è cambiato. Su index.json è la fotografia del passaggio corrente. Sugli altri file resta fermo finché i dati di quel file non cambiano.
licensestringaURL della licenza d'uso.
data_updatedstringaPer l'indice, l'elenco, le schede e le classifiche coincide con il generated_at di quel file. Per le uscite è la data di data/uscite.json, a volte solo YYYY-MM-DD.

Gioco, nell'elenco

CampoTipoSignificato
appidstringaId Steam, oppure w-<slug>.
namestringaNome del gioco.
shortstringaNome breve usato sul sito, se esiste; altrimenti uguale a name.
steambooleanotrue se il gioco è su Steam.
playersintero o nullGiocatori connessi su Steam al momento della fotografia. Non è un flusso in tempo reale.
sales_millionsnumero o nullCopie vendute, in milioni. Se la fonte non pubblica la cifra, il campo è null: non stimiamo.
sales_scopestringa o nulltutte le piattaforme, PC, oppure la console su cui è stata contata un'esclusiva.
sales_notestringa o nullQuando la stessa cifra è già contata su un'altra edizione, qui c'è il rinvio e sales_millions è null.
genreselencoGeneri in italiano. Lo store a volte mette qui anche etichette come Free-to-Play, ripetute in tags.
tagselencoEtichette Steam che non sono generi: Free-to-Play, Accesso anticipato, Multigiocatore di massa.
developerstringa o nullSviluppatore o sviluppatori, in un'unica stringa.
publisherstringa o nullEditore o editori, in un'unica stringa.
releasestringa o nullData di uscita così come è scritta sul sito, non in formato ISO. Esempi: 21 ago 2012, 1988. Un anno arrivato come numero viene pubblicato come stringa.
platformstringa o nullPiattaforma dei titoli non Steam. Null per i giochi Steam.
freebooleanotrue se lo store lo segna come gratuito.
pricestringa o nullPrezzo già formattato dello store italiano: 29,99€, Gratis, Non in vendita, da 9,99€. Non è un numero. Null se non c'è un prezzo Steam.
early_accessbooleanoAccesso anticipato su Steam.
metacriticintero o nullPunteggio Metacritic riportato da Steam, se c'è. Un decimale si arrotonda all'intero più vicino e lo 0,5 va verso l'alto (87.5 diventa 88).
coverstringa o nullURL della copertina orizzontale sul CDN di Steam.
urlstringaURL della scheda JSON di questo gioco.

Scheda completa, in più rispetto all'elenco

CampoTipoSignificato
sales_sourcestringa o nullPagina da cui arriva sales_millions, di solito Wikipedia.
genre_sourcestringa o nullFonte usata per completare i generi, se non bastava lo store.
info_sourcestringa o nullFonte di sviluppatore o editore, quando il dato non arriva da Steam.
capsulestringa o nullURL della copertina verticale Steam.
descriptionstringa o nullDescrizione breve dello store.
aboutstringa o nullTesto «informazioni sul gioco», accorciato come sulla scheda del sito.
screenshotselencoURL degli screenshot, al massimo sei: dal settimo in poi non si pubblicano. Lista vuota se non ci sono.
websitestringa o nullSito ufficiale indicato sullo store.
newselencoNotizie Steam del gioco: title, url, date (secondi Unix UTC), source, summary.
pagestringaScheda dello stesso gioco su Statcade: https://statcade.com/giochi/<appid>.html.

Classifiche

rank è la posizione dopo l'ordinamento, a partire da 1. A parità di valore decide il nome, poi l'appid: i ranghi restano consecutivi anche quando il numero è uguale. In players entrano solo i giochi con un dato giocatori. In sales solo quelli con sales_millions valorizzato. Ogni riga ha rank, appid, name e url verso la scheda. La classifica vendite aggiunge sales_millions, sales_scope, publisher e release.

Uscite

CampoTipoSignificato
datestringa o nullGiorno di uscita, YYYY-MM-DD, nel fuso di timezone.
date_notestringa o nullPrecisazione quando la data non è un giorno certo.
platformsstringa o nullPiattaforme in un'unica stringa, per non spezzare nomi come «Xbox Series X|S».
genreselencoEtichette come sulla pagina Uscite, spesso in inglese. Non sono i generi italiani del catalogo.
sourcestringa o nullDove è stata verificata la data.
urlstringa o nullScheda API se quell'appid è già nel catalogo, altrimenti null.

In cima al file ci sono anche timezone e note.

Ogni quanto si aggiorna

I giocatori connessi, il catalogo e le notizie di gioco vengono riletti ogni giorno intorno alle 05:00 UTC. I JSON di questa API si rigenerano nello stesso passaggio, insieme ai dati: un file viene riscritto solo se il suo contenuto è cambiato, e index.json a ogni passaggio. Le copie vendute cambiano quando cambiano le liste di Wikipedia e il passaggio quotidiano le riprende. Le uscite seguono il calendario della pagina Uscite, che non si ricalcola da solo ogni notte. index.json ha il generated_at della fotografia corrente; sugli altri file quel campo dice quando è cambiato quel file. Tra un passaggio e l'altro i giocatori non si muovono.

Tipo di contenuto e CORS

Il sito è ospitato su GitHub Pages. Un file che finisce in .json viene servito con Content-Type: application/json; charset=utf-8. Le risposte includono Access-Control-Allow-Origin: *, quindi una pagina su un altro dominio può leggerle con fetch senza una preautorizzazione. Lo abbiamo verificato sugli JSON già pubblicati di statcade.com.

GitHub Pages non applica intestazioni scelte da chi pubblica il sito: un file _headers verrebbe ignorato, e per questo non c'è nel repository. La cache osservata è di circa 10 minuti (Cache-Control: max-age=600). Se l'hosting cambiasse, questa sezione va aggiornata.

Uso corretto

Non c'è una quota pubblicata da GitHub Pages. I dati cambiano al massimo una volta al giorno: scarica il file e conservalo. Interrogare lo stesso indirizzo molte volte al minuto non ottiene numeri più freschi e può essere rallentato dall'hosting. Una lettura ogni tanto, o dopo aver visto un generated_at nuovo su index.json, è il ritmo giusto.

L'API non è un sostituto di Steam. Non usarla per aggirare le condizioni d'uso di Valve.

Attribuzione

Se mostri questi dati in pubblico, cita Statcade con un link a questa pagina. Se mostri le copie vendute, cita anche sales_source. Se mostri i giocatori connessi, cita Steam. Il testo pronto e i limiti sui dati di Steam e Wikipedia sono nella licenza.

Esempio: «Giocatori: Statcade (statcade.com/api), rilevazione Steam. Copie vendute: Statcade, da Wikipedia.»

Cosa non c'è

Gli articoli della redazione, la chat, i commenti e i dati dei visitatori non fanno parte dell'API. Nemmeno il codice, il logo e la grafica del sito: quelli restano tutti i diritti riservati.