UK Police Salary Explorer

An interactive look at police pay across ranks from 1999 to 2025, in nominal and real terms.
policing
data-visualization
uk
Published

April 23, 2026

Code
viewof selectedRanks = Inputs.checkbox(
  ["PC National", "PC Metropolitan", "Sergeant", "Inspector", "Superintendent"],
  {label: "Ranks", value: ["PC National", "Sergeant", "Inspector"]}
)

viewof payPoint = Inputs.radio(
  ["Starting salary", "Top of scale", "Both"],
  {label: "Pay point", value: "Starting salary"}
)

viewof realTerms = Inputs.toggle({label: "Real terms (2025 £)", value: true})

viewof indexBy = Inputs.radio(
  ["Absolute salary", "Minimum wage multiple", "Median wage multiple"],
  {label: "Index by", value: "Absolute salary"}
)

viewof showBenchmarks = Inputs.toggle({label: "Show benchmark lines (min wage & median wage)", value: false})

viewof showTable = Inputs.toggle({label: "Show data table", value: false})
Code
raw = FileAttachment("police_salary_ranks.csv").csv({typed: true})

rankMap = new Map([
  ["PC National", {code: "PC", label: "PC (National)"}],
  ["PC Metropolitan", {code: "Met_PC", label: "PC (Metropolitan)"}],
  ["Sergeant", {code: "Sgt", label: "Sergeant"}],
  ["Inspector", {code: "Insp", label: "Inspector"}],
  ["Superintendent", {code: "Supt", label: "Superintendent"}],
])

data = {
  const rows = [];
  for (const d of raw) {
    const year = +d.Year;
    const minWage = realTerms ? +d.MinWage_Annual_Real2025 : +d.MinWage_Annual_Nominal;
    const medianWage = realTerms ? +d.Median_FT_Annual_Real2025 : +d.Median_FT_Annual_Nominal;
    for (const sel of selectedRanks) {
      const info = rankMap.get(sel);
      if (payPoint === "Starting salary" || payPoint === "Both") {
        let val = realTerms ? +d[info.code + "_Start_Real2025"] : +d[info.code + "_Start_Nominal"];
        if (indexBy === "Minimum wage multiple") val = val / minWage;
        if (indexBy === "Median wage multiple") val = val / medianWage;
        rows.push({
          Year: year,
          Rank: info.label,
          Point: "Start",
          Salary: val
        });
      }
      if (payPoint === "Top of scale" || payPoint === "Both") {
        let val = realTerms ? +d[info.code + "_Top_Real2025"] : +d[info.code + "_Top_Nominal"];
        if (indexBy === "Minimum wage multiple") val = val / minWage;
        if (indexBy === "Median wage multiple") val = val / medianWage;
        rows.push({
          Year: year,
          Rank: info.label,
          Point: "Top",
          Salary: val
        });
      }
    }
  }
  return rows;
}

minWageLine = raw.map(d => {
  const minWage = realTerms ? +d.MinWage_Annual_Real2025 : +d.MinWage_Annual_Nominal;
  const medianWage = realTerms ? +d.Median_FT_Annual_Real2025 : +d.Median_FT_Annual_Nominal;
  let val = minWage;
  if (indexBy === "Minimum wage multiple") val = 1;
  if (indexBy === "Median wage multiple") val = minWage / medianWage;
  return { Year: +d.Year, Salary: val };
})

medianLine = raw.map(d => {
  const minWage = realTerms ? +d.MinWage_Annual_Real2025 : +d.MinWage_Annual_Nominal;
  const medianWage = realTerms ? +d.Median_FT_Annual_Real2025 : +d.Median_FT_Annual_Nominal;
  let val = medianWage;
  if (indexBy === "Minimum wage multiple") val = medianWage / minWage;
  if (indexBy === "Median wage multiple") val = 1;
  return { Year: +d.Year, Salary: val };
})

yLabel = indexBy === "Absolute salary" ? (realTerms ? "Salary (2025 £)" : "Salary (nominal £)") :
         indexBy === "Minimum wage multiple" ? "Multiple of minimum wage" :
         "Multiple of median wage"

tickFormat = indexBy === "Absolute salary" ? "~s" : ".2f"

