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

Settings

queries per search: preferences none of their own · restrict modes 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). User preferences are per-request parameters that ride along every query of a search, whatever the mode option, so they never add a query. 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 (or the recipe's, for the live rental availability), which send nothing at all, with one exception: the app caps walk-only trips at 20 min.

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, but for one app default: walk-only trips are capped at 20 min (maxDirectDurationFoot=PT20M, seeded in the snippet with the trip), since OTP 2's 4 h cap would list hour-long walks next to the transit itineraries; the traveller can pick another cap or lift it. 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: 20 min, app default)
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 = true (recipe default, OTP 2 itself: false) (ui: on)
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.

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)

1. Monomodal presets: main, show more, custom

queries per search: 1

One triple per preset, custom is one triple too, and every preset here is monomodal: one way of moving and nothing else. Walk is walk-only (foot / foot / foot, transportModes empty), public transit is transit-only (the direct slot left unset, so no door to door walk next to the transit itineraries) and the vehicle presets are the -only variants (transportModes empty), so an itinerary either carries the mode asked for or does not come back at all. OTP has no switch for that: with a rental mode next to transit it also returns transit itineraries reached on foot, since renting is optional in a rental search; the -only presets are the way to keep the promise (rental still walks when no scooter is around). Level 1: the five main presets. Level 2: on-demand behind "more options". Level 3: custom access / direct / egress (DIY), where asymmetric trips and vehicle + transit combinations belong (or option 2). A preset is one modePreset id of the preset recipe; custom is the three slots of planner-v2-1. No preset here runs more than one query.

Try it in the demo app

Model: 6 options, the triples each one sends and the shapes it gets back
presetmodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Public transittransit-only1
foot / (unset) / foot ⇒ [walk → transit → walk]
Bikebike-only1
foot / bicycle / foot · no transit ⇒ [bike]
Carcar-only1
foot / car / foot · no transit ⇒ [car]
Scooterscooter-only1
foot / scooter_rental / foot · no transit ⇒ [rental scooter]
Walkwalk-only1
foot / foot / foot · no transit ⇒ [walk]
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

2. 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 option 1, other defaults. Here the bare vehicle name means "every way to combine that vehicle with transit": Bike runs own bike, bike Park&Ride and rental bike; Car runs drive, Park&Ride and rental car. The narrow, single-query variants keep a qualified name (own, rental, Park&Ride, 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 option 1 where the preset is the same, so the two options 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 The rental queries also return transit itineraries reached on foot (renting is optional in an OTP 2 rental search): both recipes mark every itinerary with matchesRequestedModes (at least one leg uses a vehicle of the preset, the root requestedModes lists them) and the demo greys the others out; hiding or sorting them last is the client's call, the paging is untouched.

Try it in the demo app

Model: 15 options, the triples each one sends and the shapes it gets back
presetmodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Bestbest1
foot / car / foot ⇒ [walk → transit → walk] + [car]
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, Park&Ridebike-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]
Just scooterscooter-only1
foot / scooter_rental / foot · no transit ⇒ [rental scooter]
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. Simple select with progressive reveal

queries per search: 1

Same presets as option 1, same counts (see the table), one native select. In the demo app the list grows on demand: the main choices and "More…" first, the full list in groups once asked, custom last (the select rebuilds and reopens itself). Here the list is shown as the demo shows it once "More…" was picked: fully open, in groups. Picking "Custom…" reveals the three trip parts underneath, as in the demo.

Try it in the demo app

Model: 6 options, the triples each one sends and the shapes it gets back
presetmodePresetqueriesaccessMode / directMode / egressMode ⇒ result shapes
Public transittransit-only1
foot / (unset) / foot ⇒ [walk → transit → walk]
Bikebike-only1
foot / bicycle / foot · no transit ⇒ [bike]
Carcar-only1
foot / car / foot · no transit ⇒ [car]
Scooterscooter-only1
foot / scooter_rental / foot · no transit ⇒ [rental scooter]
Walkwalk-only1
foot / foot / foot · no transit ⇒ [walk]
On-demand transporton-demand1
flexible / flexible / flexible ⇒ [on-demand → transit → on-demand] + [on-demand]
queries: 0
queryaccessModedirectModeegressModetransportModes

4. Rent and park toggles beside each main mode

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 option 5 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&Ridebike + 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

5. Rent or park switches under the main modes

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 option 4 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 · Park&Ridebike-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 · Park&Ridecar-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
Settings · 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.
Settings · 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.
1 Monomodal presets (+ more, + custom)1A preset is one triple and the vehicle presets are the -only variants (transit off), so nothing needs a second query and every itinerary carries the vehicle asked for. Vehicle + transit combinations live in option 2 or in custom.
2 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 Simple select with progressive reveal1Same presets as option 1, same count, different widget.
4 Rent and 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.
5 Rent or park switches1, Car (own): 2Own / rental / parked is one triple by construction; only own car needs the extra transit query.

Settings · 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.

Settings · 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.

