Crime context.
With the source in view.

Police-reported incident data for agent builders and listing pages. A shared schema, explicit coverage, and attribution that stays with the result.

For AI agents

For agent builders (MCP). Connect your tools to reported incidents, category counts and within-city context.

Add to your MCP client configuration

{ "mcpServers": { "crime-data": { "type": "http", "url": "https://crimedata.dev/mcp" } } }

Example tool call

{ "name": "crime_stats", "arguments": {
  "lat": 37.788, "lon": -122.4075,
  "radius_m": 500
} }

No API key required for MCP. Check crime_coverage first; retain the returned source and freshness.

Connect an agent REST API docs

For listings

For real-estate agents and rental hosts. Add factual neighbourhood context to your listing with a copy-paste scorecard.

Illustrative demo from the widget fixture. No measured crime data; date unavailable. All values below share this demo source.

Add to a listing Widget setup

Incident coverage: San Francisco, New York City, Seattle, Dallas, Cincinnati, Kansas City, Boston, Washington, Minneapolis, Milwaukee. 2 more cities loading. Elsewhere, city-wide FBI rates are available through the score fallback where covered; no street-level incidents or grade. Sources and record dates.

Explore the incident data

Crime data for any address in 10 US cities (2 more loading). Checked nightly; each city shows its latest record date.


Real figures from our database, built 2026-11-03.

Three calls, one schema

curl "https://crimedata.dev/v1/stats?lat=37.788&lon=-122.4075&radius_m=500" \
  -H "x-api-key: $CRIME_API_KEY"

Embeddable scorecard

Realtor and host widget demo

One tag, no dependencies: grade, score, top categories, 12-month trend and day/night split, in a shadow DOM that follows light and dark mode. It makes two API calls per render (/v1/score and /v1/stats) with a publishable widget key (pk_). Create it server-side with your secret key and an exact origin allowlist; calls share your secret key’s quota. Up to 10 widget keys per secret key; rotating the secret key revokes them all. Keep the secret key off your page. Incident density percentile, not a prediction of personal risk. How the score works.

<script src="https://crimedata.dev/embed.js" async></script>
<crime-scorecard lat="37.788" lon="-122.4075" radius="500" api-key="pk_YOUR_WIDGET_KEY"></crime-scorecard>

Attributes: lat and lon (or address), radius in metres (default 500), api-key. Keep the small attribution link in place.

curl -X POST 'https://crimedata.dev/v1/keys/widget' -H "x-api-key: $CRIME_API_KEY" -H 'content-type: application/json' --data '{"origins":["https://example.com"]}'
# Revoke with the parent secret:
curl -X DELETE 'https://crimedata.dev/v1/keys/widget/w_WIDGET_ID' -H "x-api-key: $CRIME_API_KEY"

Widget keys allow only GET /v1/score and /v1/stats with a matching Origin header. They cannot manage keys or read usage. Origin is a browser control only; non-browser clients can forge that header. Each widget has a daily cap (default up to 1,000 calls, configurable with daily_cap up to the parent’s remaining quota) and calls are also limited per IP.

Endpoints

GET /v1/incidents?lat=&lon=&radius_m=500&from=&to=&category=&limit=100&cursor=&format=json|geojson
GET /v1/incidents?address=1+Market+St+San+Francisco&...        (or bbox=minLon,minLat,maxLon,maxLat)
GET /v1/stats?lat=&lon=&radius_m=500&from=&to=&category=            (or address=, bbox=)
GET /v1/compare?points=lat,lon;lat,lon&radius_m=500             (2-5 points)
GET /v1/score?lat=&lon=&radius_m=500                       (0-100 incident density score and A-F grade; or address=)
GET /v1/usage                                              (your plan, calls used, upgrade links)
POST /v1/keys                                               (free key; optional JSON body {"email": ...})
POST /v1/keys/rotate                                        (new key for the same plan; the old key stops working)
GET /v1/cities

Categories: homicide sexual_offense robbery assault burglary vehicle_theft theft_from_vehicle theft fraud vandalism weapons drugs dui trespass harassment public_order traffic non_criminal other

