The fare engine

We've digitised the official taxi tariffs of 20 cities: every rate, time band, zone, flat fare and surcharge, taken from the regulator's own documents and written down as rules a computer can follow. One engine reads those rules and runs the taxi meter along your route, so you get the official fare without reading the regulator's PDF.

20Official tariffs digitised
44Official documents behind them
96Zone outlines on the map
150Reference fares worked out by hand
167/167Reference fares the engine matches today

Why digitise a tariff

A city's taxi tariff is a legal text: an order, a notice or a fare card, often a scanned PDF in the local language. It sets how the meter works, not what a trip costs, so to know the fare you have to apply every rule yourself: which rate is in force at that hour, when the meter counts distance and when it counts time, where the airport flat fare starts and which extras it allows.

Most fare calculators skip that work and estimate from an average price per kilometre. We did the work once, city by city, so that every page on TaxiFare can apply the regulator's rules exactly, in one place and in four languages.

From the regulator's document to a ruleset

Each city's tariff becomes a ruleset: a structured file with every rate, schedule, zone, flat fare and surcharge, and for each value the official document it comes from. Where the regulator's wording matters, the file quotes it. This is part of the real Dublin ruleset, taken from the file as this page was built:

si-479-2024:
  title: Taxi Regulation (Maximum Fares) Order 2024 (S.I. No. 479 of 2024)
  publisher: National Transport Authority, Irish Statute Book
  url: https://www.irishstatutebook.ie/pdf/2024/en.si.2024.0479.pdf
  kind: official
  retrieved: 2026-10-31
  checked: opened
  archive: null
standard-a:
  name: Standard rate, Tariff A
  flag: { amount: 4.40, covers: { distance: 500 m, time: 84.9 s } }
  distance: { amount: 0.20, every: 151.5 m }
  time: { amount: 0.20, every: 25.7 s }
  drop: { amount: 0.20, rounding: up }
  # "Graduates to Tariff B when running total switches from €23.60 to €23.80"
  after: { fare: 23.60, tariff: standard-b }
  source: si-479-2024
standard-b:
  name: Standard rate, Tariff B (over €23.60)
  flag: 0
  distance: { amount: 0.20, every: 116.3 m }
  time: { amount: 0.20, every: 19.7 s }
  drop: { amount: 0.20, rounding: up }
  source: si-479-2024
rules/rulesets/ie-dublin.yaml: the source, and the two daytime tariffs a trip from the airport uses. Tariff A hands over to Tariff B once the fare reaches the amount the Order sets.

Before a ruleset can be published, a validator checks it:

  • every value names its source, and a value without one fails;
  • the schedule leaves no hour of the week uncovered, and every zone, tariff and surcharge it refers to exists;
  • no combination of rates can make a slower trip cheaper than a quicker one;
  • anything the regulator doesn't state is written down as an assumption, never filled in silently.

Then the editor checks every value against the official document, line by line, and signs the tariff off. Until then the city's page says it's a draft. Every document is listed on the official sources page.

What the engine understands

No two cities set their fares the same way. These are the rules the engine applies today, each one needed by a real tariff:

Time of day, weekends and holidays

Each rate has its days, hours and public holidays, matched in local time. Rules are checked in order and the first that fits wins, so a holiday rate can take over from the weekday one.

In: Dublin, Paris, Madrid

Distance or time, as the meter counts

Above a set speed the meter charges by distance, below it by time. A few cities charge both at once. The engine follows the speed along the route and charges each stretch the way the meter would.

In: Paris, New York City, Vienna, Amsterdam

Meter steps

Many meters count in steps of a fixed amount, and a started step counts in full. The pick-up charge covers the first stretch of distance or time.

In: London, Dublin, Hong Kong, Mexico City

A rate that changes during the trip

Some tariffs move to a higher rate after a set distance or once the fare reaches an amount. In others the rate changes at a set time, even mid-journey.

In: London, Dublin, Rome, Tokyo

