API Reference
A REST API for querying our curated database of 26,000+ low-clearance structures across the United States, United Kingdom and Canada. Filter by vehicle clearance, search by route, radius, state, country or structure ID, and receive results as JSON or map-ready GeoJSON.
Introduction
The Low Clearance Map API exposes the same clearance data that powers our routing products. It’s designed to drop into routing engines, transportation-management systems (TMS), and fleet-safety tools so you can flag height-restricted structures before a vehicle ever reaches them.
Every endpoint is read-only and returns JSON by default. Pass
geojson=true on any bridge endpoint to get a GeoJSON
FeatureCollection you can render directly on a map.
Getting a key takes about a minute. Start a free trial, no sales call required. Bulk database access is licensed annually and is still arranged with us directly — see Plans & access.
Plans & access
Routing endpoints are self-serve and metered by call. Bulk database access is licensed annually, because a single call to /api/all_bridges returns the entire dataset.
| Plan | Price | Included calls | Beyond that |
|---|---|---|---|
| Starter 14-day free trial |
$75 / month | 5,000 / month | $0.015 per call |
| Growth | $250 / month | 20,000 / month | $0.015 per call |
| Data Portal annual |
$3,000 / year | No API | Browse, search and export the full database |
| Scale annual |
$900 / month, billed annually | 100,000 / month | Plus the full database, portal and bulk export |
Starter and Growth are self-serve: start a trial with a card and your key is issued immediately. Data Portal and Scale are annual agreements, so talk to us.
Which endpoints your plan includes
Every plan carries one or both of two scopes. Calling an endpoint outside your
scope returns 403 with "code": "scope_required".
| Endpoint | Scope | Starter / Growth | Scale |
|---|---|---|---|
| Safe Route | routing | Yes | Yes |
| Check Route | routing | Yes | Yes |
| All bridges | database | No | Yes |
| Bridges by state | database | No | Yes |
| Bridges by country | database | No | Yes |
| Bridges by ID | database | No | Yes |
| Within radius | database | No | Yes |
| Along a route | database | No | Yes |
Spend cap
Every metered account has a spend cap, defaulting to three times the monthly fee.
Overage accrues normally below it. At the cap, further calls return
429 until you raise it in
Account settings or the billing period rolls over.
It exists so a runaway loop cannot turn into an invoice you did not expect.
Fair use
Plans also carry an annual ceiling on the number of distinct structures revealed to your account: 2,500 on Starter, 7,500 on Growth, unlimited on Scale. Ordinary routing never approaches this, because vehicles repeat corridors. It exists to stop the API being used to reconstruct the database, which section 2.3 of the terms prohibits.
Authentication
Authenticate every request by sending your key in the X-Api-Secret HTTP header. Keys are issued per account and scoped to your plan. Keep them secret and never expose them in client-side code.
Requests without a valid key receive 403 Forbidden. A valid key
calling an endpoint outside your plan also receives 403, with
"code": "scope_required" in the body naming the scope you need.
See Plans & access.
Lost a key? Rotate it from Account settings → API access. Keys are stored hashed, so we cannot show you an existing key again.
X-Api-Secret: YOUR_API_KEY
Base URL & requests
All endpoints are served from a single base URL over HTTPS:
https://lowclearancemap.com
Bridge lookups use GET with query-string parameters. The Safe Route
endpoint uses POST with a JSON body. When a parameter value contains
JSON (for example a clearance range), URL-encode it before adding it to the
query string.
curl "https://lowclearancemap.com/api/all_bridges?vehicle_clearance=13.5" \
-H "X-Api-Secret: YOUR_API_KEY"
Clearance filtering
Every bridge endpoint accepts a required vehicle_clearance parameter that filters results to the structures relevant to your vehicle. It accepts two forms:
Single value
A number (in feet) representing your maximum vehicle clearance. Returns every structure at or below that height.
Min / max range
A JSON object with min and/or max keys, URL-encoded. Useful for narrowing to a band of clearances.
Add the parameter to the request URL's query string. When the value is JSON (a clearance range), URL-encode it first. Most HTTP clients and language libraries do this for you.
# add to the request URL:
?vehicle_clearance=13.5
# readable JSON value:
?vehicle_clearance={"min":10,"max":15}
# URL-encoded (what you send):
?vehicle_clearance=%7B%22min%22%3A10%2C%22max%22%3A15%7D
Structure annotations
Structures carry eight annotation fields that describe the physical
form of the obstruction and how its clearance was verified against
imagery. Fields that do not apply to a particular structure are
returned as null, e.g. posted_raw when no
height sign is posted, or clearance_max_in when the
opening is uniform.
Annotations are off by default so existing integrations are unaffected.
Add verbose=true to any JSON bridge endpoint
(All bridges, by state,
by country, by ID,
within radius) to receive them.
Fields
| Field | Description |
|---|---|
| structure_type | string The kind of overhead structure. One of BR bridge / overpass, TRU truss, TUN tunnel, CVB covered bridge, OBS other overhead obstruction (sign gantry, pipe rack, low cable), OTH other / unclassifiable. |
| carries | string What sits on top of the structure. One of ROAD, RAIL, PED pedestrian or bike only, MIX multiple or other, N/A nothing carried (tunnels, covered bridges, trusses). |
| clearance_var | string How clearance varies across the opening, which tells a router where the opening is lowest. One of UNI uniform, ARC arched with a higher center and lower edges, SLP sloped with one side lower than the other, STEP stepped or physically separate spans with different heights. |
| posted | stringY if a height sign is visible on the structure, otherwise N. |
| posted_raw | string The sign value exactly as posted, e.g. 12'-6" or 3.8m. Null when posted is N. |
| clearance_min_in | integer The controlling (lowest) clearance across the opening, in inches. This is the number a router should use. |
| clearance_max_in | integer The highest clearance across the opening, in inches. Only populated when clearance_var is not UNI. |
| confidence | string Curation confidence for the annotation. One of OK, REVISIT (queued for re-check), CANT_DETERMINE (imagery insufficient). |
curl "https://lowclearancemap.com/api/bridges_by_id?structure_ids=5&verbose=true" \
-H "X-Api-Secret: YOUR_API_KEY"
{
"bridges": [{
"Structure_ID": 5,
"Name": "WV61 CR72 US60 KAN R CSX",
"Latitude": 38.3007621,
"Longitude": -81.5564591,
"Country": "United States",
"State": "WV",
"Clearance": 13.5,
"structure_type": "BR",
"carries": "ROAD",
"clearance_var": "UNI",
"posted": "Y",
"posted_raw": "13 6",
"clearance_min_in": 162,
"clearance_max_in": null,
"confidence": "OK"
}]
}
Response format
By default, responses are JSON objects containing metadata plus a
bridges array. Each bridge includes its identifier, name,
coordinates, country, state and clearance. Add
verbose=true to any JSON bridge endpoint to also receive
the structure annotation fields.
Add geojson=true to receive a GeoJSON
FeatureCollection instead. Each hazard heading becomes a
LineString feature, ready to drop onto a Mapbox or Leaflet map.
{
"type": "Feature",
"properties": {
"Name": "CR 1 SLS",
"State": "WV",
"Clearance": 13.5,
"Feature_Type": "all_bridges"
},
"geometry": {
"type": "LineString",
"coordinates": [[-77.89, 39.38], [-77.89, 39.40]]
}
}
Errors
The API uses conventional HTTP status codes. Error responses include a JSON error message.
Safe Route POST
Safe Route is our flagship endpoint: the routing engine behind the Low Clearance Map web app and Headroom Turn-by-Turn navigation. It runs the exact same clearance-aware routing our own products rely on.
Given a start, an end, and your vehicle’s height, plus optional weight, length and
width, it returns a complete, turn-by-turn route that routes around every
structure your vehicle can’t safely clear, so a driver is never sent under a
too-low bridge. Start and end points accept either coordinates
({"lat","lng"}) or a street address ({"address": "…"}).
Send a JSON body with a Content-Type: application/json header. Set
geojson: true to get the route back as a map-ready
GeoJSON FeatureCollection; the response also reports how many
low-clearance hazards were avoided.
Body parameters
| Field | Description |
|---|---|
| start required | object{"lat","lng"} or {"address": "…"}. |
| end required | object{"lat","lng"} or {"address": "…"}. |
| clearance_feet required | number Vehicle height, feet component. |
| clearance_inches optional | number Vehicle height, inches component. |
| vehicle_weight_lbs optional | number Defaults to 80000. |
| vehicle_length_ft optional | number Defaults to 53. |
| vehicle_width_ft optional | number Passed to routing if provided. |
| geojson optional | boolean Return the route as GeoJSON. |
curl -X POST "https://lowclearancemap.com/api/saferoute" \
-H "X-Api-Secret: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"start": {"lat": 40.7, "lng": -73.9},
"end": {"lat": 42.36, "lng": -71.06},
"clearance_feet": 12,
"clearance_inches": 6,
"geojson": true
}'
{
"route": { "type": "FeatureCollection", "features": [ /* … */ ] },
"hazards_avoided": 3
}
Check Route POST
Already have a route? Check Route audits a route you already have (for example the geometry returned by Google Maps, HERE, or Mapbox Directions) against your vehicle’s clearance, and tells you whether it is safe. If it isn’t, every low-clearance structure that lies on the route is listed.
Unlike Safe Route, this endpoint does not build a route or suggest an alternative; it only validates the geometry you supply. Use Safe Route to generate a clearance-aware route; use Check Route to verify a route that came from somewhere else.
Send a JSON body with a Content-Type: application/json header. The
route geometry goes in route and may be an encoded
polyline (Google / Mapbox, precision 5 or 6), a HERE flexible polyline, a GeoJSON
LineString, a list of [lng, lat] pairs, or a list of
{"lat","lng"} objects. A bridge is only flagged when the route
actually travels through it in a hazardous direction.
Body parameters
| Field | Description |
|---|---|
| route required | string | array | object The route geometry to audit. Aliases geometry, polyline, linestring, coordinates are also accepted. |
| geometry_format optional | stringauto (default), polyline, polyline6, flexible, geojson, or coordinates. auto tries standard polyline, then precision 6, then HERE flexible. |
| coordinate_order optional | string Order of raw numeric pairs: lnglat (default, GeoJSON) or latlng. |
| clearance_feet required | number Vehicle height, feet component (combine with clearance_inches). |
| clearance_inches optional | number Vehicle height, inches component. |
| vehicle_clearance optional | number Vehicle height in decimal feet, an alternative to clearance_feet/clearance_inches. |
| on_route_m optional | number How close (meters) a structure must be to count as on-route. Defaults to 25. |
| heading_tol optional | number Travel-heading match tolerance in degrees. Defaults to 20. |
curl -X POST "https://lowclearancemap.com/api/check_route" \
-H "X-Api-Secret: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"route": "izpdFn~xtMhA}A",
"geometry_format": "polyline",
"clearance_feet": 11,
"clearance_inches": 6
}'
{
"status": "ok",
"safe": false,
"vehicle_clearance_ft": 11.5,
"route_points": 182,
"hazard_count": 1,
"hazards": [ {
"structure_id": "15999",
"name": "Main St Underpass",
"lat": 34.052235, "lng": -118.243683,
"clearance": 10.5,
"state": "CA", "country": "USA",
"distance_m": 1200, "distance_km": 1.2
} ],
"message": "Route is NOT safe: 1 low-clearance hazard(s) detected for a 11.5 ft vehicle."
}
When the route is clear, safe is true,
hazards is an empty array, and hazard_count is
0.
All bridges GET
Returns every structure in the database that matches the supplied clearance filter.
Query parameters
| Parameter | Description |
|---|---|
| vehicle_clearance required | number | json Maximum vehicle clearance, or a URL-encoded {"min","max"} range. See Clearance filtering. |
| geojson optional | boolean Set to true for GeoJSON output. Defaults to false. |
| verbose optional | boolean Set to true to include the eight structure annotation fields on each bridge. Works with both JSON and GeoJSON output. Defaults to false. |
curl "https://lowclearancemap.com/api/all_bridges?vehicle_clearance=13.5" \
-H "X-Api-Secret: YOUR_API_KEY"
{
"number_of_bridges": 2,
"vehicle_clearance": { "max_clearance": 13.5 },
"bridges": [
{ "Name": "Bridge 1", "Latitude": 34.0522,
"Longitude": -118.2437, "Clearance": 13.5 }
]
}
Bridges by state GET
Returns low-clearance structures in one or more U.S. states (or U.K./Canadian regions), filtered by clearance.
Query parameters
| Parameter | Description |
|---|---|
| states required | string Comma-separated state/region codes, e.g. CA,NY. |
| vehicle_clearance required | number | json See Clearance filtering. |
| geojson optional | boolean Set to true for GeoJSON output. |
| verbose optional | boolean Set to true to include the eight structure annotation fields on each bridge. Works with both JSON and GeoJSON output. Defaults to false. |
curl "https://lowclearancemap.com/api/bridges_by_state?states=CA,NY&vehicle_clearance=13.5" \
-H "X-Api-Secret: YOUR_API_KEY"
{
"states_given": ["CA", "NY"],
"number_of_bridges": 2,
"bridges": [
{ "Name": "Bridge 1", "Clearance": 13.5 },
{ "Name": "Bridge 2", "Clearance": 13.0 }
]
}
Bridges by country GET
Returns low-clearance structures in one or more countries, filtered by clearance.
Query parameters
| Parameter | Description |
|---|---|
| countries required | string Comma-separated country names, e.g. United States,Canada. |
| vehicle_clearance required | number | json See Clearance filtering. |
| geojson optional | boolean Set to true for GeoJSON output. |
| verbose optional | boolean Set to true to include the eight structure annotation fields on each bridge. Works with both JSON and GeoJSON output. Defaults to false. |
curl "https://lowclearancemap.com/api/bridges_by_country?countries=United%20States,Canada&vehicle_clearance=13.5" \
-H "X-Api-Secret: YOUR_API_KEY"
{
"countries_given": ["United States", "Canada"],
"number_of_bridges": 2,
"bridges": [ /* … */ ]
}
Bridges by ID GET
Looks up specific structures by their Structure_ID. Pass IDs as a comma-separated list, or repeat the parameter. Unknown IDs are returned in an invalid_ids array.
Query parameters
| Parameter | Description |
|---|---|
| structure_ids required | string | array e.g. 1799,15999 or repeated structure_ids=1799&structure_ids=15999. |
| geojson optional | boolean Set to true for GeoJSON output. |
| verbose optional | boolean Set to true to include the eight structure annotation fields on each bridge. Works with both JSON and GeoJSON output. Defaults to false. |
curl "https://lowclearancemap.com/api/bridges_by_id?structure_ids=1799,15999,16002" \
-H "X-Api-Secret: YOUR_API_KEY"
{
"number_of_bridges": 2,
"bridges": [ /* … */ ],
"invalid_ids": ["16002"]
}
Bridges within radius GET
Returns structures within a given radius of a point, filtered by clearance.
Query parameters
| Parameter | Description |
|---|---|
| latitude required | number Latitude of the center point. |
| longitude required | number Longitude of the center point. |
| radius required | number Search radius in kilometers. |
| vehicle_clearance required | number | json See Clearance filtering. |
| geojson optional | boolean Set to true for GeoJSON output. |
| verbose optional | boolean Set to true to include the eight structure annotation fields on each bridge. Works with both JSON and GeoJSON output. Defaults to false. |
curl "https://lowclearancemap.com/api/bridges_within_radius?latitude=34.0522&longitude=-118.2437&radius=10&vehicle_clearance=13.5" \
-H "X-Api-Secret: YOUR_API_KEY"
{
"center": [34.0522, -118.2437],
"radius": 10,
"number_of_bridges": 1,
"bridges": [ /* … */ ]
}
Bridges along a route GET
Returns structures that fall on a route between two points, plus those within ~50 miles of the route corridor. The response separates the two sets.
Query parameters
| Parameter | Description |
|---|---|
| start_latitude required | number Latitude of the route start. |
| start_longitude required | number Longitude of the route start. |
| end_latitude required | number Latitude of the route end. |
| end_longitude required | number Longitude of the route end. |
| vehicle_clearance required | number | json See Clearance filtering. |
| geojson optional | boolean Set to true for GeoJSON output. |
curl "https://lowclearancemap.com/api/bridges_along_route?start_latitude=34.0522&start_longitude=-118.2437&end_latitude=36.1699&end_longitude=-115.1398&vehicle_clearance=13.5" \
-H "X-Api-Secret: YOUR_API_KEY"
{
"number_of_bridges_on_route": 1,
"number_of_bridges_50_miles_along_route": 1,
"bridges_on_route": [ /* … */ ],
"bridges_50miles_along_route": [ /* … */ ]
}
Rate limits & support
Requests are rate limited per key: 10 per second on Starter, 25 on Growth,
60 on Scale. Exceeding it returns 429 Too Many Requests with a
Retry-After header. Back off and retry rather than hammering.
A 429 can mean one of three things, and the code field
in the body says which: rate_limited (too fast, retry shortly),
spend_cap_reached (raise the cap in settings), or
allowance_exhausted (trial used up, add a plan).
A refused request is always refused outright. We never return a route with
hazards omitted because a limit was hit, so a 200 is always a
complete answer.
Need more than Scale, or bulk data access? Email info@lowclearancemap.com. Prefer the no-code route? The Database Portal gives you the same data as downloadable CSV, Excel and JSON.
Manage keys, usage and billing in Account settings → API access. Your use of the API is governed by the API Terms of Service.