chart = Plot.plot({
  width,
  height: 500,
  style: {
    background: "transparent",
    color: "currentColor"
  },
  y: {grid: true, label: yLabel, tickFormat: tickFormat},
  x: {label: "Year", tickFormat: "d", grid: true},
  color: {legend: true},
  marks: [
    Plot.ruleY([0]),
    showBenchmarks ? Plot.lineY(minWageLine, {
      x: "Year",
      y: "Salary",
      stroke: "#ff6b6b",
      strokeWidth: 1.5,
      strokeDasharray: "4,4",
      tip: true,
      title: d => `Min wage: ${d.Salary.toFixed(indexBy === "Absolute salary" ? 0 : 2)}`
    }) : null,
    showBenchmarks ? Plot.text([minWageLine[minWageLine.length - 1]], {
      x: "Year",
      y: "Salary",
      text: () => "Min wage",
      dx: 5,
      fill: "#ff6b6b",
      fontSize: 11,
      textAnchor: "start"
    }) : null,
    showBenchmarks ? Plot.lineY(medianLine, {
      x: "Year",
      y: "Salary",
      stroke: "#00d4ff",
      strokeWidth: 1.5,
      strokeDasharray: "4,4",
      tip: true,
      title: d => `Median wage: ${d.Salary.toFixed(indexBy === "Absolute salary" ? 0 : 2)}`
    }) : null,
    showBenchmarks ? Plot.text([medianLine[medianLine.length - 1]], {
      x: "Year",
      y: "Salary",
      text: () => "Median wage",
      dx: 5,
      fill: "#00d4ff",
      fontSize: 11,
      textAnchor: "start"
    }) : null,
    Plot.lineY(data, {
      x: "Year",
      y: "Salary",
      stroke: "Rank",
      strokeWidth: 2.5,
      tip: true
    }),
    Plot.dot(data, {
      x: "Year",
      y: "Salary",
      stroke: "Rank",
      fill: "Rank",
      r: 2.5,
      tip: true
    })
  ].filter(Boolean)
})
Code
tableData = {
  const benchMap = new Map();
  for (const d of raw) {
    benchMap.set(+d.Year, {
      "Min wage": realTerms ? +d.MinWage_Annual_Real2025 : +d.MinWage_Annual_Nominal,
      "Median wage": realTerms ? +d.Median_FT_Annual_Real2025 : +d.Median_FT_Annual_Nominal
    });
  }
  return data.map(row => {
    const bench = benchMap.get(row.Year);
    return {
      Year: row.Year,
      Rank: row.Rank,
      Point: row.Point,
      Salary: row.Salary,
      "Min wage": bench["Min wage"],
      "Median wage": bench["Median wage"]
    };
  });
}

table = showTable ? Inputs.table(tableData, {columns: ["Year", "Rank", "Point", "Salary", "Min wage", "Median wage"]}) : html`<p style="color:#888;font-style:italic;">Toggle "Show data table" to inspect values.</p>`

This interactive tool tracks starting and top-of-scale salaries across UK police ranks from 1999 to 2025, with figures shown in both nominal pounds and real terms (adjusted to 2025 GBP using CPI) (Office for National Statistics 2025).

The data reveals a sharp real-terms decline for new constables following the 2013 Winsor reforms (Home Office 2013; BBC News 2013), and a broader stagnation across all ranks during the 2010–2020 austerity period (Social Market Foundation 2024). Recent large pay awards (2022–2025) have begun to reverse some of this erosion (PRRB 2024, 2025).

Use the controls to toggle ranks, switch between starting and top-of-scale pay, compare nominal versus real-terms values, and index salaries against minimum wage or median full-time earnings. Toggle “Show benchmark lines” to overlay the minimum wage and median wage on the chart — this works in all three index modes, including when salaries are themselves expressed as a multiple.

Minimum wage and median earnings comparison

Two useful benchmarks for police starting salaries are the UK minimum wage (now National Living Wage) and median full-time earnings, both expressed as full-time annual equivalents.

Minimum wage: In 2000, a new PC earned roughly 2.4× the minimum wage. By 2013, after the Winsor cut, this had fallen to 1.5×. In 2025, it has recovered to approximately 1.3× for post-2013 entrants. The Metropolitan Police premium has historically kept Met PCs at roughly 1.8–2.1× the minimum wage.

Median full-time earnings: In 2000, a new PC earned roughly 0.92× median full-time earnings — slightly below the UK median. By 2013, this had fallen to 0.71×. In 2025, a post-2013 PC starter earns approximately 0.78× median earnings, while a Metropolitan PC earns roughly 1.10×.

These ratios matter because they show whether policing remains an economically attractive career relative to both the legal floor and the typical middle-income job. The data suggests policing has slipped from a solidly middle-income profession to one that now sits closer to the median, with significant variation by force.

Source: ONS ASHE median gross weekly earnings for full-time employees (Office for National Statistics 2025).

Key findings

The 2013 Winsor cut

In 2013, the starting salary for new constables was cut from ~£23,000 to £19,000 as part of the Winsor reforms (Home Office 2013; BBC News 2013). This created a two-tier system: officers who joined before April 2013 remained on the legacy scale, while new entrants started lower and progressed more slowly (Home Office 2015).

The chart shows this as a sharp discontinuity for PC (National) in 2013. Metropolitan Police starters were less affected due to the London premium (Metfriendly 2019).

Real-terms decline

