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.

Status 2026-10-10. The API answers at 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

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

Route with tolls

POST/api/route

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

fieldtyperequiredmeaning
fromplaceyesStart: a place: {"lat": 40.4862, "lon": -74.4518}, [lon, lat], or an address / place name (looked up with the geocoder).
toplaceyesDestination, same forms.
viaarray of placesnoPoints the route must pass through, in order (at most 20). The route stays one leg.
departstringnoDeparture, Eastern time, YYYY-MM-DDTHH:MM (a time with Z or an offset is taken as written). Decides peak / off-peak prices. Default: now.
returnstringnoReturn departure. When given, the reply carries return: the route back with its own steps and tolls.
vehiclestringnoVehicle code (see codes). Default car2. Trucks and RVs are routed with truck costing.
paymentstringnoHow the driver pays. Default ezpass_other.
toll_freebooleannotrue asks the router to avoid toll roads. Default false: the best route, express lanes included.
costingstringnoauto or truck; set from vehicle when left out.
includearrayno"rates": every published row behind each charge. "geojson": the whole answer as a GeoJSON FeatureCollection, ready for your map.

Reply fields

fieldmeaning
request_idId of this answer (also the X-Request-Id header).
data_versionDate of the toll data used.
placesThe resolved from, to, via, with the geocoder's name when an address was given.
route.miles, route.minutesLength and driving time.
route.depart, route.arriveEastern time, with offset.
route.polyline6The 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.totalTotal 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.
returnPresent when return was asked: {route, tolls} of the trip back. Its charge ids start with r.
geojsonWith 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:

fieldmeaning
nStep number.
type, type_codeThe 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.
instructionThe written instruction.
voice.alert, voice.pre, voice.post, voice.succinctSpoken prompts: alert well before the turn, pre at the turn, post after it ("Continue for 2 miles."), succinct a short form.
signWhat 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_streetsStreet names on the step, and at its start when they differ.
at{lat, lon} of the maneuver point.
bearing_before, bearing_afterHeading 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, minutesLength and time of the step.
depart_atClock time (Eastern) the vehicle starts the step.
highway, tollThe step is on a highway / a toll road.
travel_modedrive (or ferry on a ferry step).
roundabout_exitWhich exit to take, on roundabout steps.
tollsIds 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:

fieldmeaning
idc1, c2, … (r1… on the return).
kindpoint: 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_idWhere, by the operator's own names.
location, point_id, headingpoint: the collection point and the direction of travel there.
entry, exit, entry_point_id, exit_point_id, direction, gantriestrip: the fare table's entry and exit, and the gantries passed.
mile, at, position, shape_indexWhere 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_indextrip: where the trip ends.
amount, amount_highThe price; amount_high only when two rows could apply.
payment, vehicle_class, per_axleThe payment and vehicle class exactly as the operator prints them; per_axle when the rate is per axle.
time_band, time_windowWhich price band was in force at at (peak, off-peak, all, dynamic) and its window as published.
effective, sourceWhen the rate took effect (or was observed), and the operator's document it comes from.
other_linesOther rows that also apply (e.g. two payment rows), when there are any.
notesAnything to know: dynamic express-lane floor, direction not stated by the operator, transponder not accepted (priced at cash / bill by mail).
ratesWith include: ["rates"]: every published row of this point or trip.

Price your own route

POST/api/price

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

fieldtyperequiredmeaning
linepolyline6 string, array of [lon, lat], or a GeoJSON LineStringyesThe 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.
timesarraynoOne 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.
departstringnoDeparture, when times is not given. Default: now.
vehicle, payment, costingstringnoAs for /api/route.
includearrayno"rates", "geojson", and "steps" (turn-by-turn for the matched line).

Reply fields

fieldmeaning
matched.miles, matched.minutes, matched.polyline6, matched.pointsThe 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.
tollsAs 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

GET/api/tolls

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

GET/api/trips

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

GET/api/geocode

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

GET/api/reverse

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

POST/api/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

POST/api/isochrone

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

POST/api/optimize

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

addresswhat
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

vehiclemeaning
car22-axle passenger car
car3car + 1-axle trailer (3 axles)
car4car + 2-axle trailer (4 axles)
truck22-axle truck / RV (dual tire, over 8 ft)
bus22-axle bus
truck33-axle truck
truck44-axle truck
truck55-axle truck
truck66+ axle truck
paymentmeaning
ezpass_deE-ZPass, Delaware account
ezpass_mdE-ZPass, Maryland account
ezpass_njE-ZPass, New Jersey account
ezpass_nyE-ZPass, New York account
ezpass_otherE-ZPass, any other state
account_xxa 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
platepay-by-plate account
videono account: video toll / bill by mail
cashcash

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

