What this dashboard is
The UK Crime & Justice Tracker is a free, public interest dashboard showing monthly recorded crime, stop & search and population adjusted crime rates for police forces in England, Wales and Northern Ireland. It is published by UK Politics Decoded and is not an official government service.
Why it exists
Official police data is public, but it is published as large monthly files that are hard for most people to explore. Headline crime claims are often made without context such as population size, reporting lag or how figures were counted. This tracker aims to put the same open data in one place, with the caveats shown next to the numbers, so that readers can check claims for themselves.
How it works
- Each month a pipeline pulls data from the data.police.uk API for every police force, querying each force's official boundary polygon so the whole force area is covered.
- Crimes and stop & search records are compiled into a dated snapshot, with category breakdowns, per force counts and a de duplicated national total.
- Population estimates from the Office for National Statistics are used to calculate rates per 1,000 residents.
- Only the resulting JSON files are published to the GitHub data repository.
- This dashboard reads those published JSON files directly in your browser and draws the charts and tables.
Reading the dashboard
- National cards: headline totals for the selected month with change from the previous month.
- Countries at a glance: the same headline figures split by country.
- National crime by category: the mix of crime types, as raw counts or per 1,000 residents.
- Crime trend over time: monthly totals across all published months.
- 12 month category trends: rolling 12 month totals compared with the prior 12 months, which smooths out seasonal swings.
- Force league table: sortable by crimes, rate per 1,000 residents and stop & search.
- Data coverage & quality: forces that failed or were skipped for the chosen month.
The i icons next to headings open short plain language explanations of each caveat.
Open data: free to use
Everything the dashboard displays is published as raw JSON in the public GitHub repository UKPoliticsDecoded/police-crime-tracker. You are welcome to download, analyse, republish and build on it, including for journalism, research, teaching and your own tools. No account or API key is needed.
The underlying police data is published by data.police.uk under the Open Government Licence v3.0, and population figures come from the ONS. Please check the repository for the licence that applies to the compiled files and code, and keep the attribution to the original sources.
Data file layout
Files sit at the root of the repository and in one folder per month (YYYY-MM).
| File | Contents |
|---|---|
index.json | List of all published months and the latest month. |
history.json | Compact month by month time series for national and per force headline stats. |
YYYY-MM/summary.json | Per force counts, category breakdowns, population, rate per 1,000 residents, and the de-duplicated national rollup. |
YYYY-MM/manifest.json | Run metadata: successes, failures and skipped forces. |
YYYY-MM/crimes/<force>.json | Individual crime records for a force. |
YYYY-MM/stop_and_search/<force>.json | Stop & search records for a force. |
Example: using the data
Fetch the list of months, then the latest summary:
const base = "https://raw.githubusercontent.com/UKPoliticsDecoded/police-crime-tracker/main/";
const { latest } = await (await fetch(base + "index.json")).json();
const summary = await (await fetch(`${base}${latest}/summary.json`)).json();
console.log(latest, summary);
Or with Python:
import requests
base = "https://raw.githubusercontent.com/UKPoliticsDecoded/police-crime-tracker/main/"
latest = requests.get(base + "index.json").json()["latest"]
summary = requests.get(f"{base}{latest}/summary.json").json()
print(latest, list(summary))
For heavy use, please clone the repository instead of fetching files repeatedly, to be kind to GitHub's servers.
Caveats
- Reporting lag: police data is published about two months in arrears, so the latest month is never today's picture.
- Recorded crime only: figures reflect crimes recorded by police, not all crime. Changes in recording practice affect comparisons.
- Force boundaries: most forces are queried using their real police force area boundary (polygon), so figures cover the whole force area. The exception is British Transport Police, which has no fixed geographic area and uses a 1 mile radius sample near a representative point. Each force's
coveragevalue insummary.json(for examplefull-force-boundaryorhq-radius-sample) shows which method was used. - Northern Ireland boundary: the official outline available for Northern Ireland is very low detail, so its figures are approximate and may include some sea or border area.
- Incomplete coverage: in very high crime areas the API caps results per request. Affected force/months are flagged
coverage_degraded, and a flagged or missing force is not the same as zero crime. - Methodology changes: each month is tagged with how it was measured. Avoid reading a change between months with different methodology values as a real change in crime.
- De-duplication: boundary tile edges can return the same crime twice, so national totals are de-duplicated by crime ID. Force totals added together may be higher than the national total.
- Per-capita rates: City of London and British Transport Police are excluded because resident population is not a meaningful denominator. Northern Ireland uses a different statistical source and is less precise.
- Not an official service: see the Terms of Service and Privacy Policy.
Citing and reuse
If you use figures or charts, please name the month, link to this dashboard or the repository, and credit data.police.uk and the ONS as original sources. Mention the relevant caveats where they affect your conclusion.
Feedback and corrections
Found an error or have a suggestion? Please open an issue on the GitHub repository.