Where Am I now ?

The "breadcrumbs" element is always present, on top of the page.

It shows you where you are on the lab.

It enables you to reach any page on the lab.

Mode selection UX

Every option below is also a live page of the demo app: the same native widgets, one settings screen shared by all of them, real searches on the Belgian network.

Open the demo app

1. Global settings

queries per search: 1a none of its own · 1b 1 by default (walk & transit), +1 per extra allowed vehicle kind

The settings screen, not the planner form. Two sub-screens, both compatible with every option below: the planner form still carries one of the inline components (presets, listbox, toggles, switch). 1a user preferences are per-request parameters that ride along every query of a search, whatever the mode option, so they never add a query. 1b routing settings restrict the modes: they trim what the inline components offer, and the transit checkboxes drive the transportModes column of every query list on this page. Done well, with the right defaults, most travellers never open this screen: the defaults below are the OTP 2 ones, which send nothing at all.

1a · User preferences

The things a traveller sets once: pace, how far they accept to walk or cycle to a stop, transfers, accessibility. Each control maps to one OTP 2 parameter of both recipes, written straight into the snippet; defaults send nothing. The "at most" caps are what OTP calls performance parameters: they can only lower the server caps (45 min to or from a stop, 4 h door to door; above that OTP answers with an error) and they are hard cut-offs (verified live: capping the walk to the stop at 5 min on a suburban origin left no itinerary at all, noTransitConnection). For a soft preference the lever is walkReluctance, not exposed here on purpose. Public transit and rental list the operators and the GBFS networks OTP 2 knows, all on by default; unticking one bans it (bannedAgencies, bannedRentalNetworks). OTP 2's trip query knows no "preferred" operator, so a subscription badge stays a client side concern.

Try the settings screen in the demo app

Model: 16 controls, the parameters they set and what OTP 2 does without them
controlparametersOTP 2 default (nothing sent)
Wheelchair accessible trips onlywheelchairAccessiblewheelchairAccessible = false (ui: off)
Walking pacewalkSpeedwalkSpeed = 1.33 m/s (ui: normal)
Walk to and from the stop, at mostmaxAccessEgressDurationFootmaxAccessEgressDurationFoot = 45 min (server cap, can only be lowered) (ui: no limit)
Walk-only trips, at mostmaxDirectDurationFootmaxDirectDurationFoot = 4 h (server cap, can only be lowered) (ui: no limit)
Cycling pacebikeSpeedbikeSpeed = 5 m/s (ui: normal)
Bike routesbicycleOptimisationMethodbicycleOptimisationMethod = safe (ui: safest)
Cycle to and from the stop, at mostmaxAccessEgressDurationBicyclemaxAccessEgressDurationBicycle = 45 min (server cap, can only be lowered) (ui: no limit)
Bike-only trips, at mostmaxDirectDurationBicyclemaxDirectDurationBicycle = 4 h (server cap, can only be lowered) (ui: no limit)
Only rental bikes available right nowuseBikeRentalAvailabilityInformationuseBikeRentalAvailabilityInformation = false (ui: off)
TransferstransferPenalty, maximumTransferstransferPenalty = 0 s; maximumTransfers = 12 (ui: fastest trip)
Time to change vehicles, at leasttransferSlacktransferSlack = 120 s (ui: 2 min)
Be at the platform 5 min before the trainboardSlackRailboardSlackRail = 0 s (boardSlackDefault) (ui: off)
Use real-time informationignoreRealtimeUpdatesignoreRealtimeUpdates = false (ui: on)
Itinerary textslocalelocale = en (ui: english)
Public transit operatorsbannedAgenciesbannedAgencies = none sent, every operator (ui: all ticked)
Rental networksbannedRentalNetworksbannedRentalNetworks = none sent, every network (ui: all ticked)
Accessibility
Walking
Walking pace
Cycling
Cycling pace
Bike routes
Transit
Transfers
Operators

Every operator is used by default. Untick one to ban it from the results (bannedAgencies), for a traveller without a pass for it.

Language
Rental / subscriptions

