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.
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
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.
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.
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.
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.
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:
Every charge on a quote is listed with the rule behind it and a link to the official document:
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:
| City | Reference fares | Worked by hand | The regulator's examples | Match |
|---|---|---|---|---|
| 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 cities | 167 | 150 | 17 | 167/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 } }
Then the engine's answer for the same trip, worked out as this page was built:
| Line | Rule | Amount |
|---|---|---|
| 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"
}
]
}
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.