Zones and flat fares

Zone outlines decide whether the meter runs or a flat fare applies, for example between an airport and a city district, and which surcharges a flat fare may carry.

In: Paris, New York City, Madrid, Rome

Boundaries and percentages

Past a boundary the meter can run at a multiple of its rate, and a surcharge can be a share of the fare rather than a fixed amount.

In: New York City, San Francisco, Mexico City

Minimum and maximum fares

A minimum raises a short fare and a cap limits a long one. Either way, the lines on the quote still add up to the total.

In: Paris, London, Rome

Tolls, bookings and passengers

Tunnel and bridge tolls where the tariff passes them on, booking fees, and charges for extra passengers, each from the rule that sets it.

In: Hong Kong, New York City, Dublin, Paris

The tariff in force that day

A new tariff becomes a new version with its start date, and a quote uses the version in force on the day of the trip. Every change is on the tariff changes page.

Running the meter along the route

A trip is routed on real roads with OpenStreetMap data. The engine then checks which zones the route starts in, ends in and passes through, picks the rate in force at pick-up, and runs the meter along the route. A meter charges for time in slow traffic, so each quote comes in light, typical and heavy traffic, using journey times fitted to each city.

Every trip page shows its route on a map with the zones that decide the fare. Two examples, from the live site:

Map of a taxi route from Paris-Charles de Gaulle Airport to Saint-Germain, crossing the Paris taxi zone into the left-bank flat-fare zone
Paris: the route from Charles de Gaulle Airport ends inside the left-bank zone (the dotted outline), so the official flat fare applies instead of the meter. Paris sets one flat fare for each bank of the Seine.
Map of a taxi route from Heathrow Airport to Paddington, with a marker where the London meter moves to its long-distance tariff
London: the green marker shows where the meter moves to its long-distance rate, which Transport for London sets for the later part of a long trip.

Every charge on a quote is listed with the rule behind it and a link to the official document:

A Dublin Airport to O'Connell Street taxi fare, broken down line by line, each line linked to the Taxi Regulation (Maximum Fares) Order 2024
Dublin: the fare from the airport to O'Connell Street, line by line. Each line links to the Order it comes from.

Screenshots taken on 5 November 2026. The pages themselves always show the current tariff.

How we test it

Code that agrees with itself proves nothing, so every tariff is tested against fares worked out independently of the engine:

  • Worked by hand. For each city we take typical trips (a short hop, an airport run, a night or weekend trip, a trip across a boundary) and work out the fare by hand from the tariff alone, with the arithmetic written above each one. The engine must come within 2%.
  • The regulator's own examples. Where a regulator publishes example fares, such as Transport for London's typical fares, the engine must land inside its published range.
  • Along the real road. Every reference fare is also re-run along its road route, to check the journey times.
  • Rules that must always hold. Automated tests check, for example, that a longer or slower trip never costs less, that a quote's lines always add up to its total, and that every fare in a page's text matches the ruleset.

The engine ran every reference fare while this page was built. Here are the results:

CityReference faresWorked by handThe regulator's examplesMatch
Abu Dhabi 6 6 0 6/6
Amsterdam 5 4 1 5/5
Barcelona 10 10 0 10/10
Berlin 6 6 0 6/6
Boston 6 6 0 6/6
Dublin 8 8 0 8/8
Edinburgh 10 10 0 10/10
Hong Kong 7 7 0 7/7
London 15 2 13 15/15
Madrid 11 11 0 11/11
Mexico City 9 9 0 9/9
Munich 9 9 0 9/9
New York City 7 7 0 7/7
Paris 6 3 3 6/6
Rome 10 10 0 10/10
San Francisco 9 9 0 9/9
São Paulo 6 6 0 6/6
Tokyo 14 14 0 14/14
Vienna 6 6 0 6/6
Washington DC 7 7 0 7/7
All cities16715017167/167

One trip, worked out twice

