UK Police Crime Statistics Search
Search street-level crime records from all 43 police forces across England, Wales, and Northern Ireland using the official UK Police API. Query by geographic coordinates, UK postcode, or police force ID and get structured crime data including category, location, outcome status, and date -- no API key required.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| crime-fetched | Charged per crime data record retrieved from UK Police API. | $0.002 |
Example: 100 events = $0.20 · 1,000 events = $2.00
Documentation
Search street-level crime records from all 43 police forces across England, Wales, and Northern Ireland using the official UK Police API. Query by geographic coordinates, UK postcode, or police force ID and get structured crime data including category, location, outcome status, and date -- no API key required.
Why use UK Police Crime Data?
The UK Home Office publishes open crime data through the data.police.uk API, but working with it directly means handling multiple endpoints, understanding geographic parameters, managing 503 errors for recent months, and normalizing inconsistent response formats. This actor abstracts all of that behind a simple input form that runs on Apify's cloud infrastructure.
You get clean, structured JSON output from a single run -- ready for dashboards, spreadsheets, databases, or downstream pipelines. Because it runs on Apify, you can schedule recurring extractions, trigger runs via API, and pipe results into Google Sheets, Slack, webhooks, or any integration target without writing a line of code.
The UK Police API is completely free and open. No API key, no registration, no rate limit tokens. This actor simply provides a clean, reliable interface to that data with automatic postcode geocoding, error recovery, and structured output.
Key features
- Street-level crime data from all 43 territorial police forces in England, Wales, and Northern Ireland
- Three search modes -- query by latitude/longitude coordinates, UK postcode, or police force identifier
- Automatic postcode geocoding -- enter any valid UK postcode and the actor resolves it to coordinates via Postcodes.io before querying crimes
- 14 crime categories for filtering -- anti-social behaviour, bicycle theft, burglary, criminal damage and arson, drugs, other crime, other theft, possession of weapons, public order, robbery, shoplifting, theft from the person, vehicle crime, and violent crime
- Outcome tracking -- each record includes the investigation outcome and the month it was resolved, where available
- Monthly granularity -- query any available month in YYYY-MM format or default to the latest published data
- Automatic retry on 503 -- if the API returns a server error for a specific date, the actor retries with the latest available month
- Force discovery mode -- run with no parameters to retrieve a reference list of all 43 police force IDs and names
- Configurable result limits -- return anywhere from 1 to 10,000 records per run
- Category breakdown logging -- each run logs a summary of crime counts by category for quick insights
How to use
Apify Console
- Go to the UK Police Crime Data actor page on Apify
- Click Start
- Choose your search method:
- Enter a UK postcode (e.g.,
SW1A 1AA) for the simplest experience - Enter latitude and longitude for precise coordinate-based search
- Enter a police force ID (e.g.,
metropolitan) for force-wide data
- Enter a UK postcode (e.g.,
- Optionally select a crime category to filter results
- Optionally set a date in YYYY-MM format
- Set max results to control the number of records returned (default: 100)
- Click Start and wait for the run to complete
- View or download results from the Dataset tab as JSON, CSV, or Excel
Apify API
Start a run programmatically by sending a POST request to the Apify API:
curl -X POST "https://api.apify.com/v2/acts/jiVktGAOz5rv108S2/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"postcode": "SW1A 1AA",
"category": "burglary",
"date": "2024-06",
"maxResults": 200
}'
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
latitude | number | No | -- | Latitude for location-based crime search (e.g., 51.5074 for London) |
longitude | number | No | -- | Longitude for location-based crime search (e.g., -0.1278 for London) |
postcode | string | No | -- | UK postcode to search -- automatically geocoded to lat/lng (e.g., SW1A 1AA) |
date | string | No | Latest | Month to query in YYYY-MM format (e.g., 2024-06). Defaults to the latest available month |
category | string | No | All crime | Crime category filter. One of: anti-social-behaviour, bicycle-theft, burglary, criminal-damage-arson, drugs, other-crime, other-theft, possession-of-weapons, public-order, robbery, shoplifting, theft-from-the-person, vehicle-crime, violent-crime |
force | string | No | -- | Police force identifier (e.g., metropolitan, west-midlands, greater-manchester) |
maxResults | integer | No | 100 | Maximum number of crime records to return (1 to 10,000) |
You must provide at least one of: latitude/longitude, postcode, or force. If none are given, the actor returns a reference list of all 43 police forces with their IDs and names.
Example inputs
Search crimes near Westminster by postcode:
{
"postcode": "SW1A 1AA",
"category": "violent-crime",
"date": "2024-06",
"maxResults": 50
}
Search by coordinates in central Manchester:
{
"latitude": 53.4808,
"longitude": -2.2426,
"category": "burglary",
"maxResults": 200
}
Get force-wide data for the Metropolitan Police:
{
"force": "metropolitan",
"category": "shoplifting",
"date": "2024-03",
"maxResults": 500
}
Discover all available police force IDs (no parameters):
{}
Tips
- Use
postcodefor the easiest experience -- the actor geocodes it automatically - Omit
dateto get the latest available data (avoids 503 errors from requesting too-recent months) - Omit
categoryto retrieve all crime types in a single run - Run with an empty input
{}to discover valid force IDs before running force-specific queries
Output
Each crime record in the output dataset has the following structure:
{
"category": "burglary",
"locationType": "Force",
"latitude": 51.5133,
"longitude": -0.0886,
"streetName": "On or near High Street",
"outcomeStatus": "Investigation complete; no suspect identified",
"outcomeDate": "2024-08",
"month": "2024-06",
"persistentId": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
"context": ""
}
Output fields
| Field | Type | Description |
|---|---|---|
category | string | Crime category (e.g., burglary, violent-crime, shoplifting, anti-social-behaviour) |
locationType | string | Location type classification -- typically "Force" or "BTP" (British Transport Police) |
latitude | number | Latitude of the anonymized crime location |
longitude | number | Longitude of the anonymized crime location |
streetName | string | Nearest street or location description (e.g., "On or near High Street") |
outcomeStatus | string or null | Resolution status (e.g., "Under investigation", "Offender given a caution", "Unable to prosecute suspect"). Null if no outcome recorded |
outcomeDate | string or null | Month the outcome was recorded in YYYY-MM format. Null if no outcome |
month | string | Month the crime was reported in YYYY-MM format |
persistentId | string | Unique persistent identifier for the crime record -- use this to track outcomes across snapshots |
context | string | Additional context provided by the police force (usually empty) |
When running in force discovery mode (no search parameters), each record represents a police force with the force name in streetName and the force ID in persistentId.
Use cases
- Property investment analysis -- assess crime levels around a prospective buy-to-let property or commercial premises before committing capital
- Insurance risk assessment -- evaluate street-level crime density for underwriting decisions or premium calculations
- Local authority reporting -- generate monthly crime breakdowns by category for council meetings and community safety partnerships
- Journalism and investigations -- identify crime hotspots, track trends over time, and create data-driven news stories
- Academic research -- feed structured crime data into criminology, urban planning, or socioeconomic studies
- Estate agent and lettings intelligence -- provide prospective tenants or buyers with objective crime statistics for specific streets or postcodes
- Business location planning -- compare crime profiles across candidate locations for new retail stores, offices, or hospitality venues
- Community safety monitoring -- schedule monthly runs to track whether anti-social behaviour, burglary, or vehicle crime is rising or falling in your neighbourhood
- Security consultancy -- build evidence-based risk assessments for corporate clients using official police data
- Cross-referencing with other datasets -- combine crime data with food hygiene ratings, land registry prices, or flood risk data to build comprehensive area profiles
API & Integration
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("jiVktGAOz5rv108S2").call(run_input={
"postcode": "EC2R 8AH",
"category": "robbery",
"date": "2024-06",
"maxResults": 100,
})
dataset = client.dataset(run["defaultDatasetId"])
for item in dataset.iterate_items():
print(f"{item['month']} | {item['category']} | {item['streetName']} | {item['outcomeStatus']}")
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("jiVktGAOz5rv108S2").call({
postcode: "M1 1AA",
category: "vehicle-crime",
maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.log(`${item.month} | ${item.category} | ${item.streetName}`);
});
cURL
# Start a run
curl -X POST "https://api.apify.com/v2/acts/jiVktGAOz5rv108S2/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"postcode": "B1 1BB", "maxResults": 50}'
# Fetch results from the default dataset
curl "https://api.apify.com/v2/acts/jiVktGAOz5rv108S2/runs/last/dataset/items?token=YOUR_API_TOKEN"
Integrations
UK Police Crime Data outputs standard Apify datasets that work with all built-in integrations:
- Google Sheets -- export crime data directly to a spreadsheet for collaborative reporting
- Slack / Email -- receive notifications when new crime data is available for your monitored area
- Webhooks -- trigger downstream processing pipelines when a run completes
- Zapier / Make -- connect to thousands of apps for automated crime data workflows
- Amazon S3 / Google Cloud Storage -- archive crime datasets for long-term trend analysis
How it works
UK Police Crime Data follows a straightforward pipeline to fetch, transform, and output crime records:
Input parameters
|
v
+-----------------+
| Postcode given? |--Yes--> Geocode via Postcodes.io --> lat/lng
+-----------------+
|No
v
+-------------------+
| Lat/lng provided? |--Yes--> Query data.police.uk/api/crimes-street
+-------------------+
|No
v
+------------------+
| Force provided? |--Yes--> Query data.police.uk/api/crimes-no-location
+------------------+
|No
v
List all 43 police forces (discovery mode)
|
v
Transform raw API response --> flat CrimeResult schema
|
v
Apply maxResults limit
|
v
Push to Apify dataset + log category breakdown
- Input resolution -- if a postcode is provided, the actor geocodes it to latitude/longitude using the Postcodes.io API. If coordinates are already given, geocoding is skipped.
- API query -- depending on which parameters are available, the actor calls either the street-level crimes endpoint (
/crimes-street/{category}) for coordinate-based searches or the no-location crimes endpoint (/crimes-no-location) for force-based searches. - Error recovery -- if the API returns a 503 (typically because the requested month is not yet published), the actor retries without the date parameter to fetch the latest available data.
- Transformation -- raw API responses with snake_case fields and nested objects are flattened into a clean camelCase schema with ten consistent fields.
- Output -- results are trimmed to the configured
maxResultslimit and pushed to the Apify dataset. A category breakdown is logged for quick reference.
Performance & cost
| Scenario | Records | Memory | Duration | Estimated cost |
|---|---|---|---|---|
| Single postcode, default 100 results | ~100 | 256 MB | 5-15 sec | < $0.005 |
| Coordinate search, 500 results | ~500 | 256 MB | 10-20 sec | < $0.005 |
| Force-wide query, 1,000 results | ~1,000 | 256 MB | 15-30 sec | < $0.01 |
| Force-wide query, 5,000 results | ~5,000 | 256 MB | 20-45 sec | < $0.01 |
| Force discovery (list all forces) | 43 | 256 MB | 3-5 sec | < $0.001 |
The actor is extremely lightweight -- it makes 1-2 HTTP requests per run and processes JSON in memory. The underlying UK Police API is completely free with no API key required, so there are no external data costs. Apify's free tier ($5/month in platform credits) supports hundreds of runs.
Limitations
- Geographic coverage -- data covers England, Wales, and Northern Ireland only. Scotland uses a separate police data system and is not included in the UK Police API.
- Data lag -- crime data is typically published 2-3 months after the reporting month. Requesting a very recent month may return a 503 error, in which case the actor falls back to the latest available data.
- Street-level anonymization -- crime locations are snapped to the nearest point on a street, not exact addresses. Multiple crimes may share identical coordinates and street names.
- Single location per run -- each run queries one geographic point or one police force. To search multiple areas, trigger separate runs via the Apify API or set up multiple schedules.
- No-location crimes -- when searching by force ID, the actor retrieves crimes that have no specific location attached (e.g., online fraud). These results will not have meaningful latitude/longitude values.
- API availability -- the UK Police API occasionally experiences downtime or slow responses. The actor includes retry logic for 503 errors but cannot recover from extended outages.
- Historical depth -- the API provides data from approximately 2010 onwards, but availability varies by police force. Very old months may have incomplete data.
Responsible use
- Privacy -- crime locations are anonymized by the Home Office before publication. Do not attempt to de-anonymize locations or identify individuals from this data.
- Context matters -- raw crime counts do not account for population density, reporting rates, or policing priorities. Always provide appropriate context when publishing or sharing crime statistics.
- No real-time data -- this is historical, aggregated data with a 2-3 month lag. Do not use it as a real-time safety indicator or for emergency decision-making.
- Attribution -- when publishing analysis based on this data, credit the source as the UK Home Office via data.police.uk.
- Fair representation -- avoid cherry-picking data to misrepresent the safety of specific areas, communities, or demographics.
FAQ
What geographic areas does this actor cover? England, Wales, and Northern Ireland. Scotland has a separate police data system (Police Scotland) and is not included in the UK Police API.
How current is the crime data? Data is typically published with a 2-3 month delay. For example, in March 2025 the latest available data might be for December 2024 or January 2025.
What does "street-level" mean? Crime locations are anonymized to the nearest point on a street, not exact addresses. This means multiple crimes may share the same GPS coordinates and street name.
Do I need an API key? No. The UK Police API is completely open and free. No authentication, registration, or API key is required.
How many police forces are covered? All 43 territorial police forces in England, Wales, and Northern Ireland, including the British Transport Police and other specialist forces.
What happens if I request a month that is not available yet? The API returns a 503 error. The actor automatically retries without the date parameter to fetch the latest available month instead.
Can I search multiple postcodes in one run? No. Each run queries a single location or force. To search multiple areas, use the Apify API to start separate runs for each postcode, or set up multiple scheduled tasks.
What is the persistentId field?
A unique identifier assigned to each crime record by the Home Office. Use it to track the same crime across different monthly snapshots and check whether its outcome has been updated.
Why do some crimes have null outcome values? Not all crimes have a recorded outcome. This can mean the investigation is ongoing, the crime was recently reported, or no resolution was logged by the police force.
What is force discovery mode?
Run the actor with no input parameters (empty {}) and it returns a list of all 43 police forces with their IDs and names. Use these IDs in the force field for subsequent searches.
Can I filter by multiple crime categories at once? No. The API supports filtering by one category at a time, or returning all categories. To get data for multiple specific categories, run the actor once for each category or use "all-crime" and filter the results after export.
How does postcode geocoding work? The actor sends the postcode to the Postcodes.io API, which returns the latitude and longitude of the postcode centroid. These coordinates are then used to query the UK Police crimes-street endpoint.
Related actors
| Actor | Description | Link |
|---|---|---|
| UK Food Hygiene Ratings | Search food hygiene inspection ratings for restaurants and businesses across England, Wales, and Northern Ireland | ryanclinton/uk-food-hygiene |
| Interpol Red Notice Search | Search Interpol's international wanted persons database for red notices | ryanclinton/interpol-red-notices |
| FBI Most Wanted Search | Search the FBI's most wanted fugitives, terrorists, and missing persons lists | ryanclinton/fbi-wanted-search |
| UK Environment Agency Flood Warnings | Monitor active flood warnings and alerts across England | ryanclinton/uk-flood-warnings |
| UK Companies House Search | Look up registered UK companies, directors, and filing history | ryanclinton/uk-companies-house |
| UK Land Registry Search | Search UK property price paid data and transaction records | ryanclinton/uk-land-registry |
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
Bulk Email Verifier
Verify email deliverability at scale. MX record validation, SMTP mailbox checks, disposable and role-based detection, catch-all flagging, and confidence scoring. No external API costs.
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Website Content to Markdown
Convert any website to clean Markdown for RAG pipelines, LLM training, and AI apps. Crawls pages, strips boilerplate, preserves headings, tables, and code blocks. GFM support.
Website Tech Stack Detector
Detect 100+ web technologies on any website. Identifies CMS, frameworks, analytics, marketing tools, chat widgets, CDNs, payment systems, hosting, and more. Batch-analyze multiple sites with version detection and confidence scoring.
Ready to try UK Police Crime Statistics Search?
Start for free on Apify. No credit card required.
Open on Apify Store