dati-trasporti

Orari dei treni del Sud Italia in JSON, pronti da usare in un’app: un file per operatore, le stazioni con i codici di ogni fonte e gli scioperi annunciati. Li scrive una CI ogni settimana (gli scioperi ogni giorno) e si leggono da GitHub Pages:

https://lordmarte-a669.github.io/dati-trasporti/<file>

Pages risponde con gzip, ETag (304 se non è cambiato niente) e access-control-allow-origin: *.

Stato. Gli orari (dati.json, treni-*.json) sono online e aggiornati ogni lunedì dalla CI; scioperi.json è online e aggiornato ogni giorno. stazioni.json arriva più avanti.

File

File Contenuto
dati.json Indice, scritto per ultimo: schema, versione (istante ISO), provvisorio (sotto) e per ogni operatore file, validoDal/validoAl (primo e ultimo giorno di una corsa qualunque: non la fine del servizio pieno, che può arrivare mesi prima), sha256 del file, numero di corse, doppie (quanti numeri hanno almeno un giorno con due corse), tipico (corse attive nel giorno più pieno dei 7 giorni dalla generazione), versioneFonte e asset della fonte. Leggere prima questo.
treni-TI.json Trenitalia: le corse con almeno una fermata in Puglia, Basilicata, Calabria o Molise
treni-FNB.json Ferrotramviaria (Bari Nord)
treni-FAL.json Ferrovie Appulo Lucane
treni-FDG.json Ferrovie del Gargano
stazioni.json (in arrivo) Anagrafe unica: per ogni stazione i codici di ViaggiaTreno, lefrecce, RFI, eticket e del Punto di Accesso Nazionale, con coordinate da OpenStreetMap
scioperi.json Scioperi del settore ferroviario e del trasporto locale che riguardano questi operatori, dal Ministero dei Trasporti
interruttori.json Interruttori di emergenza dell’app Sciamn: non fanno parte dei dati, si possono ignorare

Lo schema dei file è versionato (schema in dati.json): un cambio incompatibile alza il numero.

Formato dei file degli orari

Ogni treni-<OP>.json scrive la corsa programmata una volta sola, con un calendario a bit condiviso tra le corse che circolano negli stessi giorni (molto più compatto di una corsa per ogni data). Chi legge valida il file una volta e poi ne espande le corse del giorno che gli serve.

{
  "schema": 1,
  "agency_id": "TI",
  "versioneFonte": "2026-10-05T15:07:02Z",
  "generato": "2026-10-12T14:35:03Z",
  "validoDal": "2026-10-03",
  "validoAl": "2027-06-12",
  "conteggi":  { "corse": 1, "fermate": 1, "doppie": 0 },
  "fermate":   [["rfi:S11119", "BARI CENTRALE", 41.1177, 16.8697, "830011119"]],
  "calendari": ["0111110011111"],
  "corse":     [["23539", null, "REG", 2, [[1, 837], [2, 845, 1], [0, 885, 0, 1]], 0]]
}

stop_id provvisori

Per FNB, FAL e FDG le fermate escono oggi come fnb:nap-…, fal:nap-…, fdg:nap-… (il codice dopo nap- è l’identificativo della fermata nel Punto di Accesso Nazionale). È una forma provvisoria per le stazioni di FNB e FAL: con stazioni.json diventeranno <rete>:<codice eticket>; le fermate dei bus e quelle di FDG, che un codice eticket non ce l’hanno, restano nap-. Il quinto campo di ogni fermata (nap) serve proprio a tradurli quando arriverà l’anagrafe. dati.json lo dichiara nel campo provvisorio, un array di avvisi in chiaro (oggi uno solo, su questi stop_id e sul campo nap).

Fonti e licenze

I dettagli sono in LICENZA.md. Orari indicativi: per viaggiare fanno fede le fonti ufficiali.