Aller au contenu

Guide

API Train Nomade : trains SNCF en direct, gares et TGV MAX en JSON

Vérifié le 25 octobre 2026 par la rédaction de Train Nomade · sources citées et datées

L'essentiel

Train Nomade publie une API ouverte, gratuite et sans clé : les trains SNCF en temps réel (https://api.trainnomade.fr/sncf.json), les départs et arrivées de chaque gare, les horaires prévus de 145 grandes gares sur 14 jours et les places TGV MAX des 30 prochains jours. Les données viennent des fichiers ouverts de la SNCF, relevés automatiquement et contrôlés avant chaque mise en ligne ; elles sont diffusées sous licence ODbL. Cette page décrit chaque adresse, ses champs, sa fréquence de mise à jour et les règles d'usage, avec des exemples prêts à copier.

Sur cette page

Les adresses de l'API

Adresse Contenu Mise à jour Cache
https://api.trainnomade.fr/sncf.json tous les trains SNCF suivis en temps réel aujourd'hui : retard, voies, arrêts supprimés, passages constatés relevé toutes les 2 minutes 30 s
https://api.trainnomade.fr/gare/{uic}.json départs et arrivées d'une gare (1 à 4 codes UIC), de 30 minutes avant à 3 heures après le relevé toutes les 2 minutes 30 s
https://api.trainnomade.fr/gares/horaires/{slug}.json horaires prévus d'une grande gare sur 14 jours chaque nuit 1 h
https://api.trainnomade.fr/tgvmax/meta.json date et contrôles du dernier fichier TGV MAX de la SNCF chaque matin 1 h
https://api.trainnomade.fr/tgvmax/index.json.gz gares TGV MAX, jours couverts, liaisons existantes chaque matin 1 h
https://api.trainnomade.fr/tgvmax/depuis/{gare}.json.gz trains avec une place MAX JEUNE ou MAX SENIOR au départ et à l'arrivée d'une gare, sur 30 jours chaque matin 1 h
https://api.trainnomade.fr/donnees/v1/{fichier} fichiers des jeux de données ouverts de Train Nomade (CSV, JSON, GeoJSON) selon le jeu selon le jeu

Toutes les adresses répondent en HTTPS aux méthodes GET, HEAD et OPTIONS. Une adresse inconnue renvoie une erreur 404 au format JSON ({"erreur":"introuvable"}), une autre méthode une erreur 405.

Temps réel des trains : sncf.json

Le fichier liste chaque train SNCF suivi dans la journée par son numéro : TGV INOUI, OUIGO, Intercités, TER, Transilien SNCF et trains internationaux roulant en France. Il est relevé toutes les deux minutes sur le flux temps réel ouvert de la SNCF et réécrit seulement quand le flux a changé. Si la source ne répond plus, le dernier fichier valide reste en ligne : le champ perime_apres dit jusqu'à quand le croire.

Extrait réel du relevé du 25 octobre 2026 à 15 h 08 (un seul train sur 1 577) :

{
 "source": "SNCF, SIRI Lite estimated timetable (transport.data.gouv.fr, ODbL)",
 "source_url": "https://transport.data.gouv.fr/datasets/horaires-sncf",
 "collecte_le": "2026-10-25T15:08:37+01:00",
 "verifie_le": "2026-10-25T15:08:37+01:00",
 "perime_apres": "2026-10-25T15:23:15+01:00",
 "donnee_du": "2026-10-25T14:08:15.081Z",
 "jour": "2026-10-25",
 "nb_trains": 1577, "nb_annules": 25, "nb_en_retard_5min": 178, "nb_a_l_heure": 1260,
 "retard_median_s": 0, "retard_max_s": 4800,
 "trains": {
  "2421": {"p": "highSpeedRail", "o": "87113001", "on": "Paris Est", "de": "87212027", "dn": "Strasbourg",
           "t": 1792935885, "r": 1500,
           "ar": [{"s": "87113001", "d": 45960, "rd": 1200, "v": "28", "p": 1},
                  {"s": "87171926", "a": 48360, "d": 48540, "ra": 1500, "rd": 1500, "v": "3", "p": 1},
                  {"s": "87212027", "a": 52800, "ra": 1500, "v": "3", "p": 1}]},
  "…": "…"
 }
}

Lecture de l'exemple : le TGV 2421 Paris Est - Strasbourg devait partir à 12 h 46 (45 960 secondes après minuit), il est parti avec 20 minutes de retard (rd : 1 200 s), a desservi Champagne-Ardenne TGV voie 3, puis est arrivé à Strasbourg avec 25 minutes de retard.

Champ Contenu
source, source_url origine des données, à citer ; source signale aussi le flux de secours (GTFS-RT) quand il a servi
donnee_du horodatage du flux SNCF (UTC)
collecte_le, verifie_le heure du relevé qui a changé le fichier, heure du dernier relevé réussi (heure de Paris)
perime_apres au-delà, les données ne sont plus fiables : affichez « données en direct indisponibles » et les horaires théoriques
jour jour de référence des heures du fichier
nb_trains, nb_annules, nb_a_l_heure, nb_en_retard_5min chiffres du jour : trains suivis, supprimés, à l'heure (moins d'une minute de retard), en retard de 5 minutes ou plus
retard_median_s, retard_max_s retard médian et retard le plus fort du relevé, en secondes
trains un objet par numéro de train (un numéro vu deux fois dans la journée devient 6611/2)