statestatuswhat is in
FLcompleteTurnpike, CFX, MDX, Tampa, the county bridges and express lanes (express lanes at the operator's published minimum), from the operators' printed schedules
GAcompletePeach 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
SCcompleteSouthern Connector
NCcompleteTriangle Expressway, Monroe Expressway, I-77 and I-485 express lanes (NCTA calculator fares)
MDcompleteMDTA bridges and tunnels, JFK Highway, ICC, I-95 Express Toll Lanes (DriveEzMD fares)
DEcompleteI-95 Newark, SR 1, US 301, Delaware Memorial Bridge
NJcompleteTurnpike, Parkway, Atlantic City Expressway, Port Authority crossings, Burlington and Cape May county bridges
VAcompleteevery 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
PAcompleteTurnpike (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
NYcompleteThruway (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)
MAcompleteMassachusetts 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
MEcompleteMaine 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
NHcompleteNH 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)
RIcompleteClaiborne Pell Newport Bridge (RITBA, per axle). RIDOT RhodeWorks truck tolls are not collected (court order 2022; restart expected 2027)
VTcompletethe private Equinox Sky Line Drive, Mt. Mansfield Auto Toll Road and Burke Mountain Toll Road (car and driver; dated seasons shown as a range)
CTcompleteno tolls (CTDOT); a route through Connecticut is toll-free by evidence
OHcompleteOhio 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)
WVcompleteWest Virginia Turnpike (three mainline plazas and North Beckley; cash, WV E-ZPass, non-WV E-ZPass), Memorial Bridge at Parkersburg (all-electronic)
KScompleteKansas 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
INcompleteIndiana 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
KYcompleteRiverLink: 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)
LAcompleteLA 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
MIcompleteMackinac 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
AKcompleteWhittier Tunnel (round trip, paid at Bear Valley toward Whittier)
ORcompleteBridge of the Gods and the Hood River Bridge (BreezeBy or cash / no account)
MOcompleteno tolls since April 30, 2024 (Lake of the Ozarks Community Bridge); a route through Missouri is toll-free by evidence
ALcompleteTuscaloosa By-Pass, Montgomery Expressway and Emerald Mountain Expressway bridges (posted rate; Freedom Pass 50 cents off)
CAcompletethe 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
COcompleteE-470 (plazas and tolled ramps), Northwest Parkway (mainline and ramps, day / night), Pikes Peak Highway (both seasons); CDOT express lanes told, not charged
IAcompleteno tolls on Iowa DOT roads and bridges (Iowa DOT)
ILcompleteIllinois Tollway (all plazas; I-PASS / E-ZPass, Pay By Plate, Invoice; trucks day / overnight) and the Chicago Skyway
MNcompleteMnDOT E-ZPass express lanes: told during their hours, not charged
NVcompleteno tolls on public roads (Nevada DMV)
OKcompleteOTA's 13 turnpikes priced by trip, entry plaza to exit plaza (PIKEPASS or PlatePay); plazas placed at their interchanges on ODOT's turnpike map
UTcompleteI-15 Express Lanes: told, not charged
WAcompleteTacoma 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
AZcompleteno toll roads (ADOT)
ARcompleteno toll roads (ARDOT)
IDcompleteno toll roads (Idaho Transportation Department)
MScompleteno toll road found (no Mississippi page says it in words; MDOT's toll rule names no facility)
MTcompleteno toll road found (no Montana page says it in words; MDT lists none)
NEcompleteno toll roads (NDOT); the Plattsmouth Toll Bridge is placed, no official page prints its toll
NMcompleteno toll roads (NMDOT)
NDcompleteno toll road found (no North Dakota page says it in words; NDDOT lists none)
SDcompletestate roads and bridges toll-free (SDDOT, via the Attorney General)
TNcompleteno toll roads (TDOT: last one freed in 1926); I-24 Choice Lanes not open
WIcompleteno tolls (WisDOT)
WYcompleteno toll roads (WYDOT)
TXcompleteNTTA, 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

statuscodewhen
400bad_requestA field is missing or malformed (the reply names it in field).
401missing_key / bad_keyNo key, or the key is not valid.
403origin_not_allowedThe key is limited to certain web sites and the request came from another (browser use).
404no_route / not_found / no_placeThe router finds no road between the points; no such endpoint; nothing at that point.
405method_not_allowedGET used where POST is needed, or the other way round.
422geocode_failedAn address was given and no place matches it.
429rate_limitedOver the key's limit for the minute. Retry-After says how many seconds to wait.
502router_unavailable / geocoder_unavailableThe routing or geocoding service does not answer; retry later.
503toll_data_unavailableThe 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

GET/api/health

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
}