A constable starting in 2000 on £17,133 would need roughly £40,000 in 2025 to have equivalent purchasing power (UK Parliament 2000). The actual 2025 starting salary for post-2013 entrants is £31,164, a real-terms cut of roughly 22% versus 2000 (Police Federation of England and Wales 2025a; Points2Prove 2025). Even the pre-2013 scale (£32,820 in 2025) barely matches the inflation-adjusted 2000 starter.

This pattern repeats across ranks. Sergeant, Inspector, and Superintendent starting salaries all stagnated in real terms between 2010 and 2020 before recovering partially in 2022–2025 (PRRB 2024, 2025).

Rank progression

The data also reveals how the gap between ranks has changed over time:

In real terms, all ranks experienced decline or stagnation between 2010 and 2020, followed by partial recovery.

Metropolitan Police premium

The Metropolitan Police has historically paid a significant London premium. In 2005, the Met starter package (~£28,400) was ~44% above the national PC starter (£19,800). In 2024, the Met advertises £42,210, roughly 41% above the national post-2013 starter (£29,907) (Metfriendly 2019; PRRB 2024).

About this data

Methodology

  • PC (National & Metropolitan) data is year-by-year from official sources.
  • Sergeant, Inspector, and Superintendent data uses known anchor points with linear interpolation for intervening years.
  • Minimum wage data uses the adult National Minimum Wage / National Living Wage rate, expressed as a full-time annual equivalent.
  • Real-terms figures adjust nominal salaries to 2025 GBP using UK CPI (2015 = 100) (Office for National Statistics 2025).
  • Metropolitan Police starting salaries include London Weighting and London Allowances.

Data quality

Rank / Period Confidence Notes
PC National 1999–2025 High Multiple verified year-by-year sources
PC Metropolitan 1999–2025 High Met Police careers + Metfriendly
Minimum Wage 1999–2025 High GOV.UK historical rates
Sergeant, Inspector, Superintendent at 2000 High Direct from Hansard (UK Parliament 2000)
Sergeant, Inspector, Superintendent at 2024–2025 High Police Federation / Points2Prove
Sergeant, Inspector 2001–2023 Medium Linear interpolation between anchors
Superintendent 2001–2013, 2015–2023 Medium Linear interpolation; 2014 Winsor restructuring captured (Home Office 2015)

Interpolated years assume constant annual change between known anchor points. This smooths out actual year-to-year variations (e.g., the 2010–2012 pay freeze, sporadic awards in 2018–2021) but preserves the overall trajectory.

Sources

The complete list of sources, URLs, and confidence levels is documented in SOURCES.md.

References

BBC News. 2013. Police Pay to Start £4,000 Lower, at £19,000. https://www.bbc.com/news/uk-21027176.
Home Office. 2013. Police Pay: Winsor Review. https://www.gov.uk/guidance/police-pay-winsor-review.
Home Office. 2015. Independent Review of Police Officer and Staff Remuneration – Table of Progress. https://assets.publishing.service.gov.uk/media/5a804697ed915d74e622d821/2015_03_26_-_Winsor_-_Table_of_progress.pdf.
Metfriendly. 2019. Metfriendly Police Pay Scales 2019/20. https://cdn2.hubspot.net/hubfs/3349735/Metfriendly%20Police%20Pay%20Scales%202019%202020.pdf.
Office for National Statistics. 2025. Consumer Price Inflation, UK: January 2025. https://www.ons.gov.uk/economy/inflationandpriceindices.
Points2Prove. 2025. Police Pay Points Guide (2025/26). https://points2prove.co.uk/guidance/police-pay-points.
Police Federation of England and Wales. 2025a. Constable Pay Scales. https://polfed.org/resources/pay-scales/constable-pay-scales/.
Police Federation of England and Wales. 2025b. Inspector Pay Scales. https://polfed.org/resources/pay-scales/inspector-pay-scales/.
Police Federation of England and Wales. 2025c. Sergeant Pay Scales. https://polfed.org/resources/pay-scales/sergeant-pay-scales/.
PRRB. 2024. Police Remuneration Review Body – 10th Report 2024. https://assets.publishing.service.gov.uk/media/66a7a84cab418ab055592ef0/PRRB_2024_report_-_web_version.pdf.
PRRB. 2025. Police Remuneration Review Body – 11th Report 2025. https://assets.publishing.service.gov.uk/media/688cca3625ba7325501b096e/PRRB_11th_Report_2025_Accessible_v02.pdf.
Social Market Foundation. 2024. Examining British Police Pay and the P-Factor. https://www.smf.co.uk/commentary_podcasts/police-pay-and-p-factor/.
UK Parliament. 2000. House of Commons Hansard Written Answers for 15 Dec 2000. https://publications.parliament.uk/pa/cm200001/cmhansrd/vo001215/text/01215w11.htm.