Champs d'un train (un champ vide, nul ou faux est omis) :

Champ Contenu
p catégorie : highSpeedRail (TGV), longDistance, interregionalRail (Intercités), regionalRail (TER), local, suburbanRailway (Transilien), tramTrain, railShuttle
o, on code UIC et nom de la gare d'origine
de, dn code UIC et nom de la gare de destination
j jour de service du train quand il diffère de jour (train parti la veille qui roule après minuit)
t dernière mise à jour de la course par la SNCF (secondes Unix)
r retard actuel en secondes : au dernier arrêt passé, sinon au prochain ; négatif en cas d'avance
an 1 : train supprimé
nm 1 : train sans information en temps réel
ar arrêts dans l'ordre de desserte

Champs d'un arrêt : s (code UIC de la gare), a et d (arrivée et départ prévus), ra et rd (retard à l'arrivée et au départ, en secondes ; absent = 0), v (voie, quand la SNCF la publie), p (1 : passage constaté), x (1 : arrêt supprimé).

Les heures sont des secondes depuis minuit, heure de Paris, du jour du fichier (ou du j du train). Elles dépassent 86 400 après minuit. L'heure estimée d'un arrêt est l'heure prévue plus le retard. Le flux de secours (GTFS-RT, utilisé quand le flux principal est en panne) ne donne ni la voie ni la catégorie.

Départs et arrivées d'une gare : gare/{uic}.json

Pour un tableau de gare, inutile de télécharger tous les trains : https://api.trainnomade.fr/gare/87686006.json renvoie seulement les passages de Paris Gare de Lyon, de 30 minutes avant à 3 heures après le relevé. Une gare à plusieurs codes se demande en une fois, codes séparés par des virgules (1 à 4 codes) : https://api.trainnomade.fr/gare/87686006,87686030.json. Le code UIC de chaque gare figure dans le jeu « Gares de voyageurs » de la SNCF ; celui des 145 grandes gares est dans la liste plus bas.

Extrait réel du 25 octobre 2026 à 15 h 08 (3 passages sur 41) :

{
 "source": "SNCF, SIRI Lite estimated timetable (transport.data.gouv.fr, ODbL)",
 "collecte_le": "2026-10-25T15:08:37+01:00",
 "perime_apres": "2026-10-25T15:23:15+01:00",
 "jour": "2026-10-25",
 "maintenant_s": 54517,
 "fenetre": {"de": 52717, "a": 65317},
 "uics": ["87686006"],
 "nb_passages": 41,
 "noms": {"87686006": "Paris - Gare de Lyon - Hall 1 & 2", "71718010": "Barcelona-Sants",
          "87682302": "Montereau", "83016451": "Milano Porta Garibaldi", "…": "…"},
 "passages": [
  {"n": "9715", "d": 52920, "p": 1, "pr": "highSpeedRail", "o": "87686006", "de": "71718010", "s": "87686006"},
  {"n": "152853", "d": 53100, "rd": 60, "v": "L", "p": 1, "pr": "suburbanRailway", "o": "87686006", "de": "87682302", "s": "87686006"},
  {"n": "9255", "d": 53280, "v": "E", "p": 1, "pr": "highSpeedRail", "o": "87686006", "de": "83016451", "s": "87686006"},
  "…"
 ]
}
Champ Contenu
maintenant_s heure du relevé, en secondes depuis minuit du jour
fenetre bornes des passages retenus (de = relevé moins 30 minutes, a = relevé plus 3 heures, heure estimée)
uics, nb_passages codes demandés et nombre de passages renvoyés
noms nom de chaque gare citée (la gare demandée, les origines et les destinations), une seule fois
passages passages triés par heure estimée
n numéro du train, la même clé que dans sncf.json
a, d arrivée et départ prévus (pas de a : le train part de cette gare ; pas de d : il y finit sa course)
ra, rd, v, p, x retards, voie, passage constaté, arrêt supprimé, comme dans sncf.json
an, nm train supprimé, train sans information en temps réel
pr catégorie du train (mêmes valeurs que p dans sncf.json)
o, de, s codes de l'origine, de la destination et de la gare demandée, à lire dans noms