Coverage

CityIncidentsNewest recordSource updatesSource / licence
San Francisco, CA97,1002026-11-01dailySan Francisco portal
ODC PDDL (public domain)
New York City, NY366,5712026-06-30 (stale)quarterlyNew York City portal
NYC Admin Code 23-502(d): no restrictions on use; source identified
Seattle, WA68,4642026-11-01dailySeattle portal
Public Domain
Dallas, TX134,1812026-11-02dailyDallas portal
ODC-BY (attribution required)
Cincinnati, OH23,4422026-10-26dailyCincinnati portal
Public Domain
Kansas City, MO44,2392026-10-26dailyKansas City portal
Public Domain
Boston, MA86,8492026-10-28dailyBoston portal
ODC PDDL (public domain)
Washington, DC23,3532026-11-01dailyWashington portal
CC BY 4.0 (attribution required)
Minneapolis, MN24,4172026-11-01dailyMinneapolis portal
City of Minneapolis has waived all copyright and related or neighboring rights to Open Data (CC0 1.0), to the extent possible under law
Milwaukee, WI37,8722026-10-31dailyMilwaukee portal
CC BY (attribution required)
Denver, COLoading: awaiting source datadailyDenver portal
CC BY 3.0 (attribution required)
Baltimore, MDLoading: awaiting source dataweeklyBaltimore portal
Open licence by city ordinance, commercial use allowed (Baltimore City Code 9-8)

NYC publishes quarterly, so its newest records are about three months old. Cincinnati publishes lesser offenses only as "Part 2" with no detail, so they appear as other. Live freshness: GET /v1/cities.

Elsewhere in the US, /v1/score still answers with the city-wide FBI rates and national percentiles (coverage: "city_fallback"), not street-level incidents or a grade.

Need another city?

MCP server for AI agents

MCP for AI agents: tools, limits and connections

Free: last 180 days, 1 km radius, 50 rows per call. Tools: crime_incidents, crime_stats, crime_compare, crime_score, crime_coverage. Pass address instead of lat and lon.

{ "mcpServers": { "crime-data": { "type": "http", "url": "https://crimedata.dev/mcp" } } }

Pricing

BasicFree500 calls / month

Prototypes and hackathons

Start free
Pro$29 / mo20,000 calls / month

A live app or internal tool

Paid plans open soon — start with a free key
Ultra$79 / mo100,000 calls / month

Listing sites and dashboards

Paid plans open soon — start with a free key
Mega$199 / mo500,000 calls / month

Batch scoring and data teams

Paid plans open soon — start with a free key

Over your quota, calls return 429 until next month or until you upgrade. Never a surprise bill. Need bulk history or a city we don't cover? Ask in the issue tracker linked from the docs.

Get a free API key

500 calls a month, no card. The key is shown once. Email is optional: we use it only to recover access and to send notices about your key or the service.

Upgrade an existing key

Paste your key to see this month's usage and your upgrade links. The key is sent only to this API.

Rotate key issues a new key with the same plan, usage and billing link. The old key stops working immediately.

Attribution

San Francisco: source (ODC PDDL (public domain))
New York City: source (NYC Admin Code 23-502(d): no restrictions on use; source identified)
Seattle: source (Public Domain)
Dallas: source (ODC-BY (attribution required))
Cincinnati: source (Public Domain)
Kansas City: source (Public Domain)
Boston: source (ODC PDDL (public domain))
Washington: source (CC BY 4.0 (attribution required))
Minneapolis: source (City of Minneapolis has waived all copyright and related or neighboring rights to Open Data (CC0 1.0), to the extent possible under law)
Milwaukee: source (CC BY (attribution required))
Denver: source (CC BY 3.0 (attribution required))
Baltimore: source (Open licence by city ordinance, commercial use allowed (Baltimore City Code 9-8))

Data comes from each city's open-data portal under the licence shown. It is police-reported incident data, not convictions, and can be revised by the source. Compared with the FBI API · Terms · Refunds · Privacy · DPA · Contact
Operated by Shahar Frish, Israel.