Security — entry 028 of 30

UK Police

Verified Jul 2026

The UK Police API publishes crime, stop-and-search, and neighbourhood-policing data reported by the 43 territorial forces of England and Wales, going back to December 2010 for street-level crime. It's a keyless JSON REST API -- force listings, neighbourhood team info, individual crime and outcome records, geo-radius crime queries -- released under the Open Government Licence, so results can be reused (including commercially) with attribution. Anonymous requests are capped at 15 per second with a burst of 30 before a 429 kicks in, comfortably enough for the dashboards and research tools that already build on it.

The UK Police API publishes crime, stop-and-search, and neighbourhood-policing data for the 43 territorial forces of England and Wales as keyless JSON. Street-level crime is queried by location -- a radius around a lat/lng, a specific street's `location_id`, or a custom polygon -- rather than by force, so most calls need a date and a place, not an agency name.

ukgovernmentcrime-dataopen-datalaw-enforcement
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score74out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 74 on greatapis.com
<a href="https://greatapis.com/api/uk-police/"><img src="https://greatapis.com/badge/uk-police.svg" alt="Scored 74 on greatapis.com"></a>

Auth quickstart

  1. No API key or account is required -- every endpoint below is a public, keyless read.
  2. The published rate limit (confirmed live at data.police.uk/docs/api-call-limits/, a dedicated docs page) is a leaky-bucket of 15 requests per second with a burst of 30; exceeding it returns HTTP 429. This matches this entry's existing stored claim, now re-confirmed against the live docs rather than just inherited.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Crimes recorded at a single street location

GEThttps://data.police.uk/api/crimes-at-location?date=2026-05&location_id=1739424

200 application/json

[{"category":"anti-social-behaviour","location_type":"Force","location":{"latitude":"52.635596","street":{"id":1739424,"name":"On or near Cromford Street"},"longitude":"-1.112071"},"context":"","outcome_status":null,"persistent_id":"","id":135146515,"location_subtype":"","month":"2026-05"}]

location_id 1739424 was picked from this run's own probe of the radius endpoint (see gotchas) as a street with exactly one recorded crime that month, specifically so the worked example stays small and complete rather than truncated -- the body above is the full, unedited response.

Developer reference

Base URLhttps://data.police.uk/api
Rate limit

15 requests/second with a burst of 30 (leaky-bucket algorithm), per data.police.uk/docs/api-call-limits/ -- confirmed live against the current docs page; exceeding it returns HTTP 429

Gotchas & limits

  • Street-level data lags roughly two months behind the current date. Confirmed live on 2026-07-27: `/api/crimes-street-dates` lists 2026-05 as its most recent available month, not 2026-06 or 2026-07 -- always read this endpoint to find the latest usable `date` rather than assuming last month works.
  • Requesting a not-yet-published month returns a bare 404 with an empty body, not an empty array. Confirmed live: `crimes-street/all-crime?lat=...&lng=...&date=2026-07` (the current month) 404s, while the same call with `date=2026-05` returns 200.
  • The radius search behind `crimes-street/all-crime` has a fixed catchment (no radius or page-size parameter) and returns every matching record in one response -- confirmed live, a single query centred on Leicester for one month came back as 616,043 bytes covering thousands of crimes. There's no way to shrink it server-side; for a small worked example, query a single street via `crimes-at-location` and a `location_id` instead, as above.
  • An unknown force ID on `/api/forces/{id}` returns a plain-text 404 body ("Not Found"), not a JSON error object -- confirmed live with `/api/forces/not-a-real-force`.
  • CORS is wide open: confirmed live with `access-control-allow-origin: *` on `/api/forces`, both bare and with an `Origin: https://example.com` header, and the same wildcard header shows up even on the 404 responses above.