OffenderSearch
Map API · bus stops · walking routes

Sex Offender Route API for Bus Stops and Routes

Send a route and its stops. Get exact counts of registered sex offenders per stop and per leg, with nameless pins, across 58 US registries.

  • Exact counts, never partial
  • No names in a route answer
  • Free test mode
SCHOOLPARKMaple StOak StreetElm StPine St1st Ave2nd AveMain Street4th Ave1234521

How the sex offender route API works. Stops, the line between them, a corridor along it and a radius around each stop. One call answers all four.

stops

The stops, in order

Send each stop as an id and a point, in route order: up to 150 on a bus route, 50 on a walk. Use your own stop numbers as ids and your run number as externalId; the answer comes back in your terms.

polyline

The line between them

Send the line your routing tool already gives you: an encoded polyline (precision 5 for Google Directions, 6 for Mapbox, OSRM or Valhalla), a GeoJSON LineString or a list of points. Without one, the stops are joined by straight lines. Up to 60 miles on a bus route, 15 on a walk.

corridorMiles

A corridor along the line

Everyone with a registered street address within 0.1 miles either side of the line, by default, up to 0.25. Each person is counted on the leg nearest to them, so the leg counts add up to the corridor total.

stopRadiusFeet

A radius around each stop

A circle around every stop: 1,000 feet by default on a bus route, 500 on a walk, anywhere up to 2,640. Add a parcel allowance when your policy measures from the property line rather than the address point.

Measure the corridor, the stops, or both

measure picks what is counted: corridor for a walk or a whole route, stops for bus-stop checks, or both. Every answer is the same shape, so one parser handles all three.

Distances run from each registered address to the line and to the nearest stop. A pin shows a registered address, not a person's current location.

Path formats: polylines, GeoJSON and points ›
POST /v1/map/routetest mode
curl -X POST https://api.offendersearch.app/v1/map/route \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "profile": "bus",
    "polyline": "o|{rFnuqyN_v@oi@o}@g^",
    "stops": [
      {"id": "12-01", "lng": -82.9988, "lat": 39.9612},
      {"id": "12-02", "lng": -82.9920, "lat": 39.9700},
      {"id": "12-03", "lng": -82.9870, "lat": 39.9800}
    ],
    "measure": "both",
    "corridorMiles": 0.1,
    "stopRadiusFeet": 1000,
    "externalId": "route-12-AM",
    "sandbox": true
  }'

Sex offender counts per bus stop and per leg. Exact numbers, nameless pins, the record on tap.

  • total · distinct people in the corridor or within a stop’s reach.
  • legs[] · a count for each stretch between two stops; they add up to corridorTotal.
  • stops[] · a count for each stop, the nearest distance in feet and the marker ids within reach.
  • markers[] · a position for each person, how far from the line and the nearest stop, and how exact the position is. No names.
  • approximate · people mapped only to a ZIP code, city or county, counted apart and never in total.

Never partial: a route too dense to answer in full is refused with its exact counts, and nothing is charged. Open the record behind any pin with GET /v1/map/records/{markerId}, one record open each. Marker ids work for 24 hours.

Never partial: refusals and what to do ›
POST /v1/map/route
{
  "shape": "route", "profile": "bus", "measure": "both",
  "complete": true, "lengthMiles": 17.42,
  "corridorMiles": 0.1, "stopRadiusFeet": 1000,
  "units": 22,
  "total": 9, "corridorTotal": 7, "stopsTotal": 4,
  "legs": [
    { "leg": 1, "fromStop": "12-01", "toStop": "12-02",
      "lengthMiles": 0.61, "count": 1 }, …
  ],
  "stops": [
    { "stopId": "12-02", "alongMiles": 0.61, "count": 2,
      "nearestFeet": 410, "markerIds": ["mk_7Qe…", "mk_c2L…"] }, …
  ],
  "markers": [
    { "id": "mk_7Qe…", "lat": 39.9701, "lng": -82.9917,
      "precision": "street", "addressType": "home",
      "distanceMiles": 0.04, "leg": 1, "alongMiles": 0.58,
      "nearestStop": "12-02", "stopDistanceFeet": 410 }, …
  ],
  "approximate": { "count": 1, "areas": [ … ] },
  "externalId": "route-12-AM",
  "notice": "A pin shows a registered address, not a person's current location."
}
200 OK· 22 route units · sample

School bus stop sex offender check. From the stop list to the letter home, for a whole district.

South Carolina § 23-3-535(F) asks each school district, at the start of the school year, to give the parents of bus riders the names and addresses of registered sex offenders who live within 1,000 feet of their child’s stop, or to post a link to the registry on the district’s website.

The route API returns, for each stop, how many people have a registered address within the radius you set, and the marker ids behind them. The records opened from those ids carry the names and addresses a letter names. It supports the district’s notice process; it is not a legal determination, and the district decides what it sends.

The bus stop notices guide ›
  1. Send every run. One route per run with "profile": "bus", "measure": "stops" and "stopRadiusFeet": 1000, up to 50 runs in one batch call.
  2. Read the counts. Each stop comes back under your own stop id with its count and the nearest distance in feet. A batch is all or nothing: one refused route names itself in routeIndex, and nothing is billed.
  3. Open only what a letter names. Open each marker id in a stop’s reach once, at $0.035 per record. A person near two stops in the same answer is opened once.
  4. Keep the reference. Store each record’s recordRef for your file, not the marker id.
  5. Word it plainly. Distances run from the geocoded registered address to the stop point. It shows registered addresses, not where anyone is. People mapped only to a ZIP code or city are listed under approximate; say so rather than leave them out.

