Vepler logo
v6.0.0 Breaking change

Crime metrics cover England and Wales, with harm rates, trends and a 24-month window

Crime now covers England and Wales with monthly scores, harm rates and trends by area.

Changed

  • GET /v1/safety/geography/metrics covers England and Wales, so Welsh area codes return scored figures alongside English ones. Each month summarises the trailing 24-month window ending at that month: totalCrimeCount, each category's crimeCount and the counts in timeSeriesData are window totals, and periodDetails.windowMonths reads 24. totalCrimeRate and crimeRate stay per 1,000 residents per year. To migrate, compare rates rather than counts with any figures you stored before this release, or divide a count by windowMonths.
  • Scores are null, never 0, where a police force did not report. crimeScore, percentile and trendFactor read null in that case, and dataAvailability on each row, category and time-series point says how complete the data is: available, partial, missing or unknown. A missing row's counts come from incidents recorded by a neighbouring force and are not evidence that an area is safe. A merged row reports available only when every merged area does, and partial otherwise. To migrate, handle the four values and read dataAvailability beside every number.
  • percentile ranks an area among areas of the same type in England and Wales for that month, from 0 to 100 where 100 is safest, and is null when fewer than 10 areas could be ranked. percentileLocal gives the same rank within the area's parent local authority. Do not compare percentiles across area types.
  • trendFactor compares the most recent year with the year before, and a positive value means crime is falling. It has no fixed range, so check the sign and any bounds in rules that read it. trendLabel states the trend in words (improving, worsening, stable or unknown), with trendRatio (incidents in the latest year over the year before, where above 1 means rising), trendZ and trendSignificant beside it.
  • Each category's crimeScore sits on that category's own scale, so compare a category with itself across areas and months rather than with other categories. Only the all category carries explanatoryTags, and the others return an empty list. The tag vocabulary gains harm_driven_by_<category>, partial_coverage and no_incidents_in_window.
  • Rows gain entityType, name, country (england or wales), totalCrimeScore and modelVersion. Categories gain harmRate, the expected harm per 1,000 residents per year with each offence weighted by its severity, and harmLower and harmUpper, the 80% prediction interval on harm over the next 12 months, plus coveredPeriods, the number of months in the window with usable data. periodDetails gains start and end in YYYY-MM form.
  • GET /v1/safety/crime returns outcome on each incident, the last recorded outcome as the police data source publishes it, and null for anti-social behaviour and where no outcome is recorded yet. reportedBy is the identifier of the recording force in lower-case hyphenated form, such as metropolitan, so map it to a display name on your side. crimeDate is the first day of the month the incident was recorded in, and incident history starts in August 2020.
  • GET /v1/safety/catalog and GET /v1/safety/catalog/{country} list england and wales. Only monthly periods are published, so yearly period lists are empty.

Removed

  • Parish and local planning authority codes on GET /v1/safety/geography/metrics, which return an empty data list. Request the ward or local authority district that contains the area instead.
  • quarterly from periodType in the safety catalogue. Use monthly periods.
  • estimated and insufficient from category dataAvailability.
  • single_crime_type_dominates, primarily_violent_crime, mostly_low_severity_crimes, recent_crime_concentration and distributed_over_time from explanatoryTags.
  • Location text on GET /v1/safety/crime: crimeLocation is null because the data source publishes none. Place an incident with coordinates instead.