Every rental network OTP 2 reads (GBFS manifest) is used by default. You can ban a rental agency by disabling it here (bannedRentalNetworks): a traveller keeps the networks they have a subscription for.

1b · Routing settings: restrict modes

One global setting to allow options. Default is walk & transit only. Every extra street mode allowed is another vehicle kind the app has to query for, since this control alone carries no intent (the allowed list is ui state, not a parameter). Unchecked transit modes go to transportModes: try unticking one and look at the other views. Used as the only control it is a fan out, one query per allowed kind, with the paging caveat that comes with it.ℹ see: one cursor for many queries, how the preset recipe pages

Model: 10 options, the triples each one sends and the shapes it gets back
allowed street modequeriesaccessMode / directMode / egressMode ⇒ result shapes
walk & transit (always)1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
bike1
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
bike, park1
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
rental bike1
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
rental scooter1
scooter_rental / scooter_rental / scooter_rental ⇒ [rental scooter → transit → rental scooter] + [rental scooter]
car1
foot / car / foot · no transit ⇒ [car]
car, park1
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
taxi1
car_pickup / foot / foot ⇒ [taxi → transit → walk] + [walk]
rental car1
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
on-demand1
flexible / flexible / flexible ⇒ [on-demand → transit → on-demand] + [on-demand]
Street modes
Transit

All four ticked = the param is omitted (OTP default: every transit mode). Unticked ones are left out of transportModes; none ticked = transportModes= empty, no transit at all.

queries: 1
one query per allowed vehicle kind, if the app has to cover them all (own car = car only, the walk & transit query already covers transit)
queryaccessModedirectModeegressModetransportModes
walk & transitfootfootfoot(omitted: all)

2. Preset selector: main, show more, custom

queries per search: 1, except Car: 2

One triple per preset, custom is one triple too. Car needs a second query because OTP drops the transit itineraries next to a direct car trip. Level 1: the main presets. Level 2: more nuanced presets behind "more options". Level 3: custom access / direct / egress (DIY), which is where asymmetric trips belong (walk one way, rental the other: the rental modes already fall back to walking when no vehicle is around). A preset is one modePreset id of the preset recipe; custom is the three slots of planner-v2-1. Car is the one two-query preset here; it pages with one cursor like the others, the car trip being a first page thing.ℹ see: one cursor for many queries, how the preset recipe pages

Try it in the demo app

Model: 12 options, the triples each one sends and the shapes it gets back
presetmodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Public transitpublic-transit1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
Bikebike1
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
Carcar2
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
foot / car / foot · no transit ⇒ [car]
Bike & park at the stopbike-park-ride1
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
Car, park & ridecar-park-ride1
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
Rental bikebike-rental1
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
Rental carcar-rental1
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
Rental scooterscooter-rental1
scooter_rental / scooter_rental / scooter_rental ⇒ [rental scooter → transit → rental scooter] + [rental scooter]
Transit onlytransit-only1
foot / (unset) / foot ⇒ [walk → transit → walk]
Just drivecar-only1
foot / car / foot · no transit ⇒ [car]
Just cyclebike-only1
foot / bicycle / foot · no transit ⇒ [bike]
On-demand transporton-demand1
flexible / flexible / flexible ⇒ [on-demand → transit → on-demand] + [on-demand]
How do you want to travel?
More options
queries: 0
queryaccessModedirectModeegressModetransportModes

2b. Multimodal presets: the transit provider's default

queries per search: 1 to 3 (Bike and Car fan out, everything else is 1)

Same widget as view 2, other defaults. Here the bare vehicle name means "every way to combine that vehicle with transit": Bike runs own bike, own bike parked at the stop and rental bike; Car runs drive, park & ride and rental car. The narrow, single-query variants keep a qualified name (own, rental, parked, just) and sit behind "more options": one list, the name says how wide the preset is, the table says what it costs. Same ids as view 2 where the preset is the same, so the two views stay in sync. Bike and Car are multi query presets: one cursor pages all their queries at once, so the cost of this option is the query count (latency), not the paging.ℹ see: one cursor for many queries, how the preset recipe pages

Try it in the demo app

