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
| Gare | Code UIC | Horaires prévus |
|---|---|---|
| Agde | 87781278 | gare-d-agde |
| Agen | 87586008 | gare-d-agen |
| Aix-en-Provence TGV | 87319012 | gare-aix-en-provence-tgv |
| Aix-les-Bains le Revard | 87741132 | gare-aix-les-bains-le-revard |
| Amiens | 87313874 | gare-d-amiens |
| Angers Saint-Laud | 87484006 | gare-angers-saint-laud |
| Angoulême | 87583005 | gare-d-angouleme |
| Annecy | 87746008 | gare-d-annecy |
| Annemasse | 87745497 | gare-d-annemasse |
| Antibes | 87757674 | gare-d-antibes |
| Arcachon | 87582668 | gare-d-arcachon |
| Argenteuil | 87381848 | gare-d-argenteuil |
| Arles | 87753657 | gare-d-arles |
| Arras | 87342014 | gare-d-arras |
| Aubagne | 87751750 | gare-d-aubagne |
| Aulnay-sous-Bois | 87271411 | gare-d-aulnay-sous-bois |
| Auray | 87476200 | gare-d-auray |
| Avignon Centre | 87765008 | gare-avignon-centre |
| Avignon TGV | 87318964 (et 87981902) | gare-avignon-tgv |
| Bayonne | 87673004 | gare-de-bayonne |
| Belfort | 87184002 | gare-de-belfort |
| Belfort - Montbéliard TGV | 87300822 | gare-belfort-montbeliard-tgv |
| Bellegarde-sur-Valserine | 87745000 | gare-de-bellegarde-sur-valserine |
| Besançon Viotte | 87718007 | gare-besancon-viotte |
| Béthune | 87342006 | gare-de-bethune |
| Béziers | 87781005 | gare-de-beziers |
| Bondy | 87113407 | gare-de-bondy |
| Bordeaux Saint-Jean | 87581009 | gare-bordeaux-saint-jean |
| Bourg-en-Bresse | 87743005 | gare-de-bourg-en-bresse |
| Bourges | 87576207 | gare-de-bourges |
| Brest | 87474007 | gare-de-brest |
| Brive-la-Gaillarde | 87594002 | gare-de-brive-la-gaillarde |
| Brunoy | 87682120 | gare-de-brunoy |
| Caen | 87444000 | gare-de-caen |
| Cannes | 87757625 | gare-de-cannes |
| Carcassonne | 87615286 | gare-de-carcassonne |
| Cenon | 87581595 | gare-de-cenon |
| Chambéry - Challes-les-Eaux | 87741009 | gare-chambery-challes-les-eaux |
| Chartres | 87394007 | gare-de-chartres |
| Châtellerault | 87575142 | gare-de-chatellerault |
| Choisy-le-Roi | 87545285 | gare-de-choisy-le-roi |
| Cholet | 87484303 | gare-de-cholet |
| Clermont-Ferrand | 87734004 | gare-de-clermont-ferrand |
| Colmar | 87182014 | gare-de-colmar |
| Colombes | 87381087 | gare-de-colombes |
| Compiègne | 87276691 | gare-de-compiegne |
| Creil | 87276006 | gare-de-creil |
| Dax | 87673202 | gare-de-dax |
| Dijon | 87713040 | gare-de-dijon |
| Dole | 87713412 | gare-de-dole |
| Douai | 87345009 | gare-de-douai |
| Dunkerque | 87281006 | gare-de-dunkerque |
| Épinal | 87144006 | gare-d-epinal |
| Étampes | 87545137 | gare-d-etampes |
| Évry-Courcouronnes | 87681387 | gare-d-evry-courcouronnes |
| Grenoble | 87747006 | gare-de-grenoble |
| Haguenau | 87213058 | gare-d-haguenau |
| Haussmann Saint-Lazare | 87281899 | gare-haussmann-saint-lazare |
| La Roche-sur-Yon | 87486019 | gare-la-roche-sur-yon |
| La Rochelle | 87485003 | gare-la-rochelle |
| La Tour-du-Pin | 87723478 | gare-la-tour-du-pin |
| Lamballe | 87473108 | gare-de-lamballe |
| Laval | 87478404 | gare-de-laval |
| Le Mans | 87396002 | gare-le-mans |
| Lens | 87345025 | gare-de-lens |
| Les Aubrais | 87543017 | gare-les-aubrais |
| Libourne | 87584052 | gare-de-libourne |
| Lieusaint - Moissy | 87682153 | gare-lieusaint-moissy |
| Lille Europe | 87223263 | gare-lille-europe |
| Lille Flandres | 87286005 | gare-lille-flandres |
| Limoges Bénédictins | 87592006 | gare-limoges-benedictins |
| Lyon Part Dieu | 87723197 | gare-lyon-part-dieu |
| Lyon Perrache | 87722025 | gare-lyon-perrache |
| Mâcon | 87725689 | gare-de-macon |
| Mantes-la-Jolie | 87381509 | gare-de-mantes-la-jolie |
| Marne-la-Vallée Chessy | 87111849 | gare-marne-la-vallee-chessy |
| Marseille Saint-Charles | 87751008 | gare-marseille-saint-charles |
| Massy - Palaiseau | 87393579 | gare-massy-palaiseau |
| Massy TGV | 87393702 | gare-massy-tgv |
| Melun | 87682005 | gare-de-melun |
| Metz | 87192039 | gare-de-metz |
| Miramas | 87753004 | gare-de-miramas |
| Montargis | 87684001 | gare-de-montargis |
| Montélimar | 87764001 | gare-de-montelimar |
| Montpellier Saint-Roch | 87773002 | gare-montpellier-saint-roch |
| Montpellier Sud de France | 87688887 | gare-montpellier-sud-de-france |
| Moulins sur Allier | 87696328 | gare-moulins-sur-allier |
| Mulhouse | 87182063 | gare-de-mulhouse |
| Nancy | 87141002 | gare-de-nancy |
| Nantes | 87481002 | gare-de-nantes |
| Narbonne | 87781104 | gare-de-narbonne |
| Nevers | 87696005 | gare-de-nevers |
| Nice | 87756056 | gare-de-nice |
| Nice Riquier | 87756353 | gare-nice-riquier |
| Nîmes | 87775007 | gare-de-nimes |
| Nîmes Pont du Gard | 87703975 | gare-nimes-pont-du-gard |
| Niort | 87485300 | gare-de-niort |
| Noisy-le-Sec | 87113217 | gare-de-noisy-le-sec |
| Orléans | 87543009 | gare-d-orleans |
| Paris Austerlitz | 87547000 (et 87547026) | gare-austerlitz |
| Paris Bercy Bourgogne - Pays d'Auvergne | 87686667 | gare-de-bercy |
| Paris Est | 87113001 | gare-de-l-est |
| Paris Gare de Lyon | 87686006 (et 87686030) | gare-de-lyon |
| Paris Gare du Nord | 87271007 (et 87271023, 87271031) | gare-du-nord |
| Paris Montparnasse | 87391003 (et 87391102, 87391011) | gare-montparnasse |
| Paris Saint-Lazare | 87384008 | gare-saint-lazare |
| Pau | 87672006 | gare-de-pau |
| Perpignan | 87784009 | gare-de-perpignan |
| Poitiers | 87575001 | gare-de-poitiers |
| Quimper | 87474098 | gare-de-quimper |
| Redon | 87471300 | gare-de-redon |
| Reims | 87171009 | gare-de-reims |
| Rennes | 87471003 | gare-de-rennes |
| Rouen Rive Droite | 87411017 | gare-rouen-rive-droite |
| Saint-Brieuc | 87473009 | gare-de-saint-brieuc |
| Saint-Denis | 87271015 | gare-de-saint-denis |
| Saint-Étienne Châteaucreux | 87726000 | gare-saint-etienne-chateaucreux |
| Saint-Malo | 87478107 | gare-de-saint-malo |
| Saint-Nazaire | 87481705 | gare-de-saint-nazaire |
| Saint-Pierre-des-Corps | 87571240 | gare-de-saint-pierre-des-corps |
| Saint-Quentin | 87296004 | gare-de-saint-quentin |
| Saumur | 87487603 | gare-de-saumur |
| Saverne | 87212225 | gare-de-saverne |
| Sète | 87773200 | gare-de-sete |
| Strasbourg | 87212027 | gare-de-strasbourg |
| Tarbes | 87671008 | gare-de-tarbes |
| Thionville | 87191007 | gare-de-thionville |
| Toulon | 87755009 | gare-de-toulon |
| Toulouse Matabiau | 87611004 | gare-toulouse-matabiau |
| Tourcoing | 87286542 | gare-de-tourcoing |
| Tours | 87571000 | gare-de-tours |
| Troyes | 87118000 | gare-de-troyes |
| Val de Fontenay | 87113712 | gare-val-de-fontenay |
| Valence | 87761007 | gare-de-valence |
| Valenciennes | 87343004 | gare-de-valenciennes |
| Vannes | 87476606 | gare-de-vannes |
| Vernon - Giverny | 87415604 | gare-vernon-giverny |
| Versailles Chantiers | 87393009 | gare-versailles-chantiers |
| Versailles Rive Droite | 87382861 | gare-versailles-rive-droite |
| Vichy | 87732008 | gare-de-vichy |
| Vienne | 87722587 | gare-de-vienne |
| Vierzon | 87576009 | gare-de-vierzon |
| Villefranche-sur-Saône | 87721332 | gare-de-villefranche-sur-saone |
| Vitré | 87471508 | gare-de-vitre |
| Yvetot | 87413385 | gare-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épond429 Too Many Requestset 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 quesncf.json(plus d'un mégaoctet). - Requêtes conditionnelles : chaque réponse porte un
ETag; renvoyez-le dansIf-None-Matchet 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-Agentle 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 :
- Temps réel (
sncf.json,gare/…) : SNCF, flux SIRI Lite « estimated timetable » du jeu Horaires SNCF (également sur transport.data.gouv.fr) ; en secours, le flux GTFS-RT « trip updates » du même jeu. - Horaires prévus (
gares/horaires/…) : SNCF Voyageurs, horaires théoriques au format GTFS, même jeu « Horaires SNCF ». - TGV MAX (
tgvmax/…) : SNCF Voyageurs, jeu « Disponibilité à 30 jours de places MAX JEUNE et MAX SENIOR » (ressources.data.sncf.com).
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
sourcede 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.