Route & Toll API
Turn-by-turn directions with the tolls along them, priced for your vehicle, how you pay and when you drive; places, drive-time matrices, reach and stop order; and the basemap for your own map. Same routing and toll pricing as the map at geo1:8080.
https://geo1.xl5.space/api (on the local network also http://192.168.50.220:8080/api). Every example below is a real answer from it, taken from another machine on the network.Overview
Send a start, a destination and how you drive; get back the route step by step and every toll on it: which plaza or road, where along the route, at what time, how much, and the operator's document for the price. Roads priced from entry to exit (the New Jersey Turnpike, the Atlantic City Expressway, the Pennsylvania Turnpike, the ICC) come back as one charge for the trip.
Base address: https://geo1.xl5.space/api. JSON in, JSON out. Times are Eastern; amounts are US dollars. Points are {"lat", "lon"} objects; arrays and GeoJSON are [lon, lat].
Keys and limits
- Every request carries a key in the header
X-API-Key. Map tiles, the style and the toll layer also take it as?key=, since map libraries fetch those themselves. - Limits per key: 30 requests a minute on the API, 6,000 a minute on tiles and map files. Beyond that the reply is
429withRetry-After. A key can carry its own limits. - A key can be tied to your web sites' addresses (browser use); other sites get
403. - Keys are issued and revoked on geo1, one by one. Every request is logged with its key name, endpoint, status and time taken.
Quick start
curl -s https://geo1.xl5.space/api/route \
-H 'X-API-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{
"from": {
"lat": 40.4862,
"lon": -74.4518
},
"to": {
"lat": 40.7549,
"lon": -73.984
},
"depart": "2026-10-14T08:30",
"vehicle": "car2",
"payment": "ezpass_nj"
}'
Ways to integrate
- Your map, our routes and tolls. Call
/api/routewithinclude: ["geojson"]and draw the features: route line, tolled stretches, toll points, turn points. Steps carry their stretch of the line (shape) and turn point (at). - Your router, our tolls. Send the line your system already has to
/api/price, with your own times if you have them. - Our basemap in your map. Point MapLibre (or any vector-tile map) at
/api/map/style.json; addtolls=1for the toll points. - Planning. Addresses (geocode, reverse), drive-time tables for dispatch (matrix), how far in N minutes (isochrone), best stop order with tolls per leg (optimize).
Route with tolls
Returns the best route (or the toll-free one) with turn-by-turn steps and its tolls; with return, the route back too.
Request fields
| field | type | required | meaning |
|---|---|---|---|
| from | place | yes | Start: a place: {"lat": 40.4862, "lon": -74.4518}, [lon, lat], or an address / place name (looked up with the geocoder). |
| to | place | yes | Destination, same forms. |
| via | array of places | no | Points the route must pass through, in order (at most 20). The route stays one leg. |
| depart | string | no | Departure, Eastern time, YYYY-MM-DDTHH:MM (a time with Z or an offset is taken as written). Decides peak / off-peak prices. Default: now. |
| return | string | no | Return departure. When given, the reply carries return: the route back with its own steps and tolls. |
| vehicle | string | no | Vehicle code (see codes). Default car2. Trucks and RVs are routed with truck costing. |
| payment | string | no | How the driver pays. Default ezpass_other. |
| toll_free | boolean | no | true asks the router to avoid toll roads. Default false: the best route, express lanes included. |
| costing | string | no | auto or truck; set from vehicle when left out. |
| include | array | no | "rates": every published row behind each charge. "geojson": the whole answer as a GeoJSON FeatureCollection, ready for your map. |
Reply fields
| field | meaning |
|---|---|
| request_id | Id of this answer (also the X-Request-Id header). |
| data_version | Date of the toll data used. |
| places | The resolved from, to, via, with the geocoder's name when an address was given. |
| route.miles, route.minutes | Length and driving time. |
| route.depart, route.arrive | Eastern time, with offset. |
| route.polyline6 | The full route line: Google encoded polyline, 6 decimals (lat, lon). route.points is its point count. Every shape and shape_index in the answer is an index into this line. |
| route.steps[] | Turn-by-turn, one per maneuver (fields below). |
| tolls.total | Total for the vehicle and payment. total_low / total_high differ only when a price cannot be pinned down (a time window the data could not read). |
| tolls.charges[] | One per toll charged (fields below). |
| tolls.unpriced[] | Tolls the route passes that the data cannot price: an operator's toll with no published rate for this vehicle or payment, or a toll gantry in OpenStreetMap that no published point claims. Each has position, shape_index and reason. Not in the total. |
| tolls.passed[] | Toll points the route passes without a charge, with the reason (other direction, still inside express lanes already paid, …). Optional express lanes priced live (Virginia) come here with express_lanes: optional, beside_route (reversible lanes beside the general lanes the route drives), toll_in_effect, direction, hours, entered, left, how_to_check; why says it in one sentence. |
| tolls.segments[] | Tolled stretches of the line: shape [first, last] index, from, to, miles, and the charges inside. Colour these on your map. |
| return | Present when return was asked: {route, tolls} of the trip back. Its charge ids start with r. |
| geojson | With include: ["geojson"]: features of kind route, toll_segment, step, charge, trip_exit, unpriced; coordinates are [lon, lat]. |
Example
New Brunswick to Midtown Manhattan with a New Jersey E-ZPass, leaving 8:30 a.m. on Wednesday Oct 14: the Turnpike from exit 9 to exit 16E is one trip charge ($10.29); the Lincoln Tunnel is reached at 09:10, inside the peak window ($16.79); coming out of the tunnel into Manhattan below 60th Street is one Congestion Relief Zone charge, $9.00 at peak less the $3.00 credit for entering through the Lincoln Tunnel ($6.00). Total $33.08. The page shows steps 1, 8, 9, 13, 19 of 19 and the first characters of the line.
Request
{
"from": {
"lat": 40.4862,
"lon": -74.4518
},
"to": {
"lat": 40.7549,
"lon": -73.984
},
"depart": "2026-10-14T08:30",
"vehicle": "car2",
"payment": "ezpass_nj"
}Reply
{
"request_id": "156c4e00-a24d-4ced-be05-7d4b3a7ae046",
"data_version": "2026-10-10",
"places": {
"from": {
"lat": 40.4862,
"lon": -74.4518
},
"to": {
"lat": 40.7549,
"lon": -73.984
}
},
"route": {
"miles": 37.94,
"minutes": 45.9,
"depart": "2026-10-14T08:30:00-04:00",
"arrive": "2026-10-14T09:15:53-04:00",
"has_toll": true,
"polyline6": "ooaflArwd_mCj@gAb@e@|CmDqD}Dq[e]kBoBeBmBa[s\\gBmB\u2026",
"points": 1550,
"steps": [
{
"n": 1,
"type": "start_left",
"type_code": 3,
"instruction": "Drive southeast on Delavan Street.",
"voice": {
"pre": "Drive southeast on Delavan Street. Then Turn left onto Livingston Avenue.",
"post": "Continue for 60 feet.",
"succinct": "Drive southeast. Then Turn left onto Livingston Avenue."
},
"streets": [
"Delavan Street"
],
"at": {
"lat": 40.486152,
"lon": -74.45185
},
"bearing_after": 133,
"shape": [
0,
3
],
"miles": 0.01,
"minutes": 0,
"depart_at": "2026-10-14T08:30:00-04:00",
"highway": false,
"toll": false,
"travel_mode": "drive"
},
{
"n": 8,
"type": "ramp_right",
"type_code": 18,
"instruction": "Take the NJTP Toll/I 95 Toll ramp on the right toward New Jersey Turnpike.",
"voice": {
"alert": "Take the NJTP Toll ramp on the right.",
"pre": "Take the NJTP Toll, I 95 Toll ramp on the right toward New Jersey Turnpike."
},
"sign": {
"branch": [
"NJTP Toll",
"I 95 Toll"
],
"toward": [
"New Jersey Turnpike"
]
},
"streets": [],
"at": {
"lat": 40.478151,
"lon": -74.410553
},
"bearing_before": 164,
"bearing_after": 175,
"shape": [
246,
312
],
"miles": 0.4,
"minutes": 1.5,
"depart_at": "2026-10-14T08:34:57-04:00",
"highway": false,
"toll": true,
"travel_mode": "drive",
"tolls": [
"c1"
]
},
{
"n": 9,
"type": "stay_left",
"type_code": 24,
"instruction": "Keep left to take I 95 North/NJTP North toward New York City.",
"voice": {
"alert": "Keep left to take I 95 North.",
"pre": "Keep left to take I 95 North, NJTP North toward New York City."
},
"sign": {
"branch": [
"I 95 North",
"NJTP North"
],
"toward": [
"New York City"
]
},
"streets": [],
"at": {
"lat": 40.47809,
"lon": -74.407599
},
"bearing_before": 78,
"bearing_after": 77,
"shape": [
312,
334
],
"miles": 0.28,
"minutes": 0.3,
"depart_at": "2026-10-14T08:36:29-04:00",
"highway": false,
"toll": true,
"travel_mode": "drive"
},
{
"n": 13,
"type": "stay_right",
"type_code": 23,
"instruction": "Keep right to take Lincoln Tunnel.",
"voice": {
"alert": "Keep right to take Lincoln Tunnel.",
"pre": "Keep right to take Lincoln Tunnel.",
"post": "Continue for 1.5 miles."
},
"streets": [
"Lincoln Tunnel"
],
"at": {
"lat": 40.76493,
"lon": -74.023534
},
"bearing_before": 36,
"bearing_after": 45,
"shape": [
1465,
1493
],
"miles": 1.62,
"minutes": 2.8,
"depart_at": "2026-10-14T09:10:24-04:00",
"highway": true,
"toll": true,
"travel_mode": "drive",
"tolls": [
"c2"
]
},
{
"n": 19,
"type": "destination_right",
"type_code": 5,
"instruction": "Your destination is on the right.",
"voice": {
"alert": "Your destination will be on the right.",
"pre": "Your destination is on the right."
},
"streets": [],
"at": {
"lat": 40.754924,
"lon": -73.984057
},
"bearing_before": 29,
"shape": [
1549,
1549
],
"miles": 0,
"minutes": 0,
"depart_at": "2026-10-14T09:15:53-04:00",
"highway": false,
"toll": false,
"travel_mode": "drive"
}
]
},
"tolls": {
"currency": "USD",
"total": 33.08,
"total_low": 33.08,
"total_high": 33.08,
"payment": "ezpass_nj",
"vehicle": "car2",
"charges": [
{
"kind": "trip",
"state": "NJ",
"facility": "New Jersey Turnpike",
"facility_id": "NJ-NJTP",
"direction": "any",
"entry": "Interchange 9 New Brunswick Int.",
"exit": "Interchange 16E RT 3/Secaucus, RT 495/Lincoln Tunnel",
"gantries": [
"Interchange 9 New Brunswick Int.",
"Interchange 16E RT 3/Secaucus, RT 495/Lincoln Tunnel"
],
"mile": 3.2,
"exit_mile": 32.56,
"at": "2026-10-14T08:36:20-04:00",
"position": {
"lat": 40.477972,
"lon": -74.408268
},
"exit_position": {
"lat": 40.777304,
"lon": -74.057592
},
"shape_index": 309,
"exit_shape_index": 1245,
"id": "c1",
"amount": 10.29,
"payment": "E-ZPass",
"vehicle_class": "Class 1, 2-axle passenger vehicles",
"time_band": "all",
"time_window": "all hours, every day",
"effective": "2026-10-03_observed",
"source": "https://www.njta.gov/document/2026-turnpike-class-1-passenger-cars-2-axles/",
"notes": []
},
{
"kind": "point",
"state": "NJ",
"facility": "Lincoln Tunnel",
"facility_id": "NJ-PANYNJ-LT",
"location": "Lincoln Tunnel toll gantry",
"point_id": "NJ-PANYNJ-LT-01",
"heading": "east",
"mile": 35.36,
"at": "2026-10-14T09:10:24-04:00",
"position": {
"lat": 40.76493,
"lon": -74.023534
},
"shape_index": 1465,
"id": "c2",
"amount": 16.79,
"payment": "NY/NJ E-ZPass",
"vehicle_class": "Class 1: two axles, single rear wheels",
"time_band": "peak",
"time_window": "Mon-Fri 06:00-10:00; Mon-Fri 16:00-20:00; Sat-Sun 11:00-21:00 (Eastern time)",
"effective": "2026-07-12",
"source": "https://www.panynj.gov/bridges-tunnels/en/tolls.html",
"notes": []
},
{
"kind": "trip",
"state": "NY",
"facility": "Congestion Relief Zone (CBD toll)",
"facility_id": "NY-MTA-CBD",
"direction": "any",
"entry": "Lincoln Tunnel",
"exit": "Lincoln Tunnel",
"gantries": [
"Lincoln Tunnel entry: West 40th Street (14173684895)",
"Lincoln Tunnel entry: West 40th Street (14173684894)"
],
"mile": 37.15,
"exit_mile": 37.2,
"at": "2026-10-14T09:13:26-04:00",
"position": {
"lat": 40.757583,
"lon": -73.994611
},
"exit_position": {
"lat": 40.757276,
"lon": -73.993867
},
"shape_index": 1514,
"exit_shape_index": 1518,
"id": "c3",
"amount": 6,
"payment": "E-ZPass (CBD)",
"vehicle_class": "Class 1: Passenger and other vehicles (sedans, SUVs, pickups, vans)",
"time_band": "peak",
"time_window": "Mon-Fri 05:00-21:00; Sat-Sun 09:00-21:00",
"effective": "2025-01-05",
"source": "https://www.mta.info/document/138931",
"notes": []
}
],
"unpriced": [],
"passed": [],
"segments": [
{
"shape": [
245,
1329
],
"from": {
"lat": 40.47829,
"lon": -74.410607
},
"to": {
"lat": 40.777032,
"lon": -74.044489
},
"miles": 30.59,
"charges": [
"c1"
]
},
{
"shape": [
1367,
1518
],
"from": {
"lat": 40.76988,
"lon": -74.026376
},
"to": {
"lat": 40.757515,
"lon": -73.994451
},
"miles": 2.67,
"charges": [
"c2",
"c3"
]
}
]
}
}Turn-by-turn steps
Each step of route.steps:
| field | meaning |
|---|---|
| n | Step number. |
| type, type_code | The maneuver: start, right, left, slight_right, sharp_left, uturn_left, ramp_right, exit_right, stay_left, merge, roundabout_enter, roundabout_exit, ferry_enter, destination, … and the router's number for it. |
| instruction | The written instruction. |
| voice.alert, voice.pre, voice.post, voice.succinct | Spoken prompts: alert well before the turn, pre at the turn, post after it ("Continue for 2 miles."), succinct a short form. |
| sign | What the exit sign says: exit_number, branch (route shields, e.g. "I 95 North"), toward ("New York City"), name. Present only when signed. |
| streets, begin_streets | Street names on the step, and at its start when they differ. |
| at | {lat, lon} of the maneuver point. |
| bearing_before, bearing_after | Heading into and out of the maneuver, degrees from north. |
| shape | [first, last] index of the step's stretch of polyline6: draw or highlight the step with it. |
| miles, minutes | Length and time of the step. |
| depart_at | Clock time (Eastern) the vehicle starts the step. |
| highway, toll | The step is on a highway / a toll road. |
| travel_mode | drive (or ferry on a ferry step). |
| roundabout_exit | Which exit to take, on roundabout steps. |
| tolls | Ids of the charges on this step. |
Lane guidance (which lanes to use) is not given: the router build on geo1 does not produce it.
Toll charges
Each entry of tolls.charges:
| field | meaning |
|---|---|
| id | c1, c2, … (r1… on the return). |
| kind | point: a plaza or gantry priced per passage. trip: a road priced from where you get on to where you get off (NJ Turnpike, Atlantic City Expressway, PA Turnpike, ICC, US 301, express-lane trips). |
| state, facility, facility_id | Where, by the operator's own names. |
| location, point_id, heading | point: the collection point and the direction of travel there. |
| entry, exit, entry_point_id, exit_point_id, direction, gantries | trip: the fare table's entry and exit, and the gantries passed. |
| mile, at, position, shape_index | Where the charge is collected (or the trip begins): miles along the route, clock time reached (Eastern), {lat, lon}, index into the line. |
| exit_mile, exit_position, exit_shape_index | trip: where the trip ends. |
| amount, amount_high | The price; amount_high only when two rows could apply. |
| payment, vehicle_class, per_axle | The payment and vehicle class exactly as the operator prints them; per_axle when the rate is per axle. |
| time_band, time_window | Which price band was in force at at (peak, off-peak, all, dynamic) and its window as published. |
| effective, source | When the rate took effect (or was observed), and the operator's document it comes from. |
| other_lines | Other rows that also apply (e.g. two payment rows), when there are any. |
| notes | Anything to know: dynamic express-lane floor, direction not stated by the operator, transponder not accepted (priced at cash / bill by mail). |
| rates | With include: ["rates"]: every published row of this point or trip. |
Price your own route
For systems that route on their own: send the line, get the tolls on it. The answer is the same tolls block as /api/route.
Request fields
| field | type | required | meaning |
|---|---|---|---|
| line | polyline6 string, array of [lon, lat], or a GeoJSON LineString | yes | The route as your system has it: a GPS trace or your router's line. Points under 1.5 km apart are map-matched to the roads; between points farther apart the router fills in the road. Up to 20,000 points. |
| times | array | no | One time per line point (Eastern YYYY-MM-DDTHH:MM:SS, or with offset, or Unix seconds). Each toll is then priced at the time your vehicle was (or will be) there. Without it, the router's driving times from depart are used. |
| depart | string | no | Departure, when times is not given. Default: now. |
| vehicle, payment, costing | string | no | As for /api/route. |
| include | array | no | "rates", "geojson", and "steps" (turn-by-turn for the matched line). |
Reply fields
| field | meaning |
|---|---|
| matched.miles, matched.minutes, matched.polyline6, matched.points | The line as it was followed on the road network; indexes in the answer point into this line. |
| matched.pieces[] | How each part of your line was followed: matched (map-matched) or routed (gap filled by the router), by your line's point indexes. |
| tolls | As for /api/route, plus times_from: client (your times) or router. |
Example
The same New Brunswick → Midtown drive as 16 points about 3 miles apart, with the client's clock: leaving 10:30: the Turnpike and the tunnel are off-peak ($7.72 and $14.79); the zone's peak runs 5 a.m. to 9 p.m. ($6.00 after the tunnel credit). Total $28.51.
Request
{
"line": [
[
-74.45185,
40.486152
],
[
-74.436461,
40.488642
],
[
-74.412868,
40.481977
],
[
-74.402992,
40.47785
],
[
-74.31926,
40.538094
],
[
-74.230272,
40.600551
],
[
-74.180118,
40.6667
],
[
-74.139369,
40.71399
],
[
-74.125334,
40.731106
],
[
-74.111921,
40.752835
],
[
-74.083744,
40.758464
],
[
-74.061795,
40.771514
],
[
-74.045893,
40.777203
],
[
-74.023606,
40.762782
],
[
-73.98504,
40.753559
],
[
-73.984057,
40.754924
]
],
"times": [
"2026-10-14T10:30:00",
"2026-10-14T10:33:04",
"2026-10-14T10:36:08",
"2026-10-14T10:39:12",
"2026-10-14T10:42:16",
"2026-10-14T10:45:20",
"2026-10-14T10:48:24",
"2026-10-14T10:51:28",
"2026-10-14T10:54:32",
"2026-10-14T10:57:36",
"2026-10-14T11:00:40",
"2026-10-14T11:03:44",
"2026-10-14T11:06:48",
"2026-10-14T11:09:52",
"2026-10-14T11:12:56",
"2026-10-14T11:16:00"
],
"vehicle": "car2",
"payment": "ezpass_nj"
}Reply
{
"request_id": "5c31387b-c8b8-4931-bee1-1bc7143bdb95",
"data_version": "2026-10-10",
"matched": {
"miles": 37.9,
"minutes": 46.8,
"polyline6": "_maflAdtd_mC|CmD|C_DN[zS{`@pa@gw@zAuCnAiCpYcn@tX\u2026",
"points": 1540,
"pieces": [
{
"kind": "matched",
"from_point": 0,
"to_point": 1
},
{
"kind": "routed",
"from_point": 1,
"to_point": 2
},
{
"kind": "matched",
"from_point": 2,
"to_point": 3
},
{
"kind": "routed",
"from_point": 3,
"to_point": 11
},
{
"kind": "matched",
"from_point": 11,
"to_point": 12
},
{
"kind": "routed",
"from_point": 12,
"to_point": 14
},
{
"kind": "matched",
"from_point": 14,
"to_point": 15
}
]
},
"tolls": {
"currency": "USD",
"total": 28.51,
"total_low": 28.51,
"total_high": 28.51,
"payment": "ezpass_nj",
"vehicle": "car2",
"charges": [
{
"kind": "trip",
"state": "NJ",
"facility": "New Jersey Turnpike",
"facility_id": "NJ-NJTP",
"direction": "any",
"entry": "Interchange 9 New Brunswick Int.",
"exit": "Interchange 16E RT 3/Secaucus, RT 495/Lincoln Tunnel",
"gantries": [
"Interchange 9 New Brunswick Int.",
"Interchange 16E RT 3/Secaucus, RT 495/Lincoln Tunnel"
],
"mile": 3.17,
"exit_mile": 32.53,
"at": "2026-10-14T10:39:12-04:00",
"position": {
"lat": 40.477972,
"lon": -74.408268
},
"exit_position": {
"lat": 40.777304,
"lon": -74.057592
},
"shape_index": 290,
"exit_shape_index": 1233,
"id": "c1",
"amount": 7.72,
"payment": "NJ E-ZPass Off-Peak",
"vehicle_class": "Class 1, 2-axle passenger vehicles",
"time_band": "off-peak",
"time_window": "Mon-Fri 00:00-07:00; Mon-Fri 09:00-16:30; Mon-Fri 18:30-24:00 (Eastern time)",
"effective": "2026-10-03_observed",
"source": "https://www.njta.gov/document/2026-turnpike-class-1-passenger-cars-2-axles/",
"notes": []
},
{
"kind": "point",
"state": "NJ",
"facility": "Lincoln Tunnel",
"facility_id": "NJ-PANYNJ-LT",
"location": "Lincoln Tunnel toll gantry",
"point_id": "NJ-PANYNJ-LT-01",
"heading": "east",
"mile": 35.33,
"at": "2026-10-14T11:09:52-04:00",
"position": {
"lat": 40.76493,
"lon": -74.023534
},
"shape_index": 1455,
"id": "c2",
"amount": 14.79,
"payment": "NY/NJ E-ZPass",
"vehicle_class": "Class 1: two axles, single rear wheels",
"time_band": "off-peak",
"time_window": "Mon-Fri 00:00-06:00; Mon-Fri 10:00-16:00; Mon-Fri 20:00-24:00; Sat-Sun 00:00-11:00; Sat-Sun 21:00-24:00 (Eastern time)",
"effective": "2026-07-12",
"source": "https://www.panynj.gov/bridges-tunnels/en/tolls.html",
"notes": []
},
{
"kind": "trip",
"state": "NY",
"facility": "Congestion Relief Zone (CBD toll)",
"facility_id": "NY-MTA-CBD",
"direction": "any",
"entry": "Lincoln Tunnel",
"exit": "Lincoln Tunnel",
"gantries": [
"Lincoln Tunnel entry: West 40th Street (14173684895)",
"Lincoln Tunnel entry: West 40th Street (14173684894)"
],
"mile": 37.13,
"exit_mile": 37.17,
"at": "2026-10-14T11:12:56-04:00",
"position": {
"lat": 40.757583,
"lon": -73.994611
},
"exit_position": {
"lat": 40.757276,
"lon": -73.993867
},
"shape_index": 1504,
"exit_shape_index": 1508,
"id": "c3",
"amount": 6,
"payment": "E-ZPass (CBD)",
"vehicle_class": "Class 1: Passenger and other vehicles (sedans, SUVs, pickups, vans)",
"time_band": "peak",
"time_window": "Mon-Fri 05:00-21:00; Sat-Sun 09:00-21:00",
"effective": "2025-01-05",
"source": "https://www.mta.info/document/138931",
"notes": []
}
],
"unpriced": [],
"passed": [],
"segments": [
{
"shape": [
226,
1318
],
"from": {
"lat": 40.47829,
"lon": -74.410607
},
"to": {
"lat": 40.777032,
"lon": -74.044489
},
"miles": 30.59,
"charges": [
"c1"
]
},
{
"shape": [
1356,
1508
],
"from": {
"lat": 40.76988,
"lon": -74.026376
},
"to": {
"lat": 40.757515,
"lon": -73.994451
},
"miles": 2.67,
"charges": [
"c2",
"c3"
]
}
],
"times_from": "client"
}
}Toll points
The toll points inside a circle (lat, lon, radius_mi up to 25, default 5), a box (bbox=west,south,east,north), a state or a facility_id, with their published rates. vehicle keeps the rows for that vehicle; payment keeps the rows that driver would pay. format=geojson returns a FeatureCollection.
curl -s 'https://geo1.xl5.space/api/tolls?lat=40.765&lon=-74.02&radius_mi=1&vehicle=car2' -H 'X-API-Key: YOUR_KEY'
{
"data_version": "2026-10-10",
"count": 1,
"points": [
{
"point_id": "NJ-PANYNJ-LT-01",
"state": "NJ",
"facility": "Lincoln Tunnel",
"facility_id": "NJ-PANYNJ-LT",
"location": "Lincoln Tunnel toll gantry",
"category": "crossing fee",
"crossing": "tunnel",
"lat": 40.76493,
"lon": -74.023534,
"position_basis": "OSM map match",
"distance_mi": 0.19,
"priced": "per passage",
"rates": [
{
"direction": "eastbound",
"vehicle_class": "Class 1: two axles, single rear wheels",
"payment": "NY/NJ E-ZPass",
"time_band": "off-peak",
"time_window": "Mon-Fri 00:00-06:00; Mon-Fri 10:00-16:00; Mon-Fri 20:00-24:00; Sat-Sun 00:00-11:00; Sat-Sun 21:00-24:00 (Eastern time)",
"amount": 14.79,
"effective": "2026-07-12",
"source": "https://www.panynj.gov/bridges-tunnels/en/tolls.html"
},
{
"direction": "eastbound",
"vehicle_class": "Class 1: two axles, single rear wheels",
"payment": "NY/NJ E-ZPass",
"time_band": "peak",
"time_window": "Mon-Fri 06:00-10:00; Mon-Fri 16:00-20:00; Sat-Sun 11:00-21:00 (Eastern time)",
"amount": 16.79,
"effective": "2026-07-12",
"source": "https://www.panynj.gov/bridges-tunnels/en/tolls.html"
},
{
"direction": "eastbound",
"vehicle_class": "Class 1: two axles, single rear wheels",
"payment": "E-ZPass (not NY/NJ)",
"time_band": "all",
"time_window": "all hours, every day",
"amount": 23.3,
"effective": "2026-07-12",
"source": "https://www.panynj.gov/bridges-tunnels/en/tolls.html"
},
{
"direction": "eastbound",
"vehicle_class": "Class 1: two axles, single rear wheels",
"payment": "Tolls by Mail",
"time_band": "all",
"time_window": "all hours, every day",
"amount": 23.3,
"effective": "2026-07-12",
"source": "https://www.panynj.gov/bridges-tunnels/en/tolls.html"
}
]
}
]
}
Trip fares
Entry-to-exit fares of a road priced per trip. facility_id (e.g. NJ-NJTP, NJ-ACE, PA-PTC) or facility; entry and exit match part of the name; vehicle and payment narrow as above.
curl -s 'https://geo1.xl5.space/api/trips?facility_id=NJ-NJTP&entry=Interchange%209%20&exit=16E&vehicle=car2' -H 'X-API-Key: YOUR_KEY'
{
"data_version": "2026-10-10",
"count": 3,
"trips": [
{
"facility": "New Jersey Turnpike",
"facility_id": "NJ-NJTP",
"direction": "any",
"entry": "Interchange 9 New Brunswick Int.",
"exit": "Interchange 16E RT 3/Secaucus, RT 495/Lincoln Tunnel",
"vehicle_class": "Class 1, 2-axle passenger vehicles",
"payment": "E-ZPass",
"time_band": "all",
"time_window": "all hours, every day",
"amount": 10.29,
"effective": "2026-10-03_observed",
"source": "https://www.njta.gov/document/2026-turnpike-class-1-passenger-cars-2-axles/"
}
],
"count_note": "3 rows matched; the first is shown"
}
Address to place
q: the address or place name; limit: up to 20 (default 5). The United States, Canada, Mexico and Greenland: two geocoders answer together and their lists are merged by rank; if one is down, the other still answers.
curl -s 'https://geo1.xl5.space/api/geocode?q=Trenton,%20NJ&limit=1' -H 'X-API-Key: YOUR_KEY'
{
"results": [
{
"name": "Trenton, Mercer County, New Jersey, United States",
"lat": 40.220307,
"lon": -74.7659,
"kind": "boundary/administrative",
"address": {
"city": "Trenton",
"county": "Mercer County",
"state": "New Jersey",
"ISO3166-2-lvl4": "US-NJ",
"country": "United States",
"country_code": "us"
}
}
]
}
Place to address
lat, lon: the point. The answer is the nearest place either geocoder finds (the United States, Canada, Mexico, Greenland).
curl -s 'https://geo1.xl5.space/api/reverse?lat=40.7549&lon=-73.9840' -H 'X-API-Key: YOUR_KEY'
{
"result": {
"name": "42nd Street-Bryant Park, 6th Avenue, Midtown, Manhattan Community Board 5, Manhattan, New York County, New York, 10110, United States",
"lat": 40.754228,
"lon": -73.984485,
"kind": "railway/platform",
"address": {
"railway": "42nd Street-Bryant Park",
"road": "6th Avenue",
"quarter": "Midtown",
"neighbourhood": "Manhattan Community Board 5",
"suburb": "Manhattan",
"county": "New York County",
"city": "New York",
"state": "New York",
"ISO3166-2-lvl4": "US-NY",
"postcode": "10110",
"country": "United States",
"country_code": "us"
}
}
}
Drive-time matrix
Miles and minutes from every source to every target (at most 2,500 pairs). targets defaults to sources. costing, vehicle and toll_free as for routes. Rows follow sources, columns targets; null where no road connects.
Request
{
"sources": [
"Trenton, NJ",
{
"lat": 40.4862,
"lon": -74.4518
}
],
"targets": [
"Newark, NJ",
"Atlantic City, NJ"
]
}Reply
{
"sources": [
{
"lat": 40.2203074,
"lon": -74.7659,
"name": "Trenton, Mercer County, New Jersey, United States"
},
{
"lat": 40.4862,
"lon": -74.4518
}
],
"targets": [
{
"lat": 40.735657,
"lon": -74.1723667,
"name": "Newark, Essex County, New Jersey, United States"
},
{
"lat": 39.3642852,
"lon": -74.4229351,
"name": "Atlantic City, Atlantic County, New Jersey, United States"
}
],
"miles": [
[
61.1,
76.7
],
[
27.75,
101.76
]
],
"minutes": [
[
66,
87.8
],
[
35.2,
106
]
]
}Reach in N minutes
The area reachable from from within each of minutes (1 to 4 values, each up to 120), as GeoJSON polygons. The page shows the first points of each ring.
Request
{
"from": {
"lat": 40.4862,
"lon": -74.4518
},
"minutes": [
10,
20
]
}Reply
{
"from": {
"lat": 40.4862,
"lon": -74.4518
},
"features": [
{
"properties": {
"fill-opacity": 0.33,
"fillColor": "#bf4040",
"opacity": 0.33,
"fill": "#bf4040",
"fillOpacity": 0.33,
"color": "#bf4040",
"contour": 20,
"metric": "time"
},
"geometry": {
"coordinates": [
[
[
-74.643799,
40.635628
],
[
-74.643851,
40.632148
],
[
-74.641977,
40.632022
],
[
"\u2026"
]
]
],
"type": "Polygon"
},
"type": "Feature"
},
{
"properties": {
"fill-opacity": 0.33,
"fillColor": "#9fbf40",
"opacity": 0.33,
"fill": "#9fbf40",
"fillOpacity": 0.33,
"color": "#9fbf40",
"contour": 10,
"metric": "time"
},
"geometry": {
"coordinates": [
[
[
-74.469799,
40.558317
],
[
-74.470171,
40.556571
],
[
-74.475477,
40.5562
],
[
"\u2026"
]
]
],
"type": "Polygon"
},
"type": "Feature"
}
],
"type": "FeatureCollection"
}Best stop order
3 to 25 stops; the first and last stay in place, the ones between are put in the order that drives least. Each leg comes back as a full {route, tolls} like /api/route, priced at the time the vehicle reaches it from depart. order gives the original index of each stop in visiting order. The page shows each leg's summary and charges only.
Request
{
"stops": [
"Trenton, NJ",
"Atlantic City, NJ",
"Newark, NJ",
"Camden, NJ",
"Trenton, NJ"
],
"depart": "2026-10-14T09:00",
"payment": "ezpass_nj"
}Reply
{
"request_id": "f29c7aff-a533-4d27-a46b-8992da52ea21",
"data_version": "2026-10-10",
"order": [
0,
3,
1,
2,
4
],
"stops": [
{
"lat": 40.2203074,
"lon": -74.7659,
"name": "Trenton, Mercer County, New Jersey, United States"
},
{
"lat": 39.9440874,
"lon": -75.1191932,
"name": "Camden, Camden County, New Jersey, United States"
},
{
"lat": 39.3642852,
"lon": -74.4229351,
"name": "Atlantic City, Atlantic County, New Jersey, United States"
},
{
"lat": 40.735657,
"lon": -74.1723667,
"name": "Newark, Essex County, New Jersey, United States"
},
{
"lat": 40.2203074,
"lon": -74.7659,
"name": "Trenton, Mercer County, New Jersey, United States"
}
],
"summary": {
"miles": 266.56,
"minutes": 285.4,
"tolls_total": 21.82,
"tolls_total_high": 21.82
},
"legs": [
{
"from_stop": 0,
"to_stop": 3,
"route": {
"miles": 35.85,
"minutes": 40.5,
"depart": "2026-10-14T09:00:00-04:00",
"arrive": "2026-10-14T09:40:29-04:00"
},
"tolls": {
"total": 0,
"charges": []
}
},
{
"from_stop": 3,
"to_stop": 1,
"route": {
"miles": 58.77,
"minutes": 59.8,
"depart": "2026-10-14T09:40:29-04:00",
"arrive": "2026-10-14T10:40:18-04:00"
},
"tolls": {
"total": 6.49,
"charges": [
{
"id": "l2c1",
"facility": "Atlantic City Expressway",
"amount": 6.49,
"entry": "Exit 41 Berlin-Cross Keys",
"exit": "Atlantic City (east end)"
}
]
}
},
{
"from_stop": 1,
"to_stop": 2,
"route": {
"miles": 120.48,
"minutes": 122.2,
"depart": "2026-10-14T10:40:18-04:00",
"arrive": "2026-10-14T12:42:33-04:00"
},
"tolls": {
"total": 11.88,
"charges": [
{
"id": "l3c1",
"facility": "Atlantic City Expressway",
"amount": 1.49,
"entry": "Atlantic City (east end)",
"exit": "Exit 7 Garden State Parkway"
},
{
"id": "l3c2",
"facility": "Garden State Parkway",
"amount": 2.25,
"location": "New Gretna NB"
},
{
"id": "l3c3",
"facility": "Garden State Parkway",
"amount": 1.13,
"location": "Toms River"
},
{
"id": "l3c4",
"facility": "Garden State Parkway",
"amount": 2.25,
"location": "Asbury Park NB"
},
{
"id": "l3c5",
"facility": "New Jersey Turnpike",
"amount": 4.76,
"entry": "Interchange 11 Woodbridge Int.",
"exit": "Interchange 15E Newark-Jersey City Int."
}
]
}
},
{
"from_stop": 2,
"to_stop": 4,
"route": {
"miles": 51.45,
"minutes": 62.8,
"depart": "2026-10-14T12:42:33-04:00",
"arrive": "2026-10-14T13:45:22-04:00"
},
"tolls": {
"total": 3.45,
"charges": [
{
"id": "l4c1",
"facility": "New Jersey Turnpike",
"amount": 3.45,
"entry": "Interchange 13A Elizabeth-Newark Airport-Elizabeth Seaport Int.",
"exit": "Interchange 9 New Brunswick Int."
}
]
}
}
]
}Basemap on your map
| address | what |
|---|---|
GET /api/map/style.json?key=… | A complete MapLibre / Mapbox GL style: our streets basemap (OpenMapTiles schema), fonts and icons. Add &tolls=1 for a toll-point layer on top. |
GET /api/map/tiles.json?key=… | TileJSON for the vector tiles, for libraries that take a tile source (OpenLayers, Leaflet with a vector-tile plugin, deck.gl). |
GET /api/tiles/{z}/{x}/{y}.pbf?key=… | The vector tiles, zoom 0 to 14 (higher zooms overzoom the level-14 tiles), all of North America. An empty area answers 204. The addresses that style.json and tiles.json give carry v=, the map version: it changes when the basemap is rebuilt, so cached tiles refresh. |
GET /api/map/tolls.geojson?key=… | Every toll point as GeoJSON, with facility, location and the car price label. |
{
"tilejson": "3.0.0",
"name": "US basemap (OpenMapTiles schema)",
"scheme": "xyz",
"format": "pbf",
"minzoom": 0,
"maxzoom": 14,
"bounds": [
-180,
5.57228,
180,
85.0417699
],
"tiles": [
"https://geo1.xl5.space/api/tiles/{z}/{x}/{y}.pbf?v=19300729122-1791609737479&key=YOUR_KEY"
],
"attribution": "\u00a9 OpenMapTiles \u00a9 OpenStreetMap contributors"
}
MapLibre example
Basemap with toll points, then a priced route drawn on it, tolled stretches in orange:
<link rel="stylesheet" href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css">
<script src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js"></script>
<div id="map" style="height:480px"></div>
<script>
const KEY = 'YOUR_KEY', API = 'https://geo1.xl5.space/api';
const map = new maplibregl.Map({
container: 'map', center: [-74.2, 40.6], zoom: 9,
style: `${API}/map/style.json?tolls=1&key=${KEY}` // our basemap + toll points
});
map.on('load', async () => {
const r = await fetch(`${API}/route`, { method: 'POST',
headers: { 'X-API-Key': KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ from: 'New Brunswick, NJ', to: 'Times Square, New York',
payment: 'ezpass_nj', include: ['geojson'] }) }).then(r => r.json());
map.addSource('trip', { type: 'geojson', data: r.geojson });
map.addLayer({ id: 'route', type: 'line', source: 'trip', filter: ['==', 'kind', 'route'],
paint: { 'line-color': '#1a73e8', 'line-width': 5 } });
map.addLayer({ id: 'tolled', type: 'line', source: 'trip', filter: ['==', 'kind', 'toll_segment'],
paint: { 'line-color': '#d9480f', 'line-width': 5 } });
map.addLayer({ id: 'charges', type: 'circle', source: 'trip', filter: ['==', 'kind', 'charge'],
paint: { 'circle-radius': 7, 'circle-color': '#d9480f' } });
console.log('tolls', r.tolls.total, r.route.steps.map(s => s.instruction));
});
</script>
Vehicles and payments
| vehicle | meaning |
|---|---|
car2 | 2-axle passenger car |
car3 | car + 1-axle trailer (3 axles) |
car4 | car + 2-axle trailer (4 axles) |
truck2 | 2-axle truck / RV (dual tire, over 8 ft) |
bus2 | 2-axle bus |
truck3 | 3-axle truck |
truck4 | 4-axle truck |
truck5 | 5-axle truck |
truck6 | 6+ axle truck |
| payment | meaning |
|---|---|
ezpass_de | E-ZPass, Delaware account |
ezpass_md | E-ZPass, Maryland account |
ezpass_nj | E-ZPass, New Jersey account |
ezpass_ny | E-ZPass, New York account |
ezpass_other | E-ZPass, any other state |
account_xx | a toll transponder account issued in state xx (two-letter code, e.g. account_tx, account_ca, account_pr): accepted in its own state and, for the 20 E-ZPass states, across the E-ZPass network; elsewhere priced at the cash or bill-by-mail rate with a note |
plate | pay-by-plate account |
video | no account: video toll / bill by mail |
cash | cash |
Where a road does not take the chosen payment (for example E-ZPass on the Southern Connector), the charge is priced at the rate that applies instead (cash or bill by mail) and its notes say so. Discounts tied to a home state (NY/NJ E-ZPass at the Port Authority, DE E-ZPass on SR 1, MD E-ZPass at MDTA) follow from the account state in the payment code.
Coverage
| state | status | what is in |
|---|---|---|
| FL | complete | Turnpike, CFX, MDX, Tampa, the county bridges and express lanes (express lanes at the operator's published minimum), from the operators' printed schedules |
| GA | complete | Peach Pass express lanes: charged at the official $0.50 floor when the route enters them (the real price is posted on the sign); I-85 express lanes are not mapped separately and read $0 |
| SC | complete | Southern Connector |
| NC | complete | Triangle Expressway, Monroe Expressway, I-77 and I-485 express lanes (NCTA calculator fares) |
| MD | complete | MDTA bridges and tunnels, JFK Highway, ICC, I-95 Express Toll Lanes (DriveEzMD fares) |
| DE | complete | I-95 Newark, SR 1, US 301, Delaware Memorial Bridge |
| NJ | complete | Turnpike, Parkway, Atlantic City Expressway, Port Authority crossings, Burlington and Cape May county bridges |
| VA | complete | every fixed-rate facility priced, including the Dulles Greenway (rush hour by direction), the Elizabeth River Tunnels and the Jordan Bridge. Express lanes (495, 95, 395, 66 inside and outside the Beltway, 64 in Norfolk and Chesapeake) are optional and priced live by their operators, who publish no amount: each is a notice in tolls.passed[] (express_lanes) with the toll hours and direction in effect, where the route entered and left them, and where to check the live price; never in the total. 66 Inside the Beltway is $0.00 outside its toll hours |
| PA | complete | Turnpike (entry to exit), Turnpike 43, 576, 66 and Toll 376 (per toll point, PTC's own toll calculator), the Delaware River bridges, the Dingmans Ferry Bridge |
| NY | complete | Thruway (six cashless segments entry to exit, fixed-toll gantries, the Gov. Mario M. Cuomo Bridge, truck time bands), MTA bridges and tunnels (all three RFK legs), the Congestion Relief Zone (once per pass; Lincoln, Holland, Queens-Midtown and Hugh L. Carey tunnel credits, entering or exiting), the five Bridge Authority bridges, the Atlantic Beach Bridge. NY E-ZPass account rates (payment ezpass_ny) |
| MA | complete | Massachusetts Turnpike (13 toll zones, priced per zone from MassDOT's own toll calculator for 9 axle classes; MA E-ZPass, out-of-state E-ZPass, Pay By Plate MA), Ted Williams and Sumner/Callahan tunnels, Tobin Bridge |
| ME | complete | Maine Turnpike entry to exit (MTA charts, cash and Maine Turnpike E-ZPass, 8 classes; out-of-state E-ZPass pays cash rates), I-295 Gardiner plaza |
| NH | complete | NH Turnpike System: Hampton, Hooksett, Bedford, Dover, Rochester (NHDOT schedule; NH E-ZPass discount vs posted fare); Mt. Washington Auto Road (per person, priced for the driver) |
| RI | complete | Claiborne Pell Newport Bridge (RITBA, per axle). RIDOT RhodeWorks truck tolls are not collected (court order 2022; restart expected 2027) |
| VT | complete | the private Equinox Sky Line Drive, Mt. Mansfield Auto Toll Road and Burke Mountain Toll Road (car and driver; dated seasons shown as a range) |
| CT | complete | no tolls (CTDOT); a route through Connecticut is toll-free by evidence |
| OH | complete | Ohio Turnpike entry to exit between Tolling Points 49 and 211 plus the Westgate and Eastgate (westbound) barriers (OTIC Schedule of Tolls 2026, every cell checked against OTIC's calculator; E-ZPass, cash/credit, unpaid toll; 7 classes) |
| WV | complete | West Virginia Turnpike (three mainline plazas and North Beckley; cash, WV E-ZPass, non-WV E-ZPass), Memorial Bridge at Parkersburg (all-electronic) |
| KS | complete | Kansas Turnpike, cashless: 21 toll zones from KTA's own calculator data (tag rate for KTAG and listed tags, plate rate twice that); 69Express (US 69) told as optional lanes priced live |
| IN | complete | Indiana Toll Road entry to exit (the operator's calculator, 4,332 answers; cash and E-ZPass, classes 2-7), Cline Avenue Bridge; the St. Francisville bridge is a toll with no published amount |
| KY | complete | RiverLink: Abraham Lincoln (I-65 N), Kennedy (I-65 S) and Lewis and Clark bridges, rate card 7/1/26-6/30/27 (transponder incl. any E-ZPass, account without transponder, pay by mail) |
| LA | complete | LA 1 at Leeville (GeauxPass / toll-by-plate, southbound) and the Lake Pontchartrain Causeway (southbound, tag and cash by axles and height); Belle Chasse tolling suspended |
| MI | complete | Mackinac Bridge (per axle; cash or MacPass, no E-ZPass), Grosse Ile Toll Bridge, Bay City Liberty and Independence bridges; the Ontario crossings are not routable |
| AK | complete | Whittier Tunnel (round trip, paid at Bear Valley toward Whittier) |
| OR | complete | Bridge of the Gods and the Hood River Bridge (BreezeBy or cash / no account) |
| MO | complete | no tolls since April 30, 2024 (Lake of the Ozarks Community Bridge); a route through Missouri is toll-free by evidence |
| AL | complete | Tuscaloosa By-Pass, Montgomery Expressway and Emerald Mountain Expressway bridges (posted rate; Freedom Pass 50 cents off) |
| CA | complete | the seven BATA bridges and the Golden Gate, The Toll Roads (SR 73, 133, 241, 261; by time of day), SR 125 (by trip, incl. Pay-by-Plate), 17-Mile Drive; express lanes told, not charged |
| CO | complete | E-470 (plazas and tolled ramps), Northwest Parkway (mainline and ramps, day / night), Pikes Peak Highway (both seasons); CDOT express lanes told, not charged |
| IA | complete | no tolls on Iowa DOT roads and bridges (Iowa DOT) |
| IL | complete | Illinois Tollway (all plazas; I-PASS / E-ZPass, Pay By Plate, Invoice; trucks day / overnight) and the Chicago Skyway |
| MN | complete | MnDOT E-ZPass express lanes: told during their hours, not charged |
| NV | complete | no tolls on public roads (Nevada DMV) |
| OK | complete | OTA's 13 turnpikes priced by trip, entry plaza to exit plaza (PIKEPASS or PlatePay); plazas placed at their interchanges on ODOT's turnpike map |
| UT | complete | I-15 Express Lanes: told, not charged |
| WA | complete | Tacoma Narrows, SR 520, SR 99 tunnel, SR 509 Expressway (time of day; weekend rate on six holidays); I-405 and SR 167 express lanes told, not charged |
| AZ | complete | no toll roads (ADOT) |
| AR | complete | no toll roads (ARDOT) |
| ID | complete | no toll roads (Idaho Transportation Department) |
| MS | complete | no toll road found (no Mississippi page says it in words; MDOT's toll rule names no facility) |
| MT | complete | no toll road found (no Montana page says it in words; MDT lists none) |
| NE | complete | no toll roads (NDOT); the Plattsmouth Toll Bridge is placed, no official page prints its toll |
| NM | complete | no toll roads (NMDOT) |
| ND | complete | no toll road found (no North Dakota page says it in words; NDDOT lists none) |
| SD | complete | state roads and bridges toll-free (SDDOT, via the Attorney General) |
| TN | complete | no toll roads (TDOT: last one freed in 1926); I-24 Choice Lanes not open |
| WI | complete | no tolls (WisDOT) |
| WY | complete | no toll roads (WYDOT) |
| TX | complete | NTTA, HCTRA and the Houston authorities, TxDOT's toll roads, CTRMA, Toll 49, SH 550, DFW International Parkway and the Mexico bridges (going south); TEXpress, Katy, SH 288, MoPac and METRO lanes told, not charged; San Luis Pass bridge placed, no published toll |
Every state is tested on real routes through this API; the expected amounts come from the operators' own calculators or printed rate tables. A toll the data knows about but cannot price is listed under unpriced, never guessed. Routing, places and the basemap cover North America: the United States, Canada, Mexico and Greenland. Tolls are priced in the United States only; a toll a route meets that the data does not hold (for example the Detroit–Windsor Tunnel) is listed under unpriced.
How tolls are found
The route's road segments (OpenStreetMap way ids) are matched to the toll booths standing on them: a booth counts when the route drives its road and passes within 10 m of it, so a ramp toll is charged only to traffic on that ramp. Each toll point's price is chosen by direction of travel, vehicle, payment and the time the route reaches it. Roads priced from entry to exit take the first and last of their gantries passed as where you got on and off. Express lanes with signed, changing prices are charged at the operator's published floor and say so in notes; where no floor is published (Virginia) they are a notice in passed, never a charge. The API runs the map's own toll code against the same toll pages, so the map and the API always give the same price.
Errors
| status | code | when |
|---|---|---|
| 400 | bad_request | A field is missing or malformed (the reply names it in field). |
| 401 | missing_key / bad_key | No key, or the key is not valid. |
| 403 | origin_not_allowed | The key is limited to certain web sites and the request came from another (browser use). |
| 404 | no_route / not_found / no_place | The router finds no road between the points; no such endpoint; nothing at that point. |
| 405 | method_not_allowed | GET used where POST is needed, or the other way round. |
| 422 | geocode_failed | An address was given and no place matches it. |
| 429 | rate_limited | Over the key's limit for the minute. Retry-After says how many seconds to wait. |
| 502 | router_unavailable / geocoder_unavailable | The routing or geocoding service does not answer; retry later. |
| 503 | toll_data_unavailable | The toll data is not loaded (only while the service starts). |
{
"error": {
"code": "geocode_failed",
"message": "no place found for 'Nwe Brunswik Xq, NJ'",
"field": "from"
}
}
Service status
No key needed. Whether the router and the two geocoders answer (geocoders: us and ca_mx_gl; geocoder is ok only when both are), the basemap version (map_version, also on every tile address as v=), the toll data version, and which pages each state's data comes from (draft: newer pages under review; published).
{
"status": "ok",
"version": "1.0",
"router": "ok",
"geocoder": "ok",
"geocoders": {
"us": "ok",
"ca_mx_gl": "ok"
},
"map_version": "19300729122-1791609737479",
"toll_data": "ok",
"data_version": "2026-10-10",
"states": {
"AK": "published",
"AL": "published",
"AR": "published",
"AZ": "published",
"CA": "published",
"CO": "published",
"CT": "published",
"DE": "published",
"FL": "published",
"GA": "published",
"IA": "published",
"ID": "published",
"IL": "published",
"IN": "published",
"KS": "published",
"KY": "published",
"LA": "published",
"MA": "published",
"MD": "published",
"ME": "published",
"MI": "published",
"MN": "published",
"MO": "published",
"MS": "published",
"MT": "published",
"NC": "published",
"ND": "published",
"NE": "published",
"NH": "published",
"NJ": "published",
"NM": "published",
"NV": "published",
"NY": "published",
"OH": "published",
"OK": "published",
"OR": "published",
"PA": "published",
"RI": "published",
"SC": "published",
"SD": "published",
"TN": "published",
"TX": "published",
"UT": "published",
"VA": "published",
"VT": "published",
"WA": "published",
"WI": "published",
"WV": "published",
"WY": "published"
},
"toll_points": 2066
}