Model: 13 options, the triples each one sends and the shapes it gets back
presetmodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Public transitpublic-transit1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
Bikebike-multimodal3
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
Carcar-multimodal3
foot / car / foot · no transit ⇒ [car]
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
Scooterscooter-rental1
scooter_rental / scooter_rental / scooter_rental ⇒ [rental scooter → transit → rental scooter] + [rental scooter]
On-demand transporton-demand1
flexible / flexible / flexible ⇒ [on-demand → transit → on-demand] + [on-demand]
Own bikebike1
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
Own bike, parked at the stopbike-park-ride1
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
Rental bikebike-rental1
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
Just cyclebike-only1
foot / bicycle / foot · no transit ⇒ [bike]
Just drivecar-only1
foot / car / foot · no transit ⇒ [car]
Own car, park & ridecar-park-ride1
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
Rental carcar-rental1
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
Transit onlytransit-only1
foot / (unset) / foot ⇒ [walk → transit → walk]
How do you want to travel?
More options (one way only)
queries: 0
queryaccessModedirectModeegressModetransportModes

3. One open dropdown with every preset

queries per search: 1, except Car: 2

Same presets as view 2, same counts, flat "equal list" widget; the Car entry pages with one cursor as in view 2.ℹ see: one cursor for many queries, how the preset recipe pages

Try it in the demo app

Model: 12 options, the triples each one sends and the shapes it gets back
presetmodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Public transitpublic-transit1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
Bikebike1
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
Carcar2
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
foot / car / foot · no transit ⇒ [car]
Bike & park at the stopbike-park-ride1
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
Car, park & ridecar-park-ride1
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
Rental bikebike-rental1
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
Rental carcar-rental1
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
Rental scooterscooter-rental1
scooter_rental / scooter_rental / scooter_rental ⇒ [rental scooter → transit → rental scooter] + [rental scooter]
Transit onlytransit-only1
foot / (unset) / foot ⇒ [walk → transit → walk]
Just drivecar-only1
foot / car / foot · no transit ⇒ [car]
Just cyclebike-only1
foot / bicycle / foot · no transit ⇒ [bike]
On-demand transporton-demand1
flexible / flexible / flexible ⇒ [on-demand → transit → on-demand] + [on-demand]
queries: 0
queryaccessModedirectModeegressModetransportModes

4a. Main modes with a rent / park toggle beside each

queries per search: 1 to 4 (car is 2 by itself, each toggle adds a shape)

Google style: pick the mode, then refine it in place. The toggles are additive, "enable on top of": own vehicle stays, rental and parked are extra shapes, each one another OTP 2 query. Scooter is rental only, so no toggle. Both toggles on = the multimodal preset (one call, three queries); one toggle = two presets, two calls. Every toggle adds a query, so it adds a page cursor to move along with the others.ℹ see: one cursor for many queries, how the preset recipe pages Compare with 4b where the switch replaces the shape instead.

Try it in the demo app

Model: 10 options, the triples each one sends and the shapes it gets back
mode + togglesmodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Walk & transitpublic-transit1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
Bikebike1
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
Bike + rentalbike + bike-rental2
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
Bike + park at the stopbike + bike-park-ride2
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
Bike + bothbike-multimodal3
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
Carcar2
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
foot / car / foot · no transit ⇒ [car]
Car + rentalcar + car-rental3
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
foot / car / foot · no transit ⇒ [car]
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
Car + park & ridecar + car-park-ride3
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
foot / car / foot · no transit ⇒ [car]
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
Car + bothcar-multimodal3
foot / car / foot · no transit ⇒ [car]
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
Scooterscooter-rental1
scooter_rental / scooter_rental / scooter_rental ⇒ [rental scooter → transit → rental scooter] + [rental scooter]
Travel by
queries: 0
queryaccessModedirectModeegressModetransportModes

4b. Main modes plus one "vehicle" switch

queries per search: 1, except Car (own): 2

Variation: the mode list stays clean, one switch below applies to the chosen mode (greyed out for walk, rental only for scooter) and replaces the shape rather than adding one. "Own + rental at once" is what 4a does, at the cost of extra queries. Every position is exactly one modePreset; only own car runs two queries and inherits their paging caveat.ℹ see: one cursor for many queries, how the preset recipe pages

