map

Exact counts and nameless pins along one route, its legs and its stops

Changed on

Who is registered along a route: within a corridor either side of a line, within a radius of each stop, or both. The answer is exact, never an estimate and never partial.

Send the line as one of path (a GeoJSON LineString, or [[lng, lat], …]), points ([[lng, lat], …]) or polyline (an encoded polyline: precision 5 for Google Directions overview_polyline, 6 for Mapbox Directions geometry: polyline6). Without a line, two or more stops are joined by straight lines.

The answer counts people per leg (between two stops) and per stop, places every pin on the route (distanceMiles, leg, alongMiles) and next to its nearest stop (nearestStop, stopDistanceFeet). People mapped only to a ZIP code, city or county are counted separately under approximate and never in total. A route answer never carries a name, on any plan; for a labelled map, request a viewport at zoom 15 or closer. The record behind a pin opens with GET /v1/map/records/{markerId}.

Billing. A route is billed as route units, each one map request: ceil(corridor miles) × width factor when the corridor is measured (×1 up to a 0.25-mile corridor) plus ceil(stops / 10) when stop radii are measured, at least 1. A 17.42-mile bus route with a 0.1-mile corridor and 35 stops at 1,000 feet is 18 + 4 = 22 units. detail=count costs the same. A 304, test mode and any error response are free.

Never partial. More than 300 pins with detail=full is 422 route_too_many_people with the exact counts and nothing charged; a route through more addresses than one call counts exactly is 422 route_too_dense; a read that fails is 503 with no result and nothing charged.

Caching. Cache-Control: private, max-age=300 and an ETag. Send it back in If-None-Match: the same route asked again answers 304, free.

Auth. A secret API key, or a map browser key (os_map_pk_…) from a site on its list. A browser key must send X-End-User.

post/v1/map/route

Request

  • Base URL: https://api.offendersearch.app
  • URL: https://api.offendersearch.app/v1/map/route
  • Auth: API key in header X-API-Key

Headers

X-End-Userstring

Any id you use for the end user behind this request. The daily area budget is then also counted per end user (2,000 distinct areas a day), so one heavy user is limited before the account is; on the route routes, so is the number of different routes a day, and on the records route the daily open limit when one is set. Optional with a secret key; required on the route routes with a map browser key (422 end_user_required).

If-None-Matchstring

The ETag from an earlier answer for the same view. An unchanged view answers 304 with no body and is not billed.

Request body

polylinestring

The line as an encoded polyline: Google Directions overview_polyline.points, or a Mapbox, OSRM or Valhalla polyline6 geometry.

polylinePrecision5 | 6

5 for Google, 6 for Mapbox, OSRM and Valhalla.

profile'walk' | 'bus'

Sets the limits and the default stop radius: walk 15 miles, 50 stops, 500 feet; bus 60 miles, 150 stops, 1,000 feet.

measure'corridor' | 'stops' | 'both'

What is counted. Left out: both when stopRadiusFeet is sent (or stops when there is no line), otherwise corridor.

corridorMilesnumber

The distance either side of the line, in miles.

stopRadiusFeetnumber

The radius around each stop, in feet. Left out: 500 for walk, 1,000 for bus.

parcelAllowanceFeetnumber

Feet added to the stop radius, for the distance between a geocoded address point and its property line.

detail'full' | 'count'

full for counts and pins, count for counts only. The same price.

format'json' | 'geojson'

geojson answers a single route as a FeatureCollection.

precision'street' | 'any'

street leaves out the people counted under approximate.

sandboxboolean

true answers in test mode.

externalIdstring

Your own id for the route, echoed in the answer.

Response

The answer for this route.

routeIndexinteger

In a POST /v1/map/routes answer only: the route's position in the request, from 0.

shape'route'
profile'walk' | 'bus'
measure'corridor' | 'stops' | 'both'
detail'full' | 'count'
datasetVersionstring date
completeboolean

Always true: a route is answered whole or refused.

lengthMilesnumber
corridorMilesnumber nullable

null when the corridor is not measured.

stopRadiusFeetnumber nullable

null when stops are not measured.

parcelAllowanceFeetnumber nullable

null when stops are not measured.

unitsinteger

Route units: the map requests this route is billed as.

tilesReadinteger

Zoom-14 map tiles the route touches.

totalinteger

Distinct people with a street address in the corridor or a stop's reach.

corridorTotalinteger nullable

People in the corridor. null when it is not measured.

stopsTotalinteger nullable

People within reach of any stop. null when stops are not measured.

externalIdstring

Your externalId, when sent.

sandboxboolean

Present and true on a test-mode answer.

noticestring
routeNoticestring

How distances and counts are measured, as a sentence to show.

Example response

{
  "datasetVersion": "2026-10-18",
  "approximate": {
    "areas": [
      {
        "place": "43215"
      }
    ]
  },
  "unplaced": {
    "states": [
      "OH"
    ]
  },
  "notice": "A pin shows a registered address, not a person's current location."
}

Changes