Sex offender route API for school transport and mapping platforms. Built for software that carries many users: a browser key, a header per user, a count first.

School bus routing software

Check every stop of every run as routes are planned or changed, and show a per-stop count beside the stop in your planner.

School districts

Run the whole stop list before the school year in a few batch calls, and open records only for the notices you send.

Transit agencies

Count registered addresses around school-day stops and along routes that carry students, per stop and per leg.

Walking-route and community apps

Let families draw a walk to school or a trick-or-treat loop, show the count along it, and open a record when a pin is tapped.

Mapping platforms

Add a route layer to your own map: nameless pins positioned on the route, with distances along it and from the nearest stop.

Browser key

Call it from your own site

A map browser key (os_map_pk_…) works only from the sites you list for it and only on the map routes. From a phone app, call through your server with your secret key.

X-End-User

Limits for each of your users

Send any stable id for the person behind the call. It is required on route calls made with a browser key. Each person may check 20 different routes a day by default, so one heavy user is stopped before your account is.

detail=count

Count first, open on tap

Show the count with detail=count (the same price, no pins), draw pins when the user asks, and open a record only when a pin is tapped. Send If-None-Match: an unchanged route answers 304, free.

Keys, caching and per-user limits: platform integration. A family walking app, step by step: walking routes.

Sex offender route API code samples. One route from your server, or a district in a batch.

Node sends one run with its polyline from Google Directions and asks for counts only. Python sends a district’s runs in one batch and prints the count at each stop. Add "sandbox": true to build against made-up people in the real response shape.

More samples in the route docs ›
POST /v1/map/route · POST /v1/map/routes
// Your server: a run from your routing system, checked stop by stop.
const res = await fetch("https://api.offendersearch.app/v1/map/route", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.OFFENDERSEARCH_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    profile: "bus",
    polyline: directions.routes[0].overview_polyline.points, // precision 5
    stops: run.stops.map((s) => ({ id: s.number, lng: s.lng, lat: s.lat })),
    measure: "stops",
    stopRadiusFeet: 1000,
    externalId: run.id,
    detail: "count", // counts only, same price
  }),
});
const { total, stops } = await res.json();
// stops: [{ stopId, alongMiles, count, nearestFeet }, …]

Sex offender route API pricing. Billed by the mile and by the stop, never per person.

A route is billed in map requests: 1 for each started mile of corridor (×1 for every corridor up to 0.25 miles), plus 1 for each started 10 stops measured with a radius, at least 1.

$2.00
per 1,000 map requests
$0.035
per record opened
$300
monthly minimum, applied toward usage

The $300 monthly minimum is applied toward everything the account uses that month, search included. A month with $110 of usage is billed $300; a month with $1,100 is billed $1,100. It covers 150,000 map requests on its own. Counts only (detail=count) cost the same; a 304, test mode and errors are free.

RouteUnitsRequests cost
A 2-mile walking route, corridor only
2 started miles
2$0.004
A bus run of 40 stops at 1,000 feet, stops only
4 started blocks of 10 stops
4$0.008
A 17.42-mile bus route, 35 stops, corridor and stops
18 + 4 units
22$0.044
300 such routes, checked in each of 3 terms
a year of checks for a district
19,800$39.60

Records opened for letters are extra: 40 records at $0.035 is $1.40. The month bills its usage, or $300 when usage is lower.

Route API limits for walk and bus routes

Limitwalkbus
Longest line15 miles60 miles
Stops50150
Default stop radius500 ft1,000 ft
Widest stop radius2,640 ft2,640 ft
Corridor, either side0.1 mi default, up to 0.250.1 mi default, up to 0.25
Pins in a full answer300300
Routes in one batch5050

Sex offender route API: common questions

What is a sex offender route API?

An API that answers who is registered along a route. You send a line and its stops; it returns exact counts of registered sex offenders per stop and per leg, with a position for each one, across 58 US registries. It shows registered addresses, not where anyone is.

Does a route answer include names?

No, on any plan. A route answer carries counts, positions, distances and marker ids. The full record behind a pin is opened with GET /v1/map/records/{markerId}, one record at a time, at $0.035 per record opened.

Are the counts estimates?

No. Every count is exact. A route that would need more than 300 pins is refused with the exact counts and nothing is charged; you can ask again with detail=count or split the route. There is no partial answer.

Can a school district use it for bus stop notices?

Yes. It gives the count within the radius you choose around each stop and the records behind those counts. It supports a district’s notice process; it is not a legal determination, and the district decides what its notice says and who receives it.

What does checking a route cost?

A route is $2.00 per 1,000 route units: 1 unit per started mile of corridor, plus 1 per 10 stops. At $2.00 per 1,000 map requests, a 17.42-mile bus route with 35 stops is 22 units, $0.044. Records opened are $0.035 each, and the account has a $300 monthly minimum applied toward usage.

Can our phone app call it directly?

Call it from your server with your secret key; a phone app has no web origin for a browser key. On your own website, a map browser key with its list of allowed sites works, with an X-End-User header on every route call.

Can we build before we pay?

Yes. Test mode returns made-up people in the real response shape. Add sandbox=true to any map request. It needs no plan and is never charged.

Is a route answer a consumer report?

No. Results from the standard API, routes included, are not a consumer report and must not be used for FCRA-governed hiring, tenancy or credit decisions.

Check every bus stop with the sex offender route API. Build in test mode today.

Turn the Map API on when your routes are ready to show real counts.