Un départ est un passage qui a un d : l'heure à afficher est d, avec « +N min » quand rd atteint 60 secondes, vers noms[de]. Un p sur un départ veut dire que le train est parti. Un train absent du fichier n'est pas « à l'heure » : il n'est pas suivi en temps réel, et seul son horaire théorique vaut. Les pages de gare de Train Nomade, comme celle de la gare de Lyon, lisent exactement cette adresse.

Horaires prévus sur 14 jours : gares/horaires/{slug}.json

Pour afficher les trains d'une gare au-delà des trois prochaines heures, ou quand le temps réel est indisponible, https://api.trainnomade.fr/gares/horaires/gare-de-lyon.json donne tous les trains prévus des 14 prochains jours, tirés des horaires théoriques publiés par la SNCF (GTFS). Le fichier est recalculé chaque nuit.

Extrait réel du fichier du 25 octobre 2026 (3 trains sur 284) :

{
 "v": 1,
 "gare": "Paris Gare de Lyon",
 "uic": "87686006",
 "du": "2026-10-25",
 "au": "2026-11-07",
 "source": "SNCF Voyageurs, horaires théoriques GTFS, version 2026-10-24, licence ODbL",
 "produits": ["TGV Lyria", "OUIGO", "TGV INOUI", "TER"],
 "familles": ["TGV", "TGV", "TGV", "TER"],
 "trains": [
  ["7829", 1, "Paris Gare de Lyon", "Marseille Saint-Charles", null, 363, 16383],
  ["9761", 0, "Paris Gare de Lyon", "Genève Cornavin", null, 376, 16254],
  ["6641", 2, "Paris Gare de Lyon", "Lyon Perrache", null, 380, 7998],
  "…"
 ]
}

Chaque train est une liste de sept valeurs : numéro, rang du produit dans produits (et de sa famille dans familles), origine, destination, arrivée prévue et départ prévu en minutes depuis minuit (null quand le train part de la gare ou y termine), puis un masque des jours de circulation. Le bit 0 du masque correspond à la date du, le bit 1 au lendemain, et ainsi de suite : 16383 (14 bits à 1) signale un train qui circule les 14 jours. Dans l'exemple, le OUIGO 7829 part à 6 h 03 vers Marseille chaque jour de la période.

Le fichier ne contient que les trains publiés dans les horaires SNCF : les RER et une partie des Transilien n'y figurent pas, si bien que la liste est vide pour quelques gares d'Île-de-France desservies seulement par ces lignes.