1 · Monomodal presets, more, custom

  • + One query per preset, one page cursor, results already sorted by OTP2: no merging or deduping client side.
  • + Progressive disclosure: four choices for most users, the rest behind "more", full control behind "custom".
  • + Strict by construction: the -only presets never show a transit-only itinerary under "Scooter" (the complaint that started this), and they need no marking or filtering server side.
  • + Presets are a table the customer owns; they can rename, reorder or drop them without an API change.
  • – Monomodal means no vehicle + transit combination here: a traveller who wants "bike, then the train" has to go to custom or to option 2.
  • – Rental scooter (and, when added, rental bike / car) still walks when no vehicle is around: "or nothing" is really "or a walk".
  • – Custom with lists (several access modes) reintroduces the fan out; keep it single valued or cap it.

2 · 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 option 1, 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 · Simple select with progressive reveal

  • + One native select, no custom widget: the main choices first, the whole list only when asked.
  • – The reveal is a trick (the select rebuilds and reopens itself); a flat list treats "walk & transit" and "car" as equals.

4 · Rent and 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).

5 · Rent or park switches

  • + 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, Park&Ride" only exists for bike and car; asymmetric trips have no place here either (custom only).

Rule of thumb: options 1, 3 and 5 keep planner-v2-1 at one query (two for own car in option 5), which is the whole point of the recipe versus planner-v2. The settings screen belongs on top of them: user preferences as parameters on every query, restrict modes as a filter. Option 4 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.10
LabDataGtfs/en/data/gtfs
LabDataGtfs RT/en/data/gtfs-rt
LabDataGbfs/en/data/gbfs
LabDataRedis/en/data/redis
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.10/en/planner-otp-2-10
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 UXSettings/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UXUser preferences/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UXRestrict modes/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX1 Monomodal presets/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX2 Multimodal presets/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX3 Simple select, progressive reveal/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX4 Rent and park toggles/en/planner/migrating-to-otp2/mode-ux
LabMigrating to OTP2Mode selection UX5 Rent or park switches/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.10ApitoPlaceAPI params in:BMC v1BMC v2OTP 1OTP 2OTP 2.10ApiarriveByAPI params in:BMC v1BMC v2OTP 1OTP 2OTP 2.10ApitimeAPI params in:BMC v1BMC v2OTP 1ApibannedAgenciesAPI params in:BMC v1OTP 1OTP 2OTP 2.10ApibannedRoutesAPI params in:BMC v1OTP 1ApiwalkSpeedAPI params in:BMC v1OTP 1OTP 2OTP 2.10ApiwheelchairAPI 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.10ApiwalkReluctanceAPI params in:BMC v1OTP 1OTP 2OTP 2.10ApiroutingProfileAPI 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.10ApibikeSwitchCostAPI params in:OTP 1ApidisableAlertFilteringAPI params in:OTP 1ApidisableRemainingWeightHeuristicAPI params in:OTP 1ApigeoidElevationAPI params in:OTP 1ApiignoreRealtimeUpdatesAPI params in:OTP 1OTP 2OTP 2.10ApiintermediatePlacesAPI 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.10ApitriangleSafetyFactorAPI 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.10ApinumTripPatternsAPI params in:OTP 2OTP 2.10ApimaximumTransfersAPI params in:OTP 2OTP 2.10ApimaximumAdditionalTransfersAPI params in:OTP 2OTP 2.10ApisearchWindowAPI params in:OTP 2OTP 2.10ApiincludePlannedCancellationsAPI params in:OTP 2OTP 2.10ApiincludeRealtimeCancellationsAPI params in:OTP 2OTP 2.10ApitransferSlackAPI params in:OTP 2OTP 2.10ApiboardSlackDefaultAPI params in:OTP 2OTP 2.10ApiboardSlackListAPI params in:OTP 2OTP 2.10ApialightSlackDefaultAPI params in:OTP 2OTP 2.10ApialightSlackListAPI params in:OTP 2OTP 2.10ApibicycleOptimisationMethodAPI params in:OTP 2OTP 2.10ApitransportModesAPI params in:OTP 2OTP 2.10ApiegressModeAPI params in:OTP 2OTP 2.10ApidirectModeAPI params in:OTP 2OTP 2.10ApiaccessModeAPI params in:OTP 2OTP 2.10ApiitineraryFiltersDebugAPI params in:OTP 2OTP 2.10ApipageCursorAPI params in:OTP 2OTP 2.10ApiwheelchairAccessibleAPI params in:OTP 2OTP 2.10ApitriangleFactorsSafetyAPI params in:OTP 2OTP 2.10ApitriangleFactorsSlopeAPI params in:OTP 2OTP 2.10ApitriangleFactorsTimeAPI params in:OTP 2OTP 2.10ApiuseBikeRentalAvailabilityInformationAPI params in:OTP 2OTP 2.10ApimaxDirectDurationForModeAPI params in:OTP 2OTP 2.10ApifiltersAPI params in:OTP 2OTP 2.10ApirelaxTransitGroupPriorityAPI params in:OTP 2OTP 2.10ApifromServiceJourneyIdAPI params in:ApifromServiceDateAPI params in:ApifromStopLocationIdAPI params in:ApifromAimedDepartureTimeAPI params in:ApiwhiteListedAgenciesAPI 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.10Full 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