Sncf Connect
Pricing
from $3.00 / 1,000 results
SNCF Connect Journeys Scraper
Que fait le SNCF Connect Journeys Scraper ?
Le SNCF Connect Journeys Scraper recherche sur SNCF Connect les trajets en train entre deux villes ou gares et extrait pour chaque offre des données structurées : horaires de départ et d'arrivée, durée du trajet, nombre de correspondances, transporteur (OUIGO, TGV INOUI, TER, Intercités…) et prix — y compris avec ou sans carte de réduction.
Il est développé comme un Apify Actor : vous disposez donc d'un accès API, de la planification (scheduling), du monitoring et des intégrations (Zapier, Make, Google Sheets, Slack…) prêts à l'emploi, sans avoir à maintenir votre propre infrastructure de scraping.
Donnez-lui un from, un to, une date et une heure optionnelle, et il renvoie tous les trajets correspondants en JSON propre. Essayez-le directement depuis l'onglet Input d'Apify Console ou appelez-le via l'Apify API.
Pourquoi utiliser ce scraper ?
- Surveillance des prix & horaires — suivez l'évolution des tarifs sur vos trajets habituels (ex. Paris → Modane, Marseille → Paris) et soyez alerté quand le prix baisse.
- Automatisation de la planification de voyage — injectez horaires, durées et prix dans votre propre application, bot ou dashboard.
- Analyse de l'offre ferroviaire — comparez les offres par jour, heure et transporteur (OUIGO, TGV INOUI, Intercités…), avec ou sans carte de réduction.
- Fiable à grande échelle — exécution dans le cloud, sans machine à maintenir, avec des milliers de recherches planifiées.
Comment utiliser l'Actor sur Apify
- Ouvrez la page de l'Actor dans Apify Console et cliquez sur Try it (Essayer).
- Dans l'onglet Input, remplissez la gare de départ (
from), la gare d'arrivée (to) et la date de voyage (date). - Adaptez si besoin l'heure de départ (
time), les voyageurs (passengers) et le nombre maximum de résultats (maxResults). - Cliquez sur Run et attendez quelques secondes que la recherche se termine.
- Ouvrez l'onglet Dataset pour consulter ou télécharger les trajets en JSON, HTML, CSV ou Excel.
Vous pouvez aussi lancer une recherche par API en une seule requête :
curl "https://api.apify.com/v2/acts/~your-actor/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"from": "Paris","to": "Modane","date": "2026-08-09","time": "08:00","passengers": [{"age": 19,"typology": "YOUNG","discountCards": ["YOUNG_PASS"],"hasDisability": false,"hasWheelchair": false,"withoutSeatAssignment": false,"business": "IS_NOT_BUSINESS"}],"maxResults": 20}'
Input — Explication des données d'entrée
Tous les champs sont décrits dans l'onglet Input d'Apify Console. Voici le détail de chaque paramètre.
Champs principaux
| Champ | Type | Description | Défaut |
|---|---|---|---|
from | string | Ville ou gare de départ, ex. Paris, Marseille | — |
to | string | Ville ou gare d'arrivée, ex. Modane, Lyon | — |
date | string | Date de voyage au format YYYY-MM-DD | — |
time | string | Heure de départ souhaitée au format HH:MM | 08:00 |
passengers | array | Liste des voyageurs (voir détail ci-dessous) | 1 adulte |
maxResults | integer | Nombre maximum de trajets retournés (0 = illimité) | 20 |
proxyConfiguration | object | Configuration du proxy Apify (voir section dédiée) | Résidentiel FR |
Remarque :
from,toetdatesont obligatoires. Les autres champs ont des valeurs par défaut et peuvent être omis.
Le tableau passengers (voyageurs)
Chaque voyageur est un objet avec les champs suivants :
| Champ | Type | Description | Valeurs possibles | Défaut |
|---|---|---|---|---|
age | integer | Âge du voyageur (0-120) | 0 → 120 | 30 |
typology | string | Catégorie de voyageur utilisée par SNCF | ADULT, YOUNG, CHILD, SENIOR, INFANT | ADULT |
discountCards | array | Cartes de réduction à appliquer (voir section dédiée) | YOUNG_PASS, TGV_MAX, LIBERTE_PASS_FE, IDTGVMAX2 | [] |
hasDisability | boolean | Le voyageur est en situation de handicap | true / false | false |
hasWheelchair | boolean | Le voyageur utilise un fauteuil roulant | true / false | false |
withoutSeatAssignment | boolean | Voyager sans réservation de place | true / false | false |
business | string | Voyage professionnel ou non | IS_BUSINESS / IS_NOT_BUSINESS | IS_NOT_BUSINESS |
Signification des typology (catégories d'âge SNCF) :
| Valeur | Catégorie | Tranche d'âge |
|---|---|---|
INFANT | Bébé | 0 - 3 ans |
CHILD | Enfant | 4 - 11 ans |
YOUNG | Jeune | 12 - 26 ans |
ADULT | Adulte | 18 - 59 ans |
SENIOR | Senior | 60 ans et + |
Astuce : associez toujours une carte de réduction à la typologie cohérente (ex.
YOUNG_PASSavectypology: "YOUNG") pour obtenir des prix réalistes.
Les différentes cartes de réduction (discountCards)
Le champ discountCards accepte les codes internes utilisés par l'API SNCF Connect. Chaque code correspond à une carte commerciale SNCF réelle :
Code (discountCards) | Carte réelle | À qui ? | Bénéfice principal |
|---|---|---|---|
YOUNG_PASS | Carte Avantage Jeune | Jeunes de 12 à 27 ans | Jusqu'à -30 % sur les TGV INOUI et Intercités, avec prix plafonnés |
TGV_MAX | TGV Max | Abonnés (formule mensuelle) | Voyages illimités en 2nde classe sur une large sélection de TGV INOUI, OUIGO et Intercités |
LIBERTE_PASS_FE | Carte Liberté | Voyageurs fréquents / professionnels | Tarifs réduits (~ -34 % en 2nde classe, -28 % en 1ère classe) sans condition de date ni de quota |
IDTGVMAX2 | TGVmax 2 (IdTGV Max) | Jeunes abonnés | Voyages illimités en 2nde classe sur certaines lignes (offre historique de TGVmax) |
Pour chaque carte sélectionnée, l'Actor calcule le prix réduit correspondant, disponible dans la sortie via le champ priceWithDiscountCardAmount. Si plusieurs voyageurs avec des cartes différentes sont fournis, chaque profil est transmis tel quel à l'API SNCF Connect.
Configuration du proxy (proxyConfiguration)
Pour éviter le blocage par les protections anti-bots de SNCF Connect, l'Actor utilise par défaut le proxy résidentiel français d'Apify. Vous pouvez configurer ce comportement via le champ proxyConfiguration :
| Champ | Type | Description | Défaut |
|---|---|---|---|
useApifyProxy | boolean | Activer le proxy Apify | true |
apifyProxyGroups | array | Groupes de proxy (ex. ["RESIDENTIAL"]) | ["RESIDENTIAL"] |
apifyProxyCountry | string | Code pays pour le proxy (ex. "FR") | "FR" |
Exemple avec proxy actif (par défaut) :
{"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "FR"}}
Exemple sans proxy (usage local uniquement) :
{"proxyConfiguration": {"useApifyProxy": false}}
⚠️ Attention : désactiver le proxy (
useApifyProxy: false) peut entraîner un blocage par les protections anti-bots de SNCF Connect, surtout lors d'exécutions répétées depuis la même IP. Cette option est recommandée uniquement pour les tests locaux ou si vous utilisez votre propre solution proxy.
Output — Données de sortie
Chaque trajet est stocké comme un élément du dataset. Les données extraites sont plus riches que de simples horaires : l'Actor conserve la timeline complète du voyage (globalTimeline) avec ses étapes d'embarquement, de train et de correspondance, les services à bord, le détail des offres tarifaires (1ère / 2nde classe) et l'état de réservation.
Exemple réel (trajet Paris → Modane avec 2 correspondances et prix) :
{"journeyId": "e9391411-f6b2-430f-bb63-e3156377f5e2, 5c84fc6a-a6b0-469e-9d44-71a75474fd8f, 8f684b88-b8d5-497a-a678-b2fbdb6b7688","from": "Paris - Gare De Lyon - Hall 1 & 2","to": "Modane","origin": {"id": "CITY_FR_6455259","label": "Paris","city": "Paris","codes": [{ "type": "RESARAIL", "value": "FRPAR" }]},"destination": {"id": "RESARAIL_STA_8774200","label": "Modane","codes": [{ "type": "RESARAIL", "value": "FRAGR" },{ "type": "UIC7", "value": "8774200" },{ "type": "UIC8", "value": "87742007" }]},"departure": "2026-08-09T15:14:00+02:00","arrival": "2026-08-09T20:56:00+02:00","departureTime": "15:14","arrivalTime": "20:56","durationLabel": "5h42","transfers": 2,"transporter": "2 correspondances","priceAmount": 94,"priceCurrency": "EUR","priceLabel": "94,70 €","priceWithDiscountCardAmount": null,"firstClassPriceAmount": 116,"secondClassPriceAmount": 94,"status": { "isBookable": true },"globalTimeline": {"steps": [{"onBoarding": {"onBoardingLabel": "Accueil embarquement jusqu'à 2 min avant le départ","onBoardingTimeLabel": "15:12","onBoardingTimeImpactedByDisruptionLabel": ""}},{"train": {"departure": {"stationCode": "","stationLabel": "Paris - Gare De Lyon - Hall 1 & 2","isStationLinkDisplayed": false,"timeLabel": "15:14"},"arrival": {"stationCode": "","stationLabel": "Grenoble","isStationLinkDisplayed": false,"timeLabel": "18:13"},"duration": {"label": "2h59","labelImpactedByDisruption": ""},"transporter": {"modeIcon": { "iconGroup": "Transports", "iconName": "train" },"logo": "tgv_inoui","number": "n° 6919","referenceLabel": "n° 6919","description": "TGV INOUI","semanticDescription": "TGV INOUI"},"onBoardServices": [{ "code": "WIFI", "label": "Wifi à bord", "icon": { "iconGroup": "Services", "iconName": "wifi" } },{ "code": "VOITURE_BAR", "label": "Voiture bar", "icon": { "iconGroup": "Services", "iconName": "bar" } },{ "code": "NURSERIE", "label": "Espace nurserie", "icon": { "iconGroup": "Services", "iconName": "nursery" } },{ "code": "HANDICAPE", "label": "Accessible voyageurs handicapés", "icon": { "iconGroup": "Services", "iconName": "accessibility" } }],"seatAssignments": [],"stops": [],"tripIv": {"disruptions": { "messages": [] },"vehicleDetails": {"screenTitle": "","request": {"number": "6919","date": "2026-08-09","origin": "RESARAIL_STA_8768600","destination": "RESARAIL_STA_8774700"}},"upcomingTripSeatsWithCoachLabels": []},"states": [],"segmentIcons": []}},{"connection": {"correspondanceTimeLabel": "18 min","correspondanceTimeImpactedByDisruption": "","correspondanceRoutingSuggestion": {"icon": { "iconGroup": "Mobility", "iconName": "journey" },"title": "Correspondance","subTitle": "Voir les itinéraires pour changer de gare."}}},{"train": {"departure": { "stationCode": "", "stationLabel": "Grenoble", "timeLabel": "18:31" },"arrival": { "stationCode": "", "stationLabel": "Chambery - Challes-Les-Eaux", "timeLabel": "19:18" },"duration": { "label": "47 min" },"transporter": {"logo": "ter","number": "n° 17584","operatedBy": "Opéré par SNCF VOYAGEURS 1187","referenceLabel": "n° 17584","description": "Train TER"},"onBoardServices": [{ "code": "VELO_PAYANT", "label": "Espace vélo payant", "icon": { "iconGroup": "Services", "iconName": "bike" } }],"seatAssignments": [],"stops": [],"tripIv": {"disruptions": { "messages": [] },"vehicleDetails": {"screenTitle": "","request": {"number": "17584","date": "2026-08-09","origin": "RESARAIL_STA_8774700","destination": "RESARAIL_STA_8774100"}},"upcomingTripSeatsWithCoachLabels": []},"states": [],"segmentIcons": []}}]},"secondComfortClassOffers": {"offers": [],"bestPriceLabelPrefix": "dès"},"legs": [{"line": "TGV INOUI","trainNumber": "6919","from": "Paris - Gare De Lyon - Hall 1 & 2","to": "Grenoble","departure": "2026-08-09T15:14:00+02:00","arrival": "2026-08-09T18:13:00+02:00","departureTime": "15:14","arrivalTime": "18:13","durationLabel": "2h59"},{"line": "Train TER","trainNumber": "17584","from": "Grenoble","to": "Chambery - Challes-Les-Eaux","departure": "2026-08-09T18:31:00+02:00","arrival": "2026-08-09T19:18:00+02:00","departureTime": "18:31","arrivalTime": "19:18","durationLabel": "47 min"}]}
Trajet complet / non réservable : quand un train affiche complet,
statusdevient un objet détaillé (ex.{ "isBookable": false, "label": "Complet", "title": "Complet", "description": "Toutes les places ont déjà été vendues…", "severity": "ALERT" }) et les prix (priceAmount,priceLabel, etc.) sontnull.
Vous pouvez télécharger le dataset dans divers formats : JSON, HTML, CSV ou Excel.
Tableau des données de sortie
| Champ | Type | Description |
|---|---|---|
journeyId | string | ID(s) du trajet ; plusieurs UUID séparés par des virgules si le trajet a plusieurs tronçons |
from / to | string | Gare de départ / d'arrivée |
origin / destination | object | Lieu recherché (id, label, city, codes) |
departure / arrival | string | Date-heure ISO 8601 de départ / arrivée |
departureTime / arrivalTime | string | Heures au format HH:MM, ex. 06:46 |
durationLabel | string | Durée lisible, ex. 4h00, 5h42 |
transfers | integer | Nombre de correspondances |
transporter | string | ex. Direct TGV INOUI, 2 correspondances |
priceAmount | number | Prix le plus bas arrondi, ex. 94 |
priceCurrency | string | Code devise, ex. EUR |
priceLabel | string | Prix formaté (format français), ex. 94,70 € |
priceWithDiscountCardAmount | number | Prix avec carte de réduction (peut être null) |
firstClassPriceAmount | number | Prix 1ère classe (peut être null) |
secondClassPriceAmount | number | Prix 2nde classe (peut être null) |
status | object | État de réservation : { isBookable: true } ou détail complet (label, description, severity) |
globalTimeline | object | Timeline complète : étapes onBoarding, train et connection (voir ci-dessous) |
firstComfortClassOffers | object | Bloc d'offres 1ère classe (offers, bestPriceLabel, bestPriceLabelPrefix) |
secondComfortClassOffers | object | Bloc d'offres 2nde classe (offers, bestPriceLabel, bestPriceLabelPrefix) |
legs | array | Tronçons de train simplifiés : line, trainNumber, from, to, horaires, durée |
Détail de la timeline (globalTimeline.steps)
Chaque étape de la timeline est l'un des trois types d'objet suivant :
| Type d'étape | Champs principaux |
|---|---|
onBoarding | onBoardingLabel, onBoardingTimeLabel, onBoardingTimeImpactedByDisruptionLabel |
train | departure / arrival (gare + heure), duration, transporter (logo, n°, description, opérateur), onBoardServices (WIFI, voiture bar…), seatAssignments, stops, tripIv (perturbations, détails du véhicule) |
connection | correspondanceTimeLabel, correspondanceTimeImpactedByDisruption, correspondanceRoutingSuggestion |
Tarification / Estimation du coût
Combien coûte le scraping de SNCF Connect ? Une recherche de trajet est une exécution de navigateur légère qui se termine généralement en moins d'une minute, pour un coût bien inférieur à 1 compute unit par exécution. Avec l'offre gratuite d'Apify, votre quota mensuel de compute units et de stockage couvre des centaines de recherches. Pour un suivi régulier des prix, planifiez l'Actor à l'heure ou par jour : le coût par exécution reste minuscule et prévisible.
Conseils / Options avancées
- Limitez les résultats avec
maxResultspour accélérer les exécutions si vous n'avez besoin que des premiers départs. - Cherchez tôt — SNCF Connect affiche généralement les meilleurs tarifs pour les dates lointaines ; les horaires se rafraîchissent en cours de journée.
- Testez les cartes — comparez le prix avec et sans carte de réduction (
priceWithDiscountCardAmountvspriceAmount) pour identifier le meilleur profil d'achat. - Scalez raisonnablement — SNCF Connect est une plateforme de réservation en direct : gardez
maxResultsbas et évitez un grand nombre de recherches parallèles dans un court laps de temps. - Intégrez — connectez le dataset de sortie à Google Sheets ou Slack via les intégrations Apify pour des alertes de prix automatiques.
FAQ, avertissements et support
Est-ce légal ? L'Actor ne lit que des informations publiquement visibles sur SNCF Connect. Merci de consulter les Conditions Générales de Vente et le robots.txt de SNCF Connect avant toute utilisation commerciale des données, et de toujours respecter les limites de débit. Cet Actor est un projet indépendant, non affilié à la SNCF et non approuvé par elle.
Limites connues : SNCF Connect est une application JavaScript lourde avec protections anti-bot — les résultats peuvent changer si la plateforme met à jour son frontend. Certains prix (ex. avec carte de réduction) peuvent être null lorsqu'ils ne sont pas proposés pour un trajet donné. Les cartes de réduction ne sont prises en compte que si elles sont compatibles avec la typologie et l'âge du voyageur.
Retours : vous avez trouvé un bug ou souhaitez une fonctionnalité personnalisée ? Ouvrez une issue dans l'onglet Issues de ce dépôt, ou contactez-nous pour une solution sur mesure.