Les 145 gares disponibles : nom, code UIC, nom du fichier d'horaires
GareCode UICHoraires prévus
Agde87781278gare-d-agde
Agen87586008gare-d-agen
Aix-en-Provence TGV87319012gare-aix-en-provence-tgv
Aix-les-Bains le Revard87741132gare-aix-les-bains-le-revard
Amiens87313874gare-d-amiens
Angers Saint-Laud87484006gare-angers-saint-laud
Angoulême87583005gare-d-angouleme
Annecy87746008gare-d-annecy
Annemasse87745497gare-d-annemasse
Antibes87757674gare-d-antibes
Arcachon87582668gare-d-arcachon
Argenteuil87381848gare-d-argenteuil
Arles87753657gare-d-arles
Arras87342014gare-d-arras
Aubagne87751750gare-d-aubagne
Aulnay-sous-Bois87271411gare-d-aulnay-sous-bois
Auray87476200gare-d-auray
Avignon Centre87765008gare-avignon-centre
Avignon TGV87318964 (et 87981902)gare-avignon-tgv
Bayonne87673004gare-de-bayonne
Belfort87184002gare-de-belfort
Belfort - Montbéliard TGV87300822gare-belfort-montbeliard-tgv
Bellegarde-sur-Valserine87745000gare-de-bellegarde-sur-valserine
Besançon Viotte87718007gare-besancon-viotte
Béthune87342006gare-de-bethune
Béziers87781005gare-de-beziers
Bondy87113407gare-de-bondy
Bordeaux Saint-Jean87581009gare-bordeaux-saint-jean
Bourg-en-Bresse87743005gare-de-bourg-en-bresse
Bourges87576207gare-de-bourges
Brest87474007gare-de-brest
Brive-la-Gaillarde87594002gare-de-brive-la-gaillarde
Brunoy87682120gare-de-brunoy
Caen87444000gare-de-caen
Cannes87757625gare-de-cannes
Carcassonne87615286gare-de-carcassonne
Cenon87581595gare-de-cenon
Chambéry - Challes-les-Eaux87741009gare-chambery-challes-les-eaux
Chartres87394007gare-de-chartres
Châtellerault87575142gare-de-chatellerault
Choisy-le-Roi87545285gare-de-choisy-le-roi
Cholet87484303gare-de-cholet
Clermont-Ferrand87734004gare-de-clermont-ferrand
Colmar87182014gare-de-colmar
Colombes87381087gare-de-colombes
Compiègne87276691gare-de-compiegne
Creil87276006gare-de-creil
Dax87673202gare-de-dax
Dijon87713040gare-de-dijon
Dole87713412gare-de-dole
Douai87345009gare-de-douai
Dunkerque87281006gare-de-dunkerque
Épinal87144006gare-d-epinal
Étampes87545137gare-d-etampes
Évry-Courcouronnes87681387gare-d-evry-courcouronnes
Grenoble87747006gare-de-grenoble
Haguenau87213058gare-d-haguenau
Haussmann Saint-Lazare87281899gare-haussmann-saint-lazare
La Roche-sur-Yon87486019gare-la-roche-sur-yon
La Rochelle87485003gare-la-rochelle
La Tour-du-Pin87723478gare-la-tour-du-pin
Lamballe87473108gare-de-lamballe
Laval87478404gare-de-laval
Le Mans87396002gare-le-mans
Lens87345025gare-de-lens
Les Aubrais87543017gare-les-aubrais
Libourne87584052gare-de-libourne
Lieusaint - Moissy87682153gare-lieusaint-moissy
Lille Europe87223263gare-lille-europe
Lille Flandres87286005gare-lille-flandres
Limoges Bénédictins87592006gare-limoges-benedictins
Lyon Part Dieu87723197gare-lyon-part-dieu
Lyon Perrache87722025gare-lyon-perrache
Mâcon87725689gare-de-macon
Mantes-la-Jolie87381509gare-de-mantes-la-jolie
Marne-la-Vallée Chessy87111849gare-marne-la-vallee-chessy
Marseille Saint-Charles87751008gare-marseille-saint-charles
Massy - Palaiseau87393579gare-massy-palaiseau
Massy TGV87393702gare-massy-tgv
Melun87682005gare-de-melun
Metz87192039gare-de-metz
Miramas87753004gare-de-miramas
Montargis87684001gare-de-montargis
Montélimar87764001gare-de-montelimar
Montpellier Saint-Roch87773002gare-montpellier-saint-roch
Montpellier Sud de France87688887gare-montpellier-sud-de-france
Moulins sur Allier87696328gare-moulins-sur-allier
Mulhouse87182063gare-de-mulhouse
Nancy87141002gare-de-nancy
Nantes87481002gare-de-nantes
Narbonne87781104gare-de-narbonne
Nevers87696005gare-de-nevers
Nice87756056gare-de-nice
Nice Riquier87756353gare-nice-riquier
Nîmes87775007gare-de-nimes
Nîmes Pont du Gard87703975gare-nimes-pont-du-gard
Niort87485300gare-de-niort
Noisy-le-Sec87113217gare-de-noisy-le-sec
Orléans87543009gare-d-orleans
Paris Austerlitz87547000 (et 87547026)gare-austerlitz
Paris Bercy Bourgogne - Pays d'Auvergne87686667gare-de-bercy
Paris Est87113001gare-de-l-est
Paris Gare de Lyon87686006 (et 87686030)gare-de-lyon
Paris Gare du Nord87271007 (et 87271023, 87271031)gare-du-nord
Paris Montparnasse87391003 (et 87391102, 87391011)gare-montparnasse
Paris Saint-Lazare87384008gare-saint-lazare
Pau87672006gare-de-pau
Perpignan87784009gare-de-perpignan
Poitiers87575001gare-de-poitiers
Quimper87474098gare-de-quimper
Redon87471300gare-de-redon
Reims87171009gare-de-reims
Rennes87471003gare-de-rennes
Rouen Rive Droite87411017gare-rouen-rive-droite
Saint-Brieuc87473009gare-de-saint-brieuc
Saint-Denis87271015gare-de-saint-denis
Saint-Étienne Châteaucreux87726000gare-saint-etienne-chateaucreux
Saint-Malo87478107gare-de-saint-malo
Saint-Nazaire87481705gare-de-saint-nazaire
Saint-Pierre-des-Corps87571240gare-de-saint-pierre-des-corps
Saint-Quentin87296004gare-de-saint-quentin
Saumur87487603gare-de-saumur
Saverne87212225gare-de-saverne
Sète87773200gare-de-sete
Strasbourg87212027gare-de-strasbourg
Tarbes87671008gare-de-tarbes
Thionville87191007gare-de-thionville
Toulon87755009gare-de-toulon
Toulouse Matabiau87611004gare-toulouse-matabiau
Tourcoing87286542gare-de-tourcoing
Tours87571000gare-de-tours
Troyes87118000gare-de-troyes
Val de Fontenay87113712gare-val-de-fontenay
Valence87761007gare-de-valence
Valenciennes87343004gare-de-valenciennes
Vannes87476606gare-de-vannes
Vernon - Giverny87415604gare-vernon-giverny
Versailles Chantiers87393009gare-versailles-chantiers
Versailles Rive Droite87382861gare-versailles-rive-droite
Vichy87732008gare-de-vichy
Vienne87722587gare-de-vienne
Vierzon87576009gare-de-vierzon
Villefranche-sur-Saône87721332gare-de-villefranche-sur-saone
Vitré87471508gare-de-vitre
Yvetot87413385gare-d-yvetot