Dublin Airport to O'Connell Street, Tuesday 12:00 (standard, A then B). First, the reference fare as it sits in our test file, worked out by hand from the Order:

# Airport to O'Connell Street, 15,480 m in 30 min: 1,030.6 s moving
# (12,900.5 m) + 769.4 s slow. Whole trip at Tariff A: 12,900.5/151.5 × 0.20
# + 769.4/25.7 × 0.20 = 23.0175; A takes (19.20 + 0.6601) / 23.0175 = 0.8628
# of it (19.20). The rest at Tariff B: 0.1372 × (12,900.5/116.3 × 0.20
# + 769.4/19.7 × 0.20) = 4.1148. 116.57 steps → 117 × 0.20 = 23.40; + 4.40 = 27.80.
- { id: airport-city, label: "Dublin Airport to O'Connell Street, Tuesday 12:00 (standard, A then B)", kind: hand, source: si-479-2024,
    trip: { from: [53.4264, -6.2499], to: [53.3498, -6.2603], at: "2026-11-03 12:00", distance: 15.48 km, duration: 30 min },
    expect: { mode: meter, fare: 27.80 } }
rules/golden/ie-dublin.yaml: the arithmetic in the comment, the trip and the expected fare below it.

Then the engine's answer for the same trip, worked out as this page was built:

LineRuleAmount
Pick-up charge, Standard rate, Tariff A, includes the first 500 m or 84.9 sTaxi Regulation (Maximum Fares) Order 2024 (S.I. No. 479 of 2024)tariffs.standard-a€4.40
Standard rate, Tariff A: 11.13 km, 11.1 min in slow trafficTaxi Regulation (Maximum Fares) Order 2024 (S.I. No. 479 of 2024)tariffs.standard-a€19.86
Standard rate, Tariff B (over €23.60): 1.77 km, 1.8 min in slow trafficTaxi Regulation (Maximum Fares) Order 2024 (S.I. No. 479 of 2024)tariffs.standard-b€4.11
Included in the pick-up chargeTaxi Regulation (Maximum Fares) Order 2024 (S.I. No. 479 of 2024)tariffs.standard-a−€0.66
Meter steps of 0.20 (a started step counts)Taxi Regulation (Maximum Fares) Order 2024 (S.I. No. 479 of 2024)tariffs.standard-a€0.09
Engine · worked by hand: €27.80€27.80

The two agree. The same trace is in the quote API, so anyone can check a fare line by line:

{
  "mode": "meter",
  "typical": 27.8,
  "lines": [
    {
      "label": "Pick-up charge, Standard rate, Tariff A, includes the first 500 m or 84.9 s",
      "amount": 4.4,
      "rule": "tariffs.standard-a",
      "source": "si-479-2024"
    },
    {
      "label": "Standard rate, Tariff A: 11.13 km, 11.1 min in slow traffic",
      "amount": 19.86,
      "rule": "tariffs.standard-a",
      "source": "si-479-2024"
    }
  ],
  "events": [
    {
      "at_m": 13356.4,
      "label": "Standard rate, Tariff B (over €23.60) starts",
      "rule": "tariffs.standard-b"
    }
  ]
}
Part of the engine's trace for this trip: each line names its rule and source, and the events say where along the route the rate changed.

What the engine can't know

  • Traffic on the day. We give a range for light, typical and heavy traffic; the meter charges for the traffic you actually meet.
  • The driver's route. We price the quickest road route; a detour, a closed road or a toll road the tariff doesn't cover changes the fare.
  • Extras nobody can see in advance, such as a soiling charge. Where a tariff allows one, the quote lists it as something that may be added.
  • Tips, and ride-hailing prices such as Uber's or Bolt's: they aren't regulated, so there's no official tariff to digitise.

If a fare you paid differs from ours, tell us. Confirmed reports become new reference fares.

Use the engine

The same engine answers the quote API and the MCP server at /mcp, with the full trace: every line with its rule and source, the route and the events along it. How we choose sources and verify tariffs is in the methodology.