Skip to content

Fares & transfers

Turn on Include Pricing in the debug UI. For an API request, add:

{ "includePricing": true }

Standard pricing uses second class for trains.

To request first-class train fares, add:

{ "includePricing": true, "pricingOptions": { "travelClass": "FIRST_CLASS" } }

SECOND_CLASS is the default. Use FIRST_CLASS to compare first-class fares for a train journey, such as Utrecht Centraal → Driebergen-Zeist. Display the price returned for the selected journey.

pricingOptions.age currently selects the 65+ tariff for flex services that have a separate senior tariff. Regular bus, tram, metro and train fares use standard pricing; general child and senior discounts are not currently applied. Bravoflex has the same configured adult and senior base fare.

For a supported flex service, include the traveller’s age:

{ "includePricing": true, "pricingOptions": { "age": 70 } }

Try Breda Airport → UMCG Hoofdingang, Groningen with Include Pricing and Use Flexible Routing enabled. Open a journey with Bravoflex, buses and a train transfer, then click its price.

Open this search in I’m Planner
Opens for the next weekday at 10:00 in your local time.

The search link compares regular public transport with Bravoflex connections.

The example below combines Bravoflex to Sint Willebrord, bus 162 to Etten-Leur, trains via Zwolle to Groningen, and bus 6 to UMCG. Its breakdown shows:

  • A separate fare for each flex, bus and train leg.
  • The transfer discount for continuing by public transport after Bravoflex.
  • Langeafstandskorting on the connecting train: the train fares are calculated together, with the saving shown on the affected leg.
  • The total fare for the whole journey.
Bravoflex, bus 162, connecting trains and bus 6, including the flex transfer discount and Langeafstandskorting.
See what makes up the fare

Bravoflex, bus 162, connecting trains and bus 6, including the flex transfer discount and Langeafstandskorting.

Prices arrive in cents. Divide by 100 and use the returned currency:

const fare = trip.pricingInfo;
const price = fare
? new Intl.NumberFormat('nl-NL', {
style: 'currency', currency: fare.currency
}).format((fare.totalPrice ?? 0) / 100)
: 'Fare unavailable';

Use Fare unavailable when pricing is absent. If any leg has status UNKNOWN, label the total Partial fare. Discounts include their own description and amount for your breakdown.

Some train transfers include a check-out/check-in instruction. Use pricingInfo.transferInstruction to place it between the indicated legs. This helps the traveller know where to switch check-in systems.

On a journey from Utrecht to Venray, change at Nijmegen: check out with NS and check in with Arriva before continuing.
Check out, then check in

On a journey from Utrecht to Venray, change at Nijmegen: check out with NS and check in with Arriva before continuing.