iCrimeWatch APIicrimewatch.net ↗
Access sex offender registry data from OffenderWatch/SheriffAlerts jurisdictions. Search offenders by name or city, list agencies by state, and retrieve full profiles.
What is the iCrimeWatch API?
The iCrimeWatch.net API exposes 4 endpoints for querying US sex offender registry data powered by OffenderWatch and SheriffAlerts. Starting with list_agencies, you can discover available law enforcement jurisdictions by state, then use search_offenders to filter by last name or city within a specific agency. Profile data includes physical descriptions, offense history, and address fields across hundreds of participating agencies.
curl -X GET 'https://api.parse.bot/scraper/b0be788a-9bc4-4b4f-9dec-8bb8ea4c1417/search_offenders?page=1&agency_id=56966&last_name=SMITH' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace icrimewatch-net-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: iCrimewatch Sex Offender Registry — discover agencies, search offenders, fetch details."""
from parse_apis.icrimewatch_sex_offender_registry_api import Icrimewatch, State, AgencyRequiresDisclaimer
client = Icrimewatch()
# List agencies in Texas using the State enum.
for agency in client.agencies.list(state=State.TX, limit=5):
print(agency.agency_id, agency.name)
# Construct an agency by ID and search offenders by last name.
collin = client.agency("54336")
for offender in collin.search_offenders(last_name="SMITH", limit=5):
print(offender.name, offender.city, offender.zip)
# Drill into ONE offender's full profile via .first() then .details().
summary = collin.search_offenders(last_name="SMITH", limit=1).first()
if summary:
detail = summary.details(agency_id="54336")
print(detail.full_name, detail.age, detail.sex, detail.race)
print(detail.height, detail.weight, detail.hair, detail.eyes)
# Batch fetch detailed profiles (search + detail in one call).
for profile in collin.get_offenders_with_details(last_name="SMITH", limit=3):
print(profile.full_name, profile.age, profile.address)
# Typed error handling for agencies requiring disclaimer acceptance.
try:
problem = client.agency("55003")
for off in problem.search_offenders(last_name="DOE", limit=1):
print(off.name)
except AgencyRequiresDisclaimer as exc:
print(f"agency unavailable: {exc}")
print("exercised: agencies.list / search_offenders / details / get_offenders_with_details")
Search for offenders in a specific agency jurisdiction by name or city. Returns a paginated list of offenders with basic info (name, address, city, zip). Requires an agency_id from the list_agencies endpoint. Some agencies require disclaimer acceptance and will return an error; use agencies that do not require it (e.g. Collin County 54336).
| Param | Type | Description |
|---|---|---|
| city | string | City to filter by |
| page | integer | Page number for pagination |
| agency_idrequired | string | The unique ID of the agency/jurisdiction (from list_agencies endpoint) |
| last_name | string | Last name to filter by (at least 2-3 characters recommended) |
| first_name | string | First name to filter by |
{
"type": "object",
"fields": {
"page": "integer current page number",
"agency_id": "string agency ID used in the query",
"offenders": "array of offender objects with offender_id, name, address, city, zip, detail_url",
"total_found": "integer total number of matching offenders"
},
"sample": {
"data": {
"page": 1,
"agency_id": "54336",
"offenders": [
{
"zip": "77033",
"city": "HOUSTON",
"name": "CLIFTON ALEXANDER",
"address": "8142 ROCKFORD DR",
"detail_url": "https://www.icrimewatch.net/offenderdetails.php?OfndrID=9139219&AgencyID=54336",
"offender_id": "9139219"
}
],
"total_found": 272
},
"status": "success"
}
}About the iCrimeWatch API
Agencies and Jurisdiction Discovery
Before querying offenders, use list_agencies with a two-letter state code to retrieve available jurisdictions. Each agency object returns an agency_id, name, and url. The agency_id is a required parameter for every other endpoint. Not every agency in the list supports automated access — some require disclaimer acceptance that cannot be satisfied programmatically, and those will return an error when queried.
Searching Offenders
search_offenders accepts an agency_id alongside optional filters: last_name, first_name, city, and page for pagination. Results are paginated and include per-offender fields: offender_id, name, address, city, zip, and a detail_url. The total_found integer tells you how many records matched before pagination. At least 2–3 characters are recommended when filtering by last_name to avoid overly broad results.
Full Profile Details
get_offender_detail takes an agency_id and offender_id (both from search results) and returns the complete profile: age, sex, race, height, weight, hair, eyes, address, and an offenses string covering offense descriptions, dates, and contextual details. If you need enriched results without two separate calls, get_offenders_with_details combines a search pass with per-record detail fetches in a single request. Keep the limit parameter low — higher values require sequential fetches per result and can cause timeouts.
Coverage and Limitations
Data coverage depends entirely on which agencies participate in the OffenderWatch/SheriffAlerts network. Not all US jurisdictions are represented, and availability varies by state. Disclaimer-gated agencies return an error rather than results, so effective coverage within any given state may be a subset of what list_agencies returns.
The iCrimeWatch API is a managed, monitored endpoint for icrimewatch.net — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when icrimewatch.net changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official icrimewatch.net API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Building a neighborhood safety dashboard that maps registered offenders by city using
search_offendersand address fields - Automating tenant or employee background screening by querying offender registries across multiple state agencies
- Aggregating offense history strings from
get_offender_detailto analyze conviction type patterns across jurisdictions - Generating alerts when new offenders appear in a specific agency's registry by comparing paginated
search_offendersresults over time - Enriching address-based datasets with proximity to registered offenders using the
address,city, andzipfields - Researching agency coverage gaps across states by iterating
list_agenciesfor all 50 state codes
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does iCrimeWatch.net have an official developer API?+
What does `get_offender_detail` return beyond what `search_offenders` provides?+
search_offenders returns basic identifying fields: name, address, city, zip, and offender_id. get_offender_detail adds physical description fields — height, weight, hair, eyes, race, sex, and age — plus an offenses string containing offense descriptions, dates, and associated details not present in the search listing.Why do some agencies return errors instead of results?+
list_agencies endpoint will still return them — you need to test each agency_id to determine whether it is accessible.Does the API support searching across all agencies in a state at once rather than one agency at a time?+
agency_id, so multi-agency queries require iterating over the results from list_agencies. You can fork this API on Parse and revise it to add a batch-search endpoint that loops over all agencies for a given state.Are photos or mugshots included in offender profiles?+
get_offender_detail covers physical description through structured text fields like height, weight, hair, and eyes. You can fork this API on Parse and revise it to add image URL extraction if the source profile pages include offender photos.