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
"total": 3,
"stops": [
{"stopId": "12-01", "count": 0},
{"stopId": "12-02", "count": 2},
{"stopId": "12-03", "count": 0},
{"stopId": "12-04", "count": 1},
{"stopId": "12-05", "count": 0}
]Sample responseHow 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.
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.
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.
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.
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 ›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 ›{ "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." }
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 ›- Send every run. One route per run with
"profile": "bus","measure": "stops"and"stopRadiusFeet": 1000, up to 50 runs in one batch call. - 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. - 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.
- Keep the reference. Store each record’s
recordReffor your file, not the marker id. - 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.
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.
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.
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.
// 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.
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.
| Route | Units | Requests 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
| Limit | walk | bus |
|---|---|---|
| Longest line | 15 miles | 60 miles |
| Stops | 50 | 150 |
| Default stop radius | 500 ft | 1,000 ft |
| Widest stop radius | 2,640 ft | 2,640 ft |
| Corridor, either side | 0.1 mi default, up to 0.25 | 0.1 mi default, up to 0.25 |
| Pins in a full answer | 300 | 300 |
| Routes in one batch | 50 | 50 |
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.Checking your own route? Use the free sex offender route check.
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.