Liste au 25 octobre 2026. Le nom du fichier est aussi la fin de l'adresse de la page de la gare sur Train Nomade, quand elle existe : gare-de-lyon pour https://trainnomade.fr/gares/gare-de-lyon/.

Places TGV MAX : tgvmax/

Chaque matin, la SNCF publie en données ouvertes la disponibilité, pour les 30 jours suivants, de chaque trajet ouvert aux abonnés MAX JEUNE et MAX SENIOR (une place à zéro euro, ou plus aucune). Train Nomade relève ce fichier, le contrôle (nombre de lignes, dates couvertes, gares) et le découpe par gare : c'est le format de l'outil TGV MAX du site.

Adresse Contenu
/tgvmax/meta.json date du fichier SNCF utilisé, heure du relevé, contrôles (lignes, dates couvertes, trajets avec une place)
/tgvmax/index.json.gz j0 (premier jour couvert), jours (date, libellé, jour de la semaine de 0 = lundi à 6 = dimanche), gares (slug, nom, pays, latitude, longitude, nombre de trajets au départ, nom dans le fichier SNCF), lignes (pour chaque gare, rangs des gares atteignables en direct), st (codes et noms des gares réelles)
/tgvmax/depuis/{gare}.json.gz dep : trajets avec une place MAX au départ de la gare ; arr : à l'arrivée ; l : pour chaque destination, tous les trains des 30 jours avec ou sans place, et des statistiques par jour et par heure ; fin : gares proches (250 km au plus) d'où partent des trains vers cette gare

Le {gare} est le slug lu dans index.json.gz : paris-intramuros (toutes les gares de Paris), lyon-intramuros, lille-intramuros, marseille-st-charles, bordeaux-st-jean, rennes… (307 gares au 25 octobre 2026). Un trajet de dep est une liste : jour (0 = j0), numéro du train, départ et arrivée en minutes depuis minuit, rang de la destination dans gares, rangs des gares réelles de départ et d'arrivée dans st. Ainsi [0, 2527, 1273, 1364, 194, 210, 93], au départ de Paris, se lit : le 25 octobre, train 2527, départ 21 h 13 de Paris Est, arrivée 22 h 44 à Nancy, une place MAX disponible.

