Dutch rail travel helper for NS Reisinformatie via the ovNlGateway server tool. Use this for stations, departures, arrivals, trips, journey details, and disruptions.
Use the ovNlGateway tool first for Dutch railway (NS) questions.
ovNlGateway for anything that can change minute-to-minute (departures, delays, cancellations, platforms, disruptions).ovNlGateway.ovNlGateway in this turn.ovNlGateway expects an object with:
{ "action": "<one of the actions below>", "args": { /* action-specific */ } }
stations.search — { query, limit?, countryCodes? }stations.nearest — { latitude/longitude or lat/lng, limit? }departures.list — { station? | stationCode? | uicCode?, dateTime?, maxJourneys?, lang?, intent? } (station identifier required)departures.window — { station? | stationCode? | uicCode?, fromDateTime+toDateTime OR fromTime+toTime, date?, maxJourneys?, lang?, intent? }arrivals.list — { station? | stationCode? | uicCode?, dateTime?, maxJourneys?, lang?, intent? } (station identifier required)trips.search — { from, to, via?, dateTime?, searchForArrival?, limit?, lang?, intent? }trips.detail — { ctxRecon, date?, lang? }journey.detail — { id? | train?, dateTime?, departureUicCode?, transferUicCode?, arrivalUicCode?, omitCrowdForecast? } (id or train required)disruptions.list — { type? (one or more of CALAMITY/DISRUPTION/MAINTENANCE), isActive?, lang?, intent? }disruptions.by_station — { station, intent? }disruptions.detail — { type (CALAMITY/DISRUPTION/MAINTENANCE), id }args.intent)intent.hard (strict filters): directOnly, maxTransfers, maxDurationMinutes, departureAfter, departureBefore, arrivalAfter, arrivalBefore, includeModes, excludeModes, includeOperators, excludeOperators, includeTrainCategories, excludeTrainCategories, avoidStations, excludeCancelled, requireRealtime, platformEquals, disruptionTypes, activeOnly.intent.soft.rankBy (ranking hints): one or more of fastest, fewest_transfers, earliest_departure, earliest_arrival, realtime_first, least_walking.must/only/without/no/geen/alleen/zonder/niet.prefer/liefst/best/bij voorkeur.For trips.detail, journey.detail, and disruptions.detail, omit args.intent (it is ignored/stripped).
dateTime, fromDateTime, toDateTime when you can."today" is accepted for trips.search.dateTime.departures.window with date + fromTime/toTime, interpret the date/time in Europe/Amsterdam.stations.search: station lookup by name.stations.nearest: nearest stations by coordinates.departures.list: upcoming departures for a station.departures.window: departures for a station within a requested time window (use fromDateTime/toDateTime or date + fromTime/toTime).arrivals.list: upcoming arrivals for a station.trips.search: trip options from A to B (with optional via + time).trips.detail: full details for one trip from ctxRecon.journey.detail: train/journey detail with stops and status.disruptions.list: active disruptions overview.disruptions.by_station: disruptions for a specific station.disruptions.detail: one disruption detail by type + id.Most actions return a matching kind (e.g. kind: "trips.search"). Two special cases:
kind: "disambiguation": the tool could not uniquely resolve a station name.
candidates[] succinctly (label + station code/UIC).from/to station codesstationCode or uicCodestation text)kind: "error": surface the error message; if actionable, suggest the smallest next step.
access_denied / tool disabled: explain the local access limitation.config_error: explain that an NS subscription key/config is missing.station_not_found: ask for a more specific station name or nearby city.upstream_*: suggest retrying and/or broadening time window.departures.list (or departures.window if user gives a time window).departures.list.departures.window with date + fromTime/toTime.trips.search → summarize top 2–3 → if user picks one, trips.detail for richer leg detail.journeyDetailRef from a board item, call journey.detail with id.disruptions.by_station (station text) or disruptions.list for a broad overview.{ "action": "stations.search", "args": { "query": "Amsterdam" } }
ASD) etc., then:{ "action": "departures.list", "args": { "stationCode": "ASD", "maxJourneys": 12 } }
{
"action": "departures.window",
"args": { "station": "Utrecht Centraal", "date": "2026-02-08", "fromTime": "17:00", "toTime": "18:00" }
}
{ "action": "departures.list", "args": { "station": "Almere Centrum", "maxJourneys": 12 } }
{ "action": "trips.search", "args": { "from": "Almere Centrum", "to": "Groningen", "dateTime": "today", "limit": 3 } }
{
"action": "trips.search",
"args": {
"from": "Almere Centrum",
"to": "Groningen",
"limit": 6,
"intent": {
"hard": { "directOnly": true }
}
}
}
{
"action": "departures.list",
"args": {
"station": "Utrecht Centraal",
"maxJourneys": 20,
"intent": {
"soft": { "rankBy": ["realtime_first", "earliest_departure"] }
}
}
}
For a short troubleshooting/planning checklist, see references/REFERENCE.md.