Try it in the demo app

Model: 10 options, the triples each one sends and the shapes it gets back
mode · vehiclemodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Walk & transitpublic-transit1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
Walk & transitpublic-transit1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
Walk & transitpublic-transit1
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
Bike · ownbike1
bicycle / bicycle / bicycle ⇒ [bike → transit → bike] + [bike]
Bike · rentalbike-rental1
bike_rental / bike_rental / bike_rental ⇒ [rental bike → transit → rental bike] + [rental bike]
Bike · parked at the stopbike-park-ride1
bike_park / bicycle / foot ⇒ [bike, park → transit → walk] + [bike]
Car · owncar2
foot / foot / foot ⇒ [walk → transit → walk] + [walk]
foot / car / foot · no transit ⇒ [car]
Car · rentalcar-rental1
car_rental / car_rental / car_rental ⇒ [rental car → transit → rental car] + [rental car]
Car · parked at the stopcar-park-ride1
car_park / foot / foot ⇒ [car, park → transit → walk] + [walk]
Scooter · rentalscooter-rental1
scooter_rental / scooter_rental / scooter_rental ⇒ [rental scooter → transit → rental scooter] + [rental scooter]
Travel by
Vehicle
queries: 0
queryaccessModedirectModeegressModetransportModes

Pros & cons, by number of OTP2 queries

One planner-v2-1 query = one [access → transit → egress] + [direct] pair, both shapes come back together, unless the direct mode is fast enough to trigger the transit-vs-street filter (car, taxi): then the transit shapes need their own query. Several queries means merging, deduping and paging them together: the preset recipe does it server side behind one modePreset and one pageCursor (planner-v2 merges up to 9 queries too, but leaves one cursor per query to the client).

OptionQueries per searchWhy
1a User preferences+0Per-request parameters (pace, caps, transfers, accessibility, subscriptions, language) shared by every query of the search: they change the itineraries, never the number of queries.
1b Restrict modes, as the only control1 + allowed kindsWalk & transit by default = 1. Every extra allowed street mode is another vehicle kind to query for, up to 10 with everything allowed: planner-v2 again. Used as a filter on top of the other options it costs nothing.
2 Presets (+ more, + custom)1, Car: 2A preset is one triple. Car pairs a direct car trip with transit alternatives, which OTP will not return together: two queries. Every other preset is one triple (park & ride keeps foot as direct mode for that reason). Rental presets are one query too: the direct rental trip and the rental + transit trips come back together.
2b Multimodal presets1 to 3Bare vehicle name = every way to use it with transit: Bike and Car run 3 queries, walk, scooter, on-demand run 1. The single-query variants keep qualified names behind "more options".
3 Open listbox1, Car: 2Same presets as view 2, same count, different widget.
4a Rent / park toggles, additive1 to 4Bike: own + rental + parked = up to 3. Car: 2 by itself, up to 4 with both toggles. Scooter and walk: 1.
4b Vehicle switch (radio)1, Car (own): 2Own / rental / parked is one triple by construction; only own car needs the extra transit query.

1a · User preferences

  • + Free: a preference is a parameter on the request, not a query; it composes with every mode option and both recipes.
  • + Plain words map to one parameter each (pace → speed, "at most 10 min to the stop" → the per mode access/egress cap, "fewer transfers" → the transfer penalty), so a customer can pick which ones to show without an API change.
  • – The caps are hard cut-offs that can only lower the server defaults: a tight cap on a suburban origin returns nothing rather than a longer walk, so the UI needs an empty-result fallback ("no trip within 5 min of walking, try 15").
  • – The soft levers OTP has (walk, wait and transfer reluctances, the bike safety / slope / time triangle) do not translate into words a traveller understands; they stay API-only, for tuning by the integrator.