Extrait réel de meta.json du 25 octobre 2026 :

{
 "collecte_le": "2026-10-25T05:55:19",
 "maj_sncf": "2026-10-25T05:23:46+00:00",
 "source": "SNCF Voyageurs, jeu open data « tgvmax » (ressources.data.sncf.com)",
 "licence": "Open Database License (ODbL) — https://data.sncf.com/pages/cgu/A1#A1",
 "avertissement": "Disponibilité au moment du relevé, à vérifier sur SNCF Connect avant de réserver.",
 "controle": {"lignes_dedoublonnees": 344242, "date_min": "2026-10-25", "date_max": "2026-11-24", "nb_dates": 31,
              "places_0e": 55008, "part_0e": 0.16, "nb_trains": 25258, "nb_gares": 307, "alertes": []}
}

Les heures de meta.json sont en UTC. Les fichiers .json.gz sont servis compressés en gzip (Content-Type: application/gzip), sans en-tête Content-Encoding : votre programme doit les décompresser lui-même (exemples ci-dessous). Une place affichée disponible a pu partir depuis le relevé du matin : la réservation sur SNCF Connect fait foi.

Fichiers des jeux de données : donnees/v1/

Les jeux de données ouverts de Train Nomade (desserte des gares, tracés des voies entre deux arrêts, trains de nuit, puis retards observés et historique des places TGV MAX) sont mis en ligne à mesure de leur publication à l'adresse https://api.trainnomade.fr/donnees/v1/{fichier}. Les formats sont stables : CSV en UTF-8 séparé par des virgules, JSON compact, GeoJSON en coordonnées WGS84 pour les tracés. La liste des fichiers, leurs colonnes, leur date de mise à jour et leurs limites sont décrites jeu par jeu sur la page Données ouvertes de Train Nomade. Les règles de cette page (accès libre, limite de débit, licence ODbL) s'y appliquent aussi.

Exemples prêts à copier

curl (terminal)

# nombre de trains suivis et retard actuel (secondes) du TGV 6611
curl -s --compressed https://api.trainnomade.fr/sncf.json | jq '.nb_trains, .trains["6611"].r'

# prochains passages à Paris Gare de Lyon (ses deux codes UIC)
curl -s --compressed https://api.trainnomade.fr/gare/87686006,87686030.json | jq '.passages[:5]'

# trajets avec une place TGV MAX au départ de Paris : fichier gzip à décompresser
curl -s https://api.trainnomade.fr/tgvmax/depuis/paris-intramuros.json.gz | gunzip | jq '.dep | length'

JavaScript (dans une page web)

Un tableau des prochains départs, relu toutes les 60 secondes tant que l'onglet est visible. Avec cache: "no-cache", le navigateur renvoie l'ETag reçu : si rien n'a changé, la réponse est un 304 sans contenu.

const ADRESSE = "https://api.trainnomade.fr/gare/87686006.json";
const heure = (s) => { s = ((s % 86400) + 86400) % 86400; return `${Math.floor(s / 3600)} h ${String(Math.floor(s / 60) % 60).padStart(2, "0")}`; };

async function departs() {
  const reponse = await fetch(ADRESSE, { cache: "no-cache" });
  const gare = await reponse.json();
  if (new Date(gare.perime_apres) < new Date()) {
    console.log("Données en direct indisponibles : se fier aux horaires théoriques");
    return;
  }
  const prochains = gare.passages.filter((p) => p.d !== undefined && !p.p).slice(0, 5);
  for (const p of prochains) {
    const retard = p.rd >= 60 ? ` (+${Math.round(p.rd / 60)} min)` : "";
    const etat = p.an || p.x ? " supprimé" : p.v ? ` voie ${p.v}` : "";
    console.log(`${heure(p.d)}${retard} train ${p.n} vers ${gare.noms[p.de] || p.de}${etat}`);
  }
}

departs();
setInterval(() => { if (document.visibilityState === "visible") departs(); }, 60000);

Pour un fichier .json.gz (TGV MAX), le navigateur décompresse avec DecompressionStream :

const reponse = await fetch("https://api.trainnomade.fr/tgvmax/depuis/paris-intramuros.json.gz");
const texte = await new Response(reponse.body.pipeThrough(new DecompressionStream("gzip"))).text();
const paquet = JSON.parse(texte);
console.log(paquet.dep.length, "trajets avec une place MAX au départ de Paris");

