US Crime Incidents - 8 agencies, one offence taxonomy avatar

US Crime Incidents - 8 agencies, one offence taxonomy

Pricing

from $2.00 / 1,000 record scrapeds

Go to Apify Store
US Crime Incidents - 8 agencies, one offence taxonomy

US Crime Incidents - 8 agencies, one offence taxonomy

Police incident data from 8 US agencies (~16.3M records) normalised into one schema, with NIBRS crime-against buckets and explicit provenance for every classification.

Pricing

from $2.00 / 1,000 record scrapeds

Rating

0.0

(0)

Developer

Rishi Vinodkumar

Rishi Vinodkumar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Share

US Crime Incidents — 8 agencies, one offence taxonomy

Police incident data from eight US agencies, normalised into a single schema.

~16,313,654 incident records across 8 actively-maintained sources.

SourceStateRecordsLast verified
ChicagoIL~8,604,9072026-07-23
AustinTX~2,659,6032026-07-25
SeattleWA~1,551,2502026-07-29
DallasTX~1,506,7892026-07-30
San FranciscoCA~1,050,7392026-07-28
Montgomery CountyMD~502,4682026-07-30
New York CityNY~279,5132026-07-29
King CountyWA~158,3852026-07-31

What this reconciles

Four incompatible offence taxonomies:

AgencyTaxonomyOffence fields
ChicagoIUCRprimary_type + description
SeattleNIBRSnibrs_offense_code_description + crime-against
DallasNIBRSnibrs_crime + nibrs_crimeagainst
King CountyNIBRSnibrs_code_name
NYCNY penal lawofns_desc + law_cat_cd
San Franciscobespokeincident_category + incident_subcategory
Montgomery Countybespokecrimename1 / crimename2 / crimename3
AustinUCRcrime_type + ucr_code

NIBRS defines a crime_against axis — PERSON / PROPERTY / SOCIETY — which is the closest thing to a cross-jurisdiction comparable. Four sources publish it directly; for the rest it is derived from offence text.

Every record states which. crime_against_source is published, derived, or none. A derived value presented as authoritative is indistinguishable from a real one, and that is how bad crime statistics get made. Set publishedClassificationOnly to restrict to agency-stated buckets.

Location precision varies by design

Police agencies deliberately blur incident locations. This is not missing data:

AgencyPrecisionAddressCoordinates
Montgomery Countystreetfull street addressyes
Dallasstreetstreet addressno
Chicagoblock012XX W ADDISON STyes
Seattleblockblock addressyes
King Countyblockblock addressno
San Franciscocoordinates_onlynoneyes
NYCdistrict_onlyborough + precinctyes
Austincensus_blocknoneno

location_precision travels with every record so a census-block centroid is never mistaken for a street address. Use requireCoordinates or requireAddress to filter — but note each excludes three sources.

Traps found while building this

1. updated_on is not when the crime happened. Chicago, King County and others carry row-maintenance timestamps that are always fresher than the occurrence date — every row gets touched on every refresh. A "pick the most recent date column" heuristic selects them every time, yielding an event date that means "when the row was last edited". Chicago uses date; King County uses incident_datetime.

2. NYC really does spell it HARRASSMENT. Two Rs, in the live data. Matching only the correct spelling silently drops every harassment complaint in the city.

3. Non-crimes must not inflate real buckets. Missing Person contains "person" and would count as a crime against a person; Found Property contains "property". These map to OTHER.

4. Robbery is PERSON, not PROPERTY, under NIBRS — despite the property element — because it involves force against a victim. Theft from person remains PROPERTY.

5. Austin's occ_date_time is stale text stopping in 2025 while occ_date is live. Dallas's date2_of_occurrence_2 contains typos into 2028.

Output

{
"source": "chicago",
"state": "IL",
"incident_id": "JK344134",
"occurred_date": "2026-07-23",
"offense": "THEFT",
"offense_category": "THEFT",
"offense_detail": "OVER $500",
"crime_against": "PROPERTY",
"crime_against_source": "derived",
"severity": "UNKNOWN",
"taxonomy": "IUCR",
"premise": "APARTMENT",
"beat": "0523",
"neighborhood": "53",
"arrest": false,
"address": "120XX S PERRY AVE",
"location_precision": "block",
"latitude": 41.675426798,
"longitude": -87.624988687
}

Only Chicago publishes an arrest flag. Only NYC publishes severity as felony/misdemeanor/violation; NIBRS sources report Group A/B instead, so most records are UNKNOWN on that axis.

Who this is for

  • Proptech and insurance pricing location risk
  • Retail site selection screening candidate locations
  • Journalists and academics doing cross-city comparison
  • Public-safety analytics vendors needing a multi-agency feed

Usage

Mappable violent crime, last quarter:

{
"sources": ["chicago", "seattle", "montgomery_md"],
"occurredAfter": "2026-05-01",
"crimeAgainst": ["PERSON"],
"requireCoordinates": true,
"maxResults": 5000
}

Statistics-grade — agency-stated classifications only:

{ "occurredAfter": "2026-01-01", "publishedClassificationOnly": true }

Local development

pip install requests
python local_run.py --coverage
python local_run.py --after 2026-06-01 --limit 10
python local_run.py --against PERSON --coords --after 2026-01-01
python local_run.py --published-only --after 2026-01-01
python verify.py # health-check every source
python test_classify.py # classification regression tests

Public, logged-out municipal open-data endpoints via each agency's official Socrata API. No authentication, no account, no terms accepted, no anti-bot circumvention. These are aggregate incident reports published deliberately at blurred precision; no source here identifies victims or suspects, and this actor does not attempt to re-identify anyone. Rate limits respected with exponential backoff.