1b · Restrict modes

  • + Composes with every other option: a city hides cars, an operator hides scooters, the presets and custom selects shrink accordingly.
  • + Transit part maps 1:1 to transportModes, no query multiplication there.
  • – As the only control it does not express intent, so the app has to query every allowed vehicle kind: a fan out that grows with each box ticked.
  • – Walk & transit as the default keeps it at one query, but then the setting alone never yields a bike or car trip unless the traveller opens it.

2 · Presets, more, custom

  • + One query per preset (Car excepted), one page cursor, results already sorted by OTP2: no merging or deduping client side.
  • + Progressive disclosure: three choices for most users, nuance behind "more", full control behind "custom".
  • + Presets are a table the customer owns; they can rename, reorder or drop them without an API change.
  • – The "more" list is nine items long; each needs explaining, hence the model tables.
  • – Custom with lists (several access modes) reintroduces the fan out; keep it single valued or cap it.

2b · Multimodal presets

  • + One intent-level choice gives the traveller every transit combination for their vehicle: the transit provider's goal, without teaching them the slots.
  • + Same widget and same naming rules as view 2, so a customer can move from one default to the other by relabelling.
  • + Bounded fan out: never more than 3 queries, always known in advance per preset (planner-v2 runs up to 9 blind), and the preset recipe runs them in one document.
  • – Merging, deduping and labelling itineraries by origin query is on the server (preset recipe) or the client, with one page cursor per preset call (the preset recipe) or per query (client side merge).
  • – The rental car query has a fast direct mode; if the filter drops its transit shapes the "Car" preset silently loses park-and-ride-like rental trips (to verify with car-sharing data in range).

3 · Open listbox

  • + Everything visible at once, one click, easy to scan with the bracket notation.
  • – Flat list treats "walk & transit" and "just drive" as equals; twelve presets is a lot to scan, tall on mobile.

4a · Rent / park toggles beside each mode

  • + Familiar (Google style), the mode row stays short: four modes, the nuance is a checkbox.
  • + Own and rental can be compared on one screen.
  • – Up to four queries: results must be merged and labelled ("this one is with a rental bike"); paging stays one cursor per call thanks to the preset recipe, the cost is latency.
  • – Toggles are only meaningful for some modes, so they appear and disappear per row; asymmetric trips do not fit the model at all (custom only).

4b · Vehicle switch

  • + Strict by construction: one query, one cursor (two for own car).
  • + Clean mode row; the switch reads as a sentence ("Bike, rental").
  • – No way to compare own vs rental in one screen; the user has to flip the switch and search again.
  • – "Own, parked at the stop" is a mouthful and only exists for bike and car; asymmetric trips have no place here either (custom only).

Rule of thumb: options 2 and 4b keep planner-v2-1 at one query (two for car), which is the whole point of the recipe versus planner-v2. Option 1 belongs on top of them: 1a as parameters on every query, 1b as a filter. 4a and custom-with-lists are the two places where the fan out sneaks back in; if a customer wants that, the honest answer is the preset recipe, or a client that fires 2 to 4 planner-v2-1 calls in parallel and shows them as separate tabs rather than merging them. One api follow-up would remove the remaining exception: a product-grade way to keep transit next to a car trip in one query (a keepTransitAlternatives flag mapping to listAll with the notices stripped server side).