Python (sans bibliothèque à installer)

import gzip, json, urllib.request
from datetime import date

ENTETES = {"User-Agent": "mon-application/1.0 (contact@exemple.fr)", "Accept-Encoding": "gzip"}

def lire(adresse):
    req = urllib.request.Request(adresse, headers=ENTETES)
    with urllib.request.urlopen(req, timeout=30) as r:
        corps = r.read()
    if corps[:2] == b"\x1f\x8b":   # réponse compressée (demandée, ou fichier .json.gz)
        corps = gzip.decompress(corps)
    return json.loads(corps)

# les 5 trains les plus en retard en ce moment
trains = lire("https://api.trainnomade.fr/sncf.json")
print(trains["nb_trains"], "trains suivis,", trains["nb_en_retard_5min"], "en retard de 5 minutes ou plus")
for numero, t in sorted(trains["trains"].items(), key=lambda kv: kv[1].get("r", 0), reverse=True)[:5]:
    print(numero, t.get("on"), "->", t.get("dn"), round(t.get("r", 0) / 60), "min")

# départs prévus aujourd'hui à Paris Gare de Lyon (horaires sur 14 jours)
h = lire("https://api.trainnomade.fr/gares/horaires/gare-de-lyon.json")
rang_du_jour = (date.today() - date.fromisoformat(h["du"])).days
departs = sorted((dep, h["produits"][p], num, dest) for num, p, orig, dest, arr, dep, masque in h["trains"]
                 if dep is not None and masque >> rang_du_jour & 1)
for dep, produit, num, dest in departs[:10]:
    print(f"{dep // 60:02d}:{dep % 60:02d}", produit, num, "vers", dest)

Le code de ces exemples est libre : copiez-le, modifiez-le et redistribuez-le sans condition.

Limites d'usage et bonnes pratiques

  • Accès libre : sans clé, sans compte, sans inscription, pour un usage personnel comme professionnel.
  • Limite de débit : 30 requêtes au plus par période de 10 secondes et par adresse IP, pour l'ensemble de api.trainnomade.fr. Au-delà, le serveur répond 429 Too Many Requests et bloque l'adresse une dizaine de secondes : attendez avant de réessayer, en allongeant le délai à chaque échec.
  • Rythme conseillé : temps réel (sncf.json, gare/…) toutes les 60 secondes au plus souvent, puisque le fichier change au mieux toutes les deux minutes ; horaires prévus une fois par jour ; TGV MAX une fois par matin. Arrêtez les relectures quand votre page n'est pas affichée.
  • Le plus léger d'abord : pour une ou quelques gares, lisez gare/{uic}.json (quelques kilo-octets) plutôt que sncf.json (plus d'un mégaoctet).
  • Requêtes conditionnelles : chaque réponse porte un ETag ; renvoyez-le dans If-None-Match et vous recevrez un 304 sans contenu si rien n'a changé.
  • Identifiez-vous : pour un programme qui tourne sur un serveur, mettez dans l'en-tête User-Agent le nom de votre service et une adresse de contact.
  • Fraîcheur : respectez perime_apres. Passé cette heure, affichez que les données en direct sont indisponibles plutôt qu'un retard ancien.
  • Sans garantie : le service est gratuit et fonctionne sans interruption prévue, mais une panne de la source SNCF ou du relevé peut retarder une mise à jour. Pour une information officielle (voie, correspondance, suppression), l'application du transporteur et l'affichage en gare font foi.
  • Évolution : nous pouvons ajouter des champs ; un changement qui casserait un usage existant (champ retiré ou renommé, adresse déplacée) sera annoncé dans le journal en bas de cette page avant d'être appliqué.

CORS, cache et en-têtes

Les réponses peuvent être lues depuis n'importe quel site : elles portent Access-Control-Allow-Origin: *, Access-Control-Allow-Methods: GET, HEAD, OPTIONS et Access-Control-Max-Age: 86400. Les réponses JSON sont compressées (gzip ou brotli) quand le client le demande par Accept-Encoding.

Adresse Cache-Control Autres en-têtes
sncf.json public, max-age=30 ETag, Last-Modified
gare/{uic}.json public, max-age=30 ETag
gares/horaires/{slug}.json public, max-age=3600 (1 heure) ETag, Last-Modified
tgvmax/… public, max-age=3600 (1 heure) ETag, Last-Modified, Content-Type: application/gzip pour les .json.gz

Toutes les réponses portent aussi X-Robots-Tag: noindex (l'API n'a pas vocation à apparaître dans les moteurs de recherche) et X-Content-Type-Options: nosniff.

Licence et sources

Toutes les données de l'API dérivent de bases publiées par la SNCF sous Open Database License (ODbL 1.0). Elles sont donc diffusées sous la même licence :

Ce que la licence demande :

  • Citer la source partout où les données sont affichées ou redistribuées : la SNCF comme producteur, Train Nomade comme diffuseur (formules ci-dessous). Le champ source de chaque fichier donne la mention exacte.
  • Partager à l'identique : si vous publiez une base de données tirée de ces fichiers (un historique de retards, une compilation par ligne), publiez-la sous ODbL. Un simple affichage (page web, application, carte, graphique) demande seulement la mention des sources.
  • Garder l'accès ouvert : une base dérivée diffusée sous une forme verrouillée doit aussi être proposée sous une forme ouverte.

Indépendance : Train Nomade est un site indépendant, sans lien avec la SNCF. N'utilisez pas les logos de la SNCF à côté de ces données et ne présentez pas ce service comme officiel. Le détail de toutes les sources du site est sur la page Sources et licences.

Comment citer Train Nomade

Dans un article, un mémoire ou un tableau de données :

Train Nomade, Trains SNCF en temps réel, d'après les données ouvertes de la SNCF (SIRI Lite, licence ODbL). https://api.trainnomade.fr/sncf.json, consulté le [date].

Sous un tableau ou une carte, sur un site :

<p>Données : SNCF (ODbL), via <a href="https://trainnomade.fr/">Train Nomade</a>, mise à jour : [date].</p>

Dans la presse, la formule courte suffit : « selon les données de la SNCF compilées par Train Nomade ». Écrivez bien « Train Nomade » (trainnomade.fr), en deux mots.

Contact

Une question, une erreur dans les données, un besoin d'un autre format, ou un usage qui demanderait plus de 30 requêtes par 10 secondes ? Écrivez à contact@trainnomade.fr ou passez par la page de contact. Pour voir ces données à l'œuvre : la carte des trains en direct, le suivi d'un train par son numéro et la carte des gares de France.

Journal des changements

Date Changement
21 octobre 2026 ouverture de api.trainnomade.fr : temps réel des trains SNCF (sncf.json), départs et arrivées des gares (gare/{uic}.json), horaires prévus des gares et places TGV MAX
25 octobre 2026 publication de cette documentation

Questions fréquentes

Existe-t-il une API gratuite des retards des trains SNCF ?

Oui. https://api.trainnomade.fr/sncf.json donne tous les trains SNCF suivis en temps réel dans la journée, avec leur retard, leurs voies et leurs arrêts supprimés, sans compte ni clé. Le fichier est relevé toutes les deux minutes sur le flux temps réel ouvert de la SNCF (SIRI Lite, licence ODbL).

Faut-il une clé, un compte ou une inscription ?

Non. Toutes les adresses de l'API se lisent par une simple requête GET, depuis un serveur comme depuis une page web (CORS ouvert). Seule règle : 30 requêtes au plus par période de 10 secondes et par adresse IP, toutes adresses confondues.

Comment obtenir les départs et les arrivées d'une gare ?

Avec son code UIC à 8 chiffres : https://api.trainnomade.fr/gare/87686006.json pour Paris Gare de Lyon, par exemple. Les codes figurent dans le jeu « Gares de voyageurs » de la SNCF et, pour 145 grandes gares, dans la liste de cette page.

Puis-je utiliser ces données dans une application commerciale ?

Oui, gratuitement, en respectant la licence ODbL des données SNCF : citer la SNCF comme source et Train Nomade comme diffuseur, et publier sous la même licence toute base de données que vous en tireriez. Un simple affichage (site, application, carte) demande seulement la mention des sources.

L'API donne-t-elle la position GPS des trains ?

Non. Aucun train ne publie sa position GPS en données ouvertes. L'API fournit les horaires, les retards et les passages constatés en gare ; la position estimée qu'affiche la carte de Train Nomade est calculée dans le navigateur à partir de ces données et du tracé des voies.