Command Palette
?
LabData/en/data
ApidateAPI params in:BMC v1BMC v2OTP 1ApidateTimeAPI params in:BMC v1BMC v2OTP 1OTP 2OTP 2.9
LabDataGtfs/en/data/gtfs
LabDataGtfs RT/en/data/gtfs-rt
LabDataGbfs/en/data/gbfs
LabDataRedis/en/data/redis
LabMigrating to OTP2Mode selection UX1a User preferences/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX4a Rent / park toggles/en/planner/migrating-to-otp2/mode-ux
LabDataGtfsAgencies/en/data/gtfs/feed/agencies/
LabDataGtfsRoutes/en/data/gtfs/feed/routes/
LabDataGtfsTrips/en/data/gtfs/feed/trips/
LabDataGtfsStops/en/data/gtfs/feed/stops/
LabDataGtfsTrip Patterns/en/data/gtfs/trip-patterns
LabDataGtfsGtfs Archives/en/data/gtfs/archives
LabDataGtfs RTAlerts/en/data/gtfs-rt/feed/alerts
LabDataGtfs RTTrip Updates/en/data/gtfs-rt/feed/trip-updates
LabDataGbfsAgencies/en/data/gbfs/agencies
LabDataGbfsStations/en/data/gbfs/stations
LabDataGbfsStation Statuses/en/data/gbfs/station-statuses
LabDataGbfsFree Floating Bikes/en/data/gbfs/free-floating-bikes
LabDataGbfsMap/en/data/gbfs/map
LabDataRedisredisCacher/gtfsRtAlertsDeLijn/en/data/redis/redisCacher/gtfsRtAlertsDeLijn
LabDataRedisredisCacher/gtfsRtAlertsEurostar/en/data/redis/redisCacher/gtfsRtAlertsEurostar
LabDataRedisredisCacher/gtfsRtAlertsNmbsSncb/en/data/redis/redisCacher/gtfsRtAlertsNmbsSncb
LabDataRedisredisCacher/gtfsRtAlertsStibMivb/en/data/redis/redisCacher/gtfsRtAlertsStibMivb
LabDataRedisredisCacher/gtfsRtAlertsTec/en/data/redis/redisCacher/gtfsRtAlertsTec
LabDataRedisredisCacher/gtfsRtAlertsTecRaw/en/data/redis/redisCacher/gtfsRtAlertsTecRaw
LabDataRedisredisCacher/gtfsRtTripUpdatesDeLijn/en/data/redis/redisCacher/gtfsRtTripUpdatesDeLijn
LabDataRedisredisCacher/gtfsRtTripUpdatesEurostar/en/data/redis/redisCacher/gtfsRtTripUpdatesEurostar
LabDataRedisredisCacher/gtfsRtTripUpdatesNmbsSncb/en/data/redis/redisCacher/gtfsRtTripUpdatesNmbsSncb
LabDataRedisredisCacher/gtfsRtTripUpdatesStibMivb/en/data/redis/redisCacher/gtfsRtTripUpdatesStibMivb
LabDataRedisredisCacher/gtfsRtTripUpdatesTec/en/data/redis/redisCacher/gtfsRtTripUpdatesTec
LabDataRedisredisCacher/gtfsRtTripUpdatesDeLijnRaw/en/data/redis/redisCacher/gtfsRtTripUpdatesDeLijnRaw
LabDataRedisredisCacher/gtfsRtTripUpdatesEurostarRaw/en/data/redis/redisCacher/gtfsRtTripUpdatesEurostarRaw
LabDataRedisredisCacher/gtfsRtTripUpdatesNmbsSncbRaw/en/data/redis/redisCacher/gtfsRtTripUpdatesNmbsSncbRaw
LabDataRedisredisCacher/gtfsRtTripUpdatesTecRaw/en/data/redis/redisCacher/gtfsRtTripUpdatesTecRaw
LabDataRedisredisCacher/pointsByLinesStibMivb/en/data/redis/redisCacher/pointsByLinesStibMivb
LabDataRedisredisCacher/waitingTimesStibMivb/en/data/redis/redisCacher/waitingTimesStibMivb
LabSearch/en/search
LabPlan/en/planner-home
LabPlanPlanner v1/en/planner-tec-app
LabPlanPlanner v2/en/planner-v2-bmc
LabPlanOTP 1/en/planner
LabPlanOTP 2/en/planner-v2
LabPlanOTP 2.9/en/planner-otp-2-9
LabPlanPlanner v2.1/en/planner-v2-1
LabPlanPlanner v2.1 preset/en/planner-v2-1-preset
LabPlanMigrating to OTP2/en/planner/migrating-to-otp2
LabPlanMigrating to OTP2Get started/en/planner/migrating-to-otp2
LabMigrating to OTP2Get startedHow the engine thinks/en/planner/migrating-to-otp2
LabMigrating to OTP2Get startedTwo recipes/en/planner/migrating-to-otp2
LabMigrating to OTP2Get startedOn these pages/en/planner/migrating-to-otp2
LabPlanMigrating to OTP2Mode selection UX/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX1 Global settings/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX1b Restrict modes/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX2 Presets + more + custom/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX2b Multimodal presets/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX3 Open listbox/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX4b Vehicle switch/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UXPros & cons/en/planner/migrating-to-otp2/mode-ux
LabPlanMigrating to OTP2Query matrix/en/planner/migrating-to-otp2/query-matrix
LabPlanMigrating to OTP2Coverage review/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewStreet modes/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewTransit-vs-street filter/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewUnset slots/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewTransit modes/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewWho: operators, lines/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewWhere: places/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewWhen: time/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewTraveller profile/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewIntents check/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewPreset recipe/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewOne cursor, many queries/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewBudget per shape/en/planner/migrating-to-otp2/coverage-review
LabMigrating to OTP2Coverage reviewRecommendations/en/planner/migrating-to-otp2/coverage-review
LabMap/en/map
LabMapMap Base/en/map/base-light
LabMapMap Transit/en/map/transit-light
LabMapMap Transit (via proxy)/en/map/transit-light-proxy
LabDeparture/en/departure
LabDoc/en/doc
LabDocPlanner Cases Library/en/doc/planner-lib
LabDocUi/Ux/en/doc/user-interface
LabDocUi/UxPlanner/en/doc/user-interface/planner/
LabUi/UxPlannerInstant | Duration | Distance/en/doc/user-interface/planner/
LabUi/UxPlannerItinerary Time Overview/en/doc/user-interface/planner/
LabUi/UxPlannerLeg Overview/en/doc/user-interface/planner/
LabUi/UxPlannerItinerary Overview/en/doc/user-interface/planner/
LabUi/UxPlannerLeg Detail/en/doc/user-interface/planner/
LabDocUi/UxDeparture/en/doc/user-interface/departure
LabDocUi/UxInput/en/doc/user-interface/input/
LabHelp/en/help
ApifromPlaceAPI params in:BMC v1BMC v2OTP 1OTP 2OTP 2.9ApitoPlaceAPI params in:BMC v1BMC v2OTP 1OTP 2OTP 2.9ApiarriveByAPI params in:BMC v1BMC v2OTP 1OTP 2OTP 2.9ApitimeAPI params in:BMC v1BMC v2OTP 1ApibannedAgenciesAPI params in:BMC v1OTP 1OTP 2OTP 2.9ApibannedRoutesAPI params in:BMC v1OTP 1ApiwalkSpeedAPI params in:BMC v1OTP 1OTP 2OTP 2.9ApiwheelchairAPI params in:BMC v1BMC v2OTP 1ApinumItinerariesAPI params in:BMC v1BMC v2OTP 1ApimodeAPI params in:BMC v1BMC v2OTP 1ApialightSlackAPI params in:BMC v1BMC v2OTP 1ApiboardSlackAPI params in:BMC v1BMC v2OTP 1ApilocaleAPI params in:BMC v1OTP 1ApishowIntermediateStopsAPI params in:BMC v1OTP 1ApimaxWalkDistanceAPI params in:BMC v1OTP 1ApistartTransitStopIdAPI params in:BMC v1OTP 1ApistartTransitTripIdAPI params in:BMC v1OTP 1ApiwaitReluctanceAPI params in:BMC v1OTP 1OTP 2OTP 2.9ApiwalkReluctanceAPI params in:BMC v1OTP 1OTP 2OTP 2.9ApiroutingProfileAPI params in:BMC v2ApipageCursorsAPI params in:BMC v2ApibannedStopsAPI params in:OTP 1ApibannedStopsHardAPI params in:OTP 1ApibannedTripsAPI params in:OTP 1ApibatchAPI params in:OTP 1ApibikeBoardCostAPI params in:OTP 1ApibikeSpeedAPI params in:OTP 1OTP 2OTP 2.9ApibikeSwitchCostAPI params in:OTP 1ApidisableAlertFilteringAPI params in:OTP 1ApidisableRemainingWeightHeuristicAPI params in:OTP 1ApigeoidElevationAPI params in:OTP 1ApiignoreRealtimeUpdatesAPI params in:OTP 1OTP 2OTP 2.9ApiintermediatePlacesAPI params in:OTP 1ApimaxHoursAPI params in:OTP 1ApimaxPreTransitTimeAPI params in:OTP 1ApimaxTransfersAPI params in:OTP 1ApiminTransferTimeAPI params in:OTP 1ApinonpreferredTransferPenaltyAPI params in:OTP 1ApioptimizeAPI params in:OTP 1ApiotherThanPreferredRoutesPenaltyAPI params in:OTP 1ApipreferredAgenciesAPI params in:OTP 1ApipreferredRoutesAPI params in:OTP 1ApireverseOptimizeOnTheFlyAPI params in:OTP 1ApitransferPenaltyAPI params in:OTP 1OTP 2OTP 2.9ApitriangleSafetyFactorAPI params in:OTP 1ApitriangleSlopeFactorAPI params in:OTP 1ApitriangleTimeFactorAPI params in:OTP 1ApiunpreferredAgenciesAPI params in:OTP 1ApiunpreferredRoutesAPI params in:OTP 1ApiuseRequestedDateTimeInMaxHoursAPI params in:OTP 1ApiwaitAtBeginningFactorAPI params in:OTP 1ApiwalkBoardCostAPI params in:OTP 1ApitimetableViewAPI params in:OTP 2OTP 2.9ApinumTripPatternsAPI params in:OTP 2OTP 2.9ApimaximumTransfersAPI params in:OTP 2OTP 2.9ApimaximumAdditionalTransfersAPI params in:OTP 2OTP 2.9ApisearchWindowAPI params in:OTP 2OTP 2.9ApiincludePlannedCancellationsAPI params in:OTP 2OTP 2.9ApiincludeRealtimeCancellationsAPI params in:OTP 2OTP 2.9ApitransferSlackAPI params in:OTP 2OTP 2.9ApiboardSlackDefaultAPI params in:OTP 2OTP 2.9ApiboardSlackListAPI params in:OTP 2OTP 2.9ApialightSlackDefaultAPI params in:OTP 2OTP 2.9ApialightSlackListAPI params in:OTP 2OTP 2.9ApibicycleOptimisationMethodAPI params in:OTP 2OTP 2.9ApitransportModesAPI params in:OTP 2OTP 2.9ApiegressModeAPI params in:OTP 2OTP 2.9ApidirectModeAPI params in:OTP 2OTP 2.9ApiaccessModeAPI params in:OTP 2OTP 2.9ApiitineraryFiltersDebugAPI params in:OTP 2OTP 2.9ApipageCursorAPI params in:OTP 2OTP 2.9ApiwheelchairAccessibleAPI params in:OTP 2OTP 2.9ApitriangleFactorsSafetyAPI params in:OTP 2OTP 2.9ApitriangleFactorsSlopeAPI params in:OTP 2OTP 2.9ApitriangleFactorsTimeAPI params in:OTP 2OTP 2.9ApiuseBikeRentalAvailabilityInformationAPI params in:OTP 2OTP 2.9ApimaxDirectDurationForModeAPI params in:OTP 2OTP 2.9ApifiltersAPI params in:OTP 2OTP 2.9ApirelaxTransitGroupPriorityAPI params in:OTP 2OTP 2.9ApiwhiteListedAgenciesAPI params in:ApibannedLinesAPI params in:ApiwhiteListedLinesAPI params in:ApibannedServiceJourneysAPI params in:ApibannedRentalNetworksAPI params in:ApiwhiteListedRentalNetworksAPI params in:ApipassThroughPointsAPI params in:ApirelaxTransitGroupPriorityRatioAPI params in:ApirelaxTransitGroupPriorityConstantAPI params in:ApimaxAccessEgressDurationForModeAPI params in:ApimodePresetAPI params in:
DocOTP 1Full Open API Documentation
DocOTP 2Full Open API Documentation
DocOTP 2.9Full Open API Documentation
DocPlanner v1Full Open API Documentation
DocPlanner v2Full Open API Documentation
DocPlanner v2.1Full Open API Documentation
DocPlanner v2.1 presetFull Open API Documentation