Portland for All · Emergency-Response Data Brief

Portland Police vs Fire — Response Since 2019

How emergency response times, call volumes, and staffing have changed for Portland Police Bureau and Portland Fire & Rescue.

Updated June 2026 Fiscal years (Jul–Jun) 90th-percentile, high-priority calls Sources & how to verify ↓

Reading these charts: the bureaus measure response time on different clocks — fire's is turnout+travel; police's also includes time a call waits in the dispatch queue. Compare trends, and compare like-for-like (travel vs travel). Every chart has a copyable data table beneath it.

How Portland prioritises 911 calls — high, medium & low

When a 911 call comes in, a BOEC dispatcher assigns it a priority number (1–9) by urgency and danger — not by the type of incident. PPB rolls those into three tiers. The same kind of call can fall in any tier depending on severity: a crash with injuries is High, a fender-bender is Low.

High (priority 1–3)
Immediate threat to life or safety, usually still in progress. e.g. shots fired, an assault, a threat, a behavioral-health crisis, a crash with injuries. These are the calls the headline response-time figures track — the city's official speed yardstick.
Medium (priority 4)
An officer is needed, but there's no immediate danger. e.g. an unwanted person, a welfare check, a theft just discovered, a road hazard.
Low (priority 5–9)
Minor or after-the-fact, often with no active scene. e.g. a building alarm, a cold theft or stolen-vehicle report, a follow-up visit, a harassment report.

Tiers: PPB Dispatched Calls open data (Priority field, PriorityNumber 1–9). Examples are the most common call categories in each tier, 2024.

Plain-language explainer — how to talk about this data

Four things to understand to read these charts correctly — written plainly, so they can be paraphrased into a post or a web page.

1 · What “response time” means

Response time = the wait in the dispatch queue + the travel to the scene — the clock as the caller feels it, from the moment 911 has your emergency to the moment help is at the door. The queue (waiting for a free unit to be sent) is the part that explodes when staffing is short; travel is the drive. We add them together because that total is what people actually experience — a metric that counts travel only would hide the part of the wait that got worst.

For the public: “Response time is the whole wait — from when 911 has your emergency to when help arrives — not just the drive.”

2 · Why “p90,” not the average

p90 means 9 of 10 calls are answered faster than this number; 1 in 10 is slower. Two reasons it’s the right yardstick: (a) it’s the national public-safety standard — NFPA 1710, the fire benchmark this comparison is anchored to, is defined as a p90 target (on scene within 5:20 for 90% of high-priority calls), so matching it keeps police and fire like-for-like. (b) the average hides the crisis; p90 exposes it — response times are lopsided: most calls are normal, but a long tail drags out badly, and that tail is the harm we care about. When a system is overwhelmed the tail blows up first, so p90 moves sharply while the average barely twitches. PPB publishes averages, which makes the problem look smaller than it is.

For the public: “We report the 1-in-10 worst wait — that’s the emergency people actually fear, and it’s the national standard fire is graded on.”

3 · Why these numbers differ from Nick’s (high-priority vs. all calls)

If two response charts show different numbers, it’s almost always which calls are counted — not a contradiction. These charts use high-priority calls only (life-safety / urgent); Nick’s chart blends all calls (high + medium + low). We use high-priority because it’s a true emergency-response number — routine calls drag the figure down until it stops looking like emergency response — and because it matches fire, which is also high-priority. Blending in low-priority calls makes the change look less alarming, not because things improved but because routine calls dilute the signal. Our chart axes now say “high-priority” so the two can sit side by side without confusion.

4 · Why we don’t headline “police are X minutes slower than fire”

The two bureaus start their stopwatches at different moments: police response includes the dispatch-queue wait; fire’s clock starts later, at unit notification, so it excludes that wait. That alone makes the police number structurally larger. So the honest comparison isn’t a single minutes gap — it’s direction: police response is degrading several times faster than fire’s, and where the same component exists on both sides (travel vs travel) we compare those.

For the public: “We’re not claiming police are exactly N minutes slower than fire — the bureaus time things differently. The story is the direction: police response is getting worse, fast, while fire’s has held.”

Other presentations of this chart (internal reference)#

Same data — cost per call $969→$1,387 and high-priority response 15→41 min — drawn three other ways. Cost is zero-based; response is labeled where its axis is truncated.

Variant#

Portland police: costly and slow

Police cost per call (up) and high-priority response time (down), 2020 through 2025

2026-06-24T12:06:43.237416 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 0 250 500 750 1000 1250 1500 cost per police call ($) $969 $1,025 $1,039 $1,170 $1,348 $1,387 2020 2021 2022 2023 2024 2025 0 10 20 30 40 high-priority response (min) 15 min 20 min 25 min 36 min 38 min 41 min longer bar = slower response Source: City of Portland adopted budgets; PPB Staffing Report; PF&R Annual Performance Reports; BOEC budget docs.

⤓ Download this chart (PNG)

Mirror (bars): cost rises above the centre line, response time falls below it — both grow away from centre.

Variant#

Portland police: costly and slow

Police cost per call and high-priority response time, side by side, 2020 through 2025

2026-06-24T12:06:43.303750 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 200 400 600 800 1000 1200 1400 1600 cost per police call ($) $969 $1,025 $1,039 $1,170 $1,348 $1,387 Cost = total all-funds budget ÷ all dispatched calls (an efficiency ratio, not marginal cost). Cost per call ($, left) Response time (min, right) 0 10 20 30 40 50 high-priority response (min) 15 20 25 36 38 41 Source: City of Portland adopted budgets; PPB Staffing Report; PF&R Annual Performance Reports; BOEC budget docs.

⤓ Download this chart (PNG)

Dual axis with side-by-side labeled bars — no line over the chart.

Variant#

Portland police: costly and slow

Police cost per call (up) and high-priority response time (down), shaded — 2020 through 2025

2026-06-24T12:06:43.368825 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 0 250 500 750 1000 1250 1500 cost per police call ($) $969 $1,025 $1,039 $1,170 $1,348 $1,387 2020 2021 2022 2023 2024 2025 0 10 20 30 40 high-priority response (min) 15 min 20 min 25 min 36 min 38 min 41 min deeper fill = slower response Source: City of Portland adopted budgets; PPB Staffing Report; PF&R Annual Performance Reports; BOEC budget docs.

⤓ Download this chart (PNG)

Mirror as shaded areas — the same read as the bar mirror with less ink.

Who got left behind: response by precinct#

The citywide police numbers above are an average across three precincts that did not fare alike. Police calls carry a location, so they disaggregate geographically (fire data is citywide only, so fire stays a citywide benchmark and is not split here).

Geographic chart 1#

The slowest police response is concentrated in East Portland

FY2025 p90 high-priority police response (incl. dispatch-queue wait), by PPB precinct

2026-06-24T12:06:43.990277 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ Central 40:11 (+214% vs FY2020) East 46:33 (+216% vs FY2020) North 36:20 (+131% vs FY2020) 36:20 46:33 FY2025 p90 high-priority response Source: PPB Dispatched Calls open data (RegJIN), each call geocoded to a PPB precinct (City of Portland GIS boundaries). Police only — fire data is citywide. Boundaries verified stable 2019–25. See METHODOLOGY.md for the spatial-join method.

⤓ Download this chart (PNG)

What this shows. The latest (FY2025) p90 high-priority response — the full wait including the dispatch queue — drawn on the city map. Each of PPB's three precincts is shaded by how long a high-priority call waits there now (darker = slower), labeled with that wait and its change since FY2020. Same numbers as the line chart below, placed in space.

What to look for. The map removes any doubt about where the slowdown lands. The deepest shade sits over East Portland — the lower-income, most diverse part of the city. The worst response isn't scattered citywide; it is concentrated in the precinct that was already the slowest to begin with.

FY2025 p90 high-priority police response by precinct (mm:ss)
PrecinctFY2025 responseChange since FY2020
Central40:11+214%
East46:33+216%
North36:20+131%
The value shading each precinct on the map. Full response incl. dispatch-queue wait; PPB only, boundaries verified stable 2019–25.
Geographic chart 2#

The slowdown fell hardest on East Portland

p90 high-priority police response by precinct (incl. dispatch-queue wait), FY2020–2025

2026-06-24T12:06:44.039948 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 10 20 30 40 50 p90 high-priority response (minutes) 40:11 46:33 36:20 Full response incl. dispatch-queue wait. PPB precinct boundaries verified stable 2019–25 (last revised Dec 2019) — see METHODOLOGY.md. Central Precinct East Precinct — hardest hit North Precinct Source: PPB Dispatched Calls open data (RegJIN), each call geocoded to a PPB precinct (City of Portland GIS boundaries). Police only — fire data is citywide. Boundaries verified stable 2019–25. See METHODOLOGY.md for the spatial-join method.

⤓ Download this chart (PNG)

What this shows. Police high-priority response — the full wait including the dispatch queue — drawn separately for each of PPB's three precincts. Each call is placed in a precinct by its own latitude/longitude (a spatial join to the current PPB district boundaries); fire stays citywide and is not shown here.

What to look for. The collapse is not evenly spread. East Portland — the lower-income, most diverse precinct — is the slowest in every single year and rose the most in absolute terms. The citywide average hides that the worst-served part of the city got left furthest behind.

p90 high-priority police response by precinct (mm:ss), fiscal year
FYCentralEastNorth
202012:4714:4515:45
202115:2020:5922:34
202220:3326:3327:09
202328:1349:4432:17
202433:3446:5634:30
202540:1146:3336:20
FY2020→FY2025 change: Central +214%, East +216%, North +131%. Full response incl. dispatch-queue wait. PPB only; boundaries verified stable 2019–25.
Geographic chart 3#

In every precinct the dispatch queue — not travel — is the new wait

p90 high-priority police response split into travel + queue, by precinct and fiscal year

2026-06-24T12:06:44.127075 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ ’20 ’21 ’22 ’23 ’24 ’25 0 10 20 30 40 50 p90 high-priority response (minutes) Central ’20 ’21 ’22 ’23 ’24 ’25 East ’20 ’21 ’22 ’23 ’24 ’25 North Source: PPB Dispatched Calls open data (RegJIN), each call geocoded to a PPB precinct (City of Portland GIS boundaries). Police only — fire data is citywide. Boundaries verified stable 2019–25. See METHODOLOGY.md for the spatial-join method. Travel Dispatch-queue wait

⤓ Download this chart (PNG)

What this shows. Each precinct's p90 response split into travel (blue, the drive) and dispatch-queue wait (orange, time before any unit is sent). Queue here is the derived penalty (full response minus travel), so each stacked bar sums to that precinct's p90 response.

What to look for. Travel barely moves anywhere — the growth is the orange queue segment in all three precincts, and it is deepest in East. The mechanism is the same citywide (no free car to send), but its weight lands hardest where response was already worst.

FY2025 p90 response by component, by precinct (mm:ss)
PrecinctTravelDispatch-queue waitTotal response
Central13:3426:3740:11
East15:5130:4246:33
North17:2318:5736:20
Queue = full response − travel (a derived penalty; p90 components don't sum). Latest complete fiscal year.

Every tier got slower: response by call priority#

The headline charts above track high-priority calls — the like-for-like match against fire. But the dispatch-queue collapse hit every priority of call. Police calls carry a priority code, so they break out by tier (High = priority 1–3, Medium = 4, Low = 5–9 — what falls in each tier?).

Priority-tier chart 1#

Every priority of call now waits far longer — not just the urgent ones

p90 police response by call-priority tier (incl. dispatch-queue wait), citywide, FY2020–2025

2026-06-24T12:06:44.203454 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 50 100 150 200 p90 police response (minutes) 40:59 118:13 227:06 Full response incl. dispatch-queue wait, citywide. High = priority 1–3 (the city's response-time set); Medium/Low added here. See METHODOLOGY.md. High priority Medium priority Low priority — longest wait Source: PPB Dispatched Calls open data (RegJIN), citywide. p90 response (dispatch-queue + travel) by call-priority tier. Police only — fire publishes only its high-priority metric, so it is not split by tier. See METHODOLOGY.md.

⤓ Download this chart (PNG)

What this shows. Police p90 response — the full wait including the dispatch queue — drawn separately for each call-priority tier. High is priority 1–3 (the set the city publishes a response time for); Medium and Low are added here. Fire publishes only its high-priority metric, so it is not split by tier.

What to look for. The collapse is not confined to urgent calls. Every tier climbs steeply, and the lower the priority the longer the absolute wait — a low-priority call now takes the better part of an hour at the 90th percentile. The high-priority line (the one matched against fire) is the floor, not the whole story.

p90 police response by priority tier (mm:ss), fiscal year
FYHighMediumLow
202014:3235:30103:35
202119:4673:44180:36
202224:3981:55175:03
202336:17110:00193:56
202438:01108:33192:12
202540:59118:13227:06
FY2020→FY2025 change: High +182%, Medium +233%, Low +119%. Full response incl. dispatch-queue wait. PPB only, citywide. High = priority 1–3, Medium = 4, Low = 5–9.
Priority-tier chart 2#

The dispatch queue is the new wait at every priority level

p90 police response split into travel + queue, by priority tier and fiscal year

2026-06-24T12:06:44.284340 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ ’20 ’21 ’22 ’23 ’24 ’25 0 50 100 150 200 p90 police response (minutes) High priority ’20 ’21 ’22 ’23 ’24 ’25 Medium priority ’20 ’21 ’22 ’23 ’24 ’25 Low priority Source: PPB Dispatched Calls open data (RegJIN), citywide. p90 response (dispatch-queue + travel) by call-priority tier. Police only — fire publishes only its high-priority metric, so it is not split by tier. See METHODOLOGY.md. Travel Dispatch-queue wait

⤓ Download this chart (PNG)

What this shows. Each tier's p90 response split into travel (blue, the drive) and dispatch-queue wait (orange, time before any unit is sent). Queue here is the derived penalty (full response minus travel), so each stacked bar sums to that tier's p90 response.

What to look for. Travel barely moves at any priority — the growth is the orange queue segment across all three tiers. The same mechanism (no free car to send) drives the delay whether the call is urgent or not.

FY2025 p90 response by component, by priority tier (mm:ss)
TierTravelDispatch-queue waitTotal response
High priority15:4225:1740:59
Medium priority17:54100:19118:13
Low priority19:35207:31227:06
Queue = full response − travel (a derived penalty; p90 components don't sum). Latest complete fiscal year.

What police choose vs what the public calls about: stops & call mix#

Everything above is reactive — 911-dispatched calls. This section adds the proactive half: officer-initiated stops (Oregon STOP Act data). They are a separate clock and are never blended with dispatched calls. Inspired by the 2022 Catalyst California finding that police spend most proactive time on traffic, not violent crime — with the honest caveat that Oregon records no stop duration, so these are stop counts and shares, not officer-hours.

Stops chart 1#

Who gets stopped has shifted — White share down, Black & Hispanic share up

Share of PPB officer-initiated driver stops by perceived race, 2015–2024

2026-06-24T12:06:44.345704 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2016 2018 2020 2022 2024 0 10 20 30 40 50 60 70 share of officer-initiated stops (%) 57% 18% 16% 5% 2% 1% 1% Perceived race as recorded by the officer. 'Unknown/Other' was retired as an option in June 2018. Share, not count — total stop volume varies year to year. See METHODOLOGY.md. White Black/African American Hispanic or Latino Asian Middle Eastern Native Hawaiian American Indian/Alaskan Source: PPB Stops Data Collection annual reports (Oregon STOP Act / HB 2355), validated against each report's printed totals. Officer-INITIATED (proactive) stops — a separate universe from dispatched calls. No stop-duration field exists in Oregon data, so figures are stop COUNTS/shares, never officer-hours.

⤓ Download this chart (PNG)

What this shows. The share of PPB officer-initiated driver stops going to each perceived-race group, every year 2015–2024. These are proactive stops (the officer chose to initiate them under Oregon's STOP Act) — a different universe from the 911-dispatched calls in the rest of this report. Share, not count: each year's bars are of that year's stop total.

What to look for. White drivers' share falls from ~70% to ~57% while the Black/African American share holds near 18% and the Hispanic/Latino share more than doubles (8%→16%) — both well above their population share. The report cannot reproduce California's officer-hours figure (Oregon records no stop duration), so this is composition, not time.

Share of officer-initiated driver stops by perceived race (%), calendar year
CYWhiteBlack/African AmericanHispanic or LatinoAsianMiddle EasternNative HawaiianAmerican Indian/Alaskan
201569.8%13.2%7.6%4.7%0.3%
201668.1%13.4%8.2%5.0%0.3%
201766.1%16.6%8.3%4.5%0.3%
201864.2%17.6%9.3%5.0%0.8%0.4%0.5%
201965.2%17.2%9.9%5.0%1.4%0.8%0.5%
202065.4%17.1%10.6%4.6%1.2%0.7%0.4%
202163.9%17.9%11.4%4.3%1.3%0.7%0.4%
202261.9%18.9%12.4%3.7%1.5%0.9%0.6%
202358.6%18.9%14.4%5.1%1.8%0.9%0.4%
202456.8%18.1%16.3%5.4%2.1%0.8%0.6%
2015→2024. Perceived race as recorded by the officer; 'Unknown/Other' (retired June 2018) omitted from columns. Validated against each PPB Stops report's printed totals. Share, not count.
Stops chart 2#

Officers choose traffic stops; the public calls about disorder

Traffic as a share of officer-INITIATED stops vs community-dispatched calls

2026-06-24T12:06:44.401877 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ Officer-initiated stops Community-dispatched calls 0 20 40 60 80 100 share within each universe (%) 98% traffic 2% other 9% traffic 91% other TWO DIFFERENT CLOCKS — never summed. Left: what officers chose to stop people for (PPB Stops, 2024). Right: what the public called about (Dispatched Calls, CY2025). Neither carries a time-on-task field, so this is share of activity, not share of hours. Traffic Everything else Source: PPB Stops Data Collection annual reports (Oregon STOP Act / HB 2355), validated against each report's printed totals. Officer-INITIATED (proactive) stops — a separate universe from dispatched calls. No stop-duration field exists in Oregon data, so figures are stop COUNTS/shares, never officer-hours.

⤓ Download this chart (PNG)

What this shows. Two side-by-side bars, each adding to 100% within its own universe: what officers chose to stop people for (left, PPB Stops 2024) vs what the public called about (right, Dispatched Calls). The bars are never summed — they have different denominators and different clocks.

What to look for. Nearly all proactive stops — ~98% — cite only a traffic offense, while traffic is under a tenth of what the community dispatches police to. This is the Portland echo of the Catalyst California finding: officer-initiated police effort flows overwhelmingly to traffic enforcement, not to the violent crime the public most associates with policing.

Traffic as a share of each universe — never summed
UniverseTrafficEverything else
Officer-initiated stops (proactive)98.1%1.9%
Community-dispatched calls (reactive)8.7%91.3%
Stops: PPB Stops Data Collection 2024 (traffic-offense-only vs other-crime). Calls: PPB Dispatched Calls CY2025 (FinalCallGroup). Different denominators, different clocks; neither is time-on-task.
Stops chart 3#

Most calls police are dispatched to are disorder — not violent crime

Composition of dispatched demand by call group, share of all calls

2026-06-24T12:06:44.460269 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 0 20 40 60 80 100 share of dispatched calls (%) Disorder 45% Crime 28% Traffic 9% Community-initiated demand — call MIX, not time allocation. Disorder Crime Traffic Alarm Civil Assist Other Community Policing Source: Portland Fire & Rescue Annual Performance Reports; PPB Dispatched Calls open data (RegJIN). See METHODOLOGY.md — police & fire use different response-time clocks.

⤓ Download this chart (PNG)

What this shows. The composition of dispatched demand — community-initiated 911/non-emergency calls — by call group, as a share of all calls per year. This is the reactive universe: what Portlanders call police about.

What to look for. Disorder/quality-of-life calls are the largest bucket (~46%), with Crime next; Traffic is a small slice (~8%). This is call mix, not time on task (the data carries no time-on-scene field) — so it shows what police are asked to handle, which is mostly not violent crime.

Dispatched-call composition by group, CY2025
Call groupCallsShare
Disorder94,93545.5%
Crime58,23127.9%
Traffic18,1048.7%
Alarm12,1245.8%
Other10,2194.9%
Civil8,3494.0%
Assist6,5453.1%
Community Policing2330.1%
Community-initiated dispatched demand (call mix, not time allocation). FinalCallGroup field, PPB Dispatched Calls open data.
Stops chart 4#

Two different jobs: what the public calls about vs what officers go looking for

Share of dispatched calls by type vs officer-initiated stops by reason, 2024

2026-06-24T12:06:44.517565 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 47% 28% 8% 7% dispatched 911 / non-emergency calls What the public calls about 98% officer-initiated stops, by reason cited What officers go looking for Traffic offense Other crime Traffic is a thin slice of what the community calls about — but nearly the whole of what officers stop people for. TWO DIFFERENT UNIVERSES — never summed. Stops use the REASON cited (not filing division). PPB Stops Data Collection 2024 + PPB Dispatched Calls (RegJIN) CY2024. See METHODOLOGY.md. Disorder Crime Traffic Alarm Civil Other Assist Community Policing

⤓ Download this chart (PNG)

What this shows. The two universes side by side, as a single 2024 snapshot: the full category mix of dispatched calls (left) against officer-initiated stops by reason cited (right). Traffic is the same colour in both, so the eye carries from the thin call slice to the near-whole stop circle. Two different denominators — never summed.

What to look for. What the public calls about is diverse — disorder 47%, crime 28%, traffic only ~8%. What officers initiate is monolithic — ~98% of stops cite a traffic offense. The same Traffic wedge that is a sliver of community demand is essentially the entire proactive workload.

Dispatched-call mix vs officer-initiated stop mix, 2024
CategoryCountShare of its universe
What the public calls about (dispatched)
  Disorder92,47346.5%
  Crime54,66727.5%
  Traffic16,1728.1%
  Alarm13,7886.9%
  Civil7,8043.9%
  Other7,4453.7%
  Assist6,1453.1%
  Community Policing1780.1%
What officers initiate (stops, by reason)
  Traffic offense23,71798.1%
  Other crime4501.9%
Two separate universes, never summed. Calls: PPB Dispatched Calls (RegJIN) CY2024, FinalCallGroup. Stops: PPB Stops Data Collection 2024, REASON cited (traffic-offense-only vs other-crime) — not filing division.

Demand vs absence: calls are falling, yet a quarter of overtime covers absent officers#

Two plain questions behind the response-time story. First, is demand rising? No — total dispatched volume is flat-to-down. Second, where is the staffing going? A standing share of overtime exists purely to backfill absent officers — the closest public proxy for absenteeism, since Oregon publishes no per-officer sick-leave series. Together: the slowdowns land against falling calls and a force too thin to cover its own shifts.

Demand chart 1#

Total calls to Portland police are falling

All dispatched police calls per year, with the high-priority subset, 2020–2025

2026-06-24T12:06:44.575194 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 50 100 150 200 dispatched calls (thousands) 224k 226k 213k 204k 199k 209k 70k 72k 64k 58k 52k 51k -7% since 2020 Total community demand — call COUNTS, not officer-hours. High-priority subset All dispatched calls Source: Portland Fire & Rescue Annual Performance Reports; PPB Dispatched Calls open data (RegJIN). See METHODOLOGY.md — police & fire use different response-time clocks.

⤓ Download this chart (PNG)

What this shows. Total dispatched police demand per calendar year, 2020–2025 — every 911/non-emergency call PPB was sent to (green bars), with the high-priority subset broken out (purple line). This is the reactive universe — what the community calls police about — counted, not weighted by time on scene.

What to look for. Demand is flat-to-down: total calls slip from ~224k to ~209k (−7%), and the high-priority subset falls harder, ~70k→51k (−27%). So the rising response times elsewhere in this report are not a story of surging demand — calls went down while waits went up, which points back at staffing, not call volume.

Total dispatched police calls by calendar year
CYAll callsHigh-priorityΔ vs 2020
2020224,48470,389+0.0%
2021225,74071,611+0.6%
2022213,12864,211-5.1%
2023204,40258,150-8.9%
2024198,67252,137-11.5%
2025208,74251,207-7.0%
2020→2025. PPB Dispatched Calls open data (RegJIN). Call COUNTS — community-initiated demand, not officer-hours or time on task.
Demand chart 2#

About 1 in 4 police overtime hours just covers an absent officer

Sworn overtime worked to backfill absent members, vs all sworn overtime, 2020–2025

2026-06-24T12:06:44.629673 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 5 10 15 20 25 30 sworn overtime (thousands of hours) 26% 6.1k 20% 4.1k 23% 5.1k 28% 6.9k 26% 7.0k 22% 6.4k All sworn overtime Backfilling absent officers Source: City of Portland Police Overtime dashboard (PPB open data) — sworn ranks only, calendar year. 'Backfill' is the dataset's own flag: hours worked covering a member who is absent. Hours, not dollars. Absence-coverage is a proxy — Oregon publishes no per-officer sick-leave series. See METHODOLOGY.md.

⤓ Download this chart (PNG)

What this shows. How much overtime exists purely to cover absent officers. Each bar is all sworn overtime for the year (grey); the orange chunk is the City overtime dashboard's own “Backfill” flag — “working a shift for a member who is absent.” Oregon publishes no per-officer sick-leave series, so backfill overtime is the closest measurable absenteeism proxy — it counts the hours absence forces onto someone else.

What to look for. Backfill is a steady ~22–28% of all sworn overtime — about one in four OT hours just covers an absent colleague — and the absolute burden climbed from ~4.1k hours (2021) to ~7.0k (2024). Whatever the cause of the absences, the bureau is paying overtime to cover open shifts rather than leaving them empty, year after year.

Sworn overtime — total vs absence backfill, by calendar year (hours)
CYAll sworn OTBackfill (absent-cover)Backfill share
202023,8376,11025.6%
202119,8204,07120.5%
202222,1295,09923.0%
202324,6756,85627.8%
202426,6187,01726.4%
202529,0136,42722.2%
2020→2025. City of Portland Police Overtime dashboard (PPB open data), sworn ranks only. 'Backfill' = the dataset's own flag for working a shift for an absent member. Work Hours (actual), not pay-multiplied.

Shareable posts — plain-language single-chart versions#

Post-ready cuts of the charts above: one idea each, a plain title baked in, and the caveats written on the image so they stand alone on social. Same data as the report — just framed for sharing.

Shareable post# 2026-06-24T12:06:44.681077 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 0 25 50 75 100 125 150 175 Change in response time since 2020 (%) +11% +182% Comparing Fire and Police emergency response times Fire response times Police response times Police = full response incl. wait for a dispatcher; fire = turnout + travel. Source: Portland Fire & Rescue Annual Performance Reports; PPB Dispatched Calls open data (RegJIN).

⤓ Download this chart (PNG)

Police vs fire response, one plain line each — the headline +182% police figure with the two-clocks caveat spelled out for a general audience.

Shareable post# 2026-06-24T12:06:44.734802 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 2026 650 700 750 800 850 900 Staffing (people) 729 774 881 798 Comparing Portland Fire and Police staffing levels Fire personnel Police officers (sworn) Fire = total budgeted personnel (FTE); police = filled sworn officers, all ranks. Source: City of Portland adopted budgets; PPB Staffing Report; PF&R Annual Performance Reports; BOEC budget docs.

⤓ Download this chart (PNG)

Fire vs police staffing on one chart — fire grew, police shrank — sized and labelled for a social card.

Shareable post# 2026-06-24T12:06:44.790275 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2016 2018 2020 2022 2024 0 10 20 30 40 50 60 70 Share of officer-initiated stops (%) 57% 18% 16% Black share of city population ≈ 6% Hispanic or Latino share of city population ≈ 12% Who Portland police pull over — and who actually lives here White Black/African American Hispanic or Latino Black and Hispanic drivers are stopped far above their share of Portland's population; the dotted lines are that population share. Source: PPB Stops Data Collection annual reports (Oregon STOP Act / HB 2355), validated against each report's printed totals. Officer-INITIATED (proactive) stops — a separate universe from dispatched calls. No stop-duration field exists in Oregon data, so figures are stop COUNTS/shares, never officer-hours. Population: U.S. Census Bureau, ACS 2020–2024 5-Year Estimates (table DP05), Portland city, OR.

⤓ Download this chart (PNG)

The racial-disparity trend with dotted city-population reference lines, so the over-representation of Black & Hispanic drivers reads at a glance.

Sources — every figure traces back to the original data#

This report asserts nothing it can’t show you. Every dataset below is the City of Portland’s own published record (or the U.S. Census) — click through to check any number yourself. Charts that combine or re-cut these (e.g. the dispatch-queue split, or the overtime “Backfill” proxy) describe exactly how in each chart’s caption and the methodology notes.

Full data brief — all other charts, key findings & glossary

The complete 10-chart analysis behind the chart above. Collapsed for review; expand for the full evidence base.

Key findings

+182%
police full response, FY2020→FY2025 (14:32→40:59)
+11% vs +34%
fire vs police travel time — police degrades ~3× faster on the like-for-like clock
934→798
police sworn officers: FY2020 peak to FY2026 — never recovered
$237M→$308M
PPB total budget (all funds) over the same window — more money, fewer officers
-26%
police high-priority demand FY2020→FY2025 — calls fell while response slowed (a staffing story, not a surge)

PPB is asking for a bigger budget. The data says money isn’t the binding constraint — staffing is, and staffing has not followed the dollars.

How to read these charts (key terms)
90th percentile (p90)
the time within which 9 of every 10 calls were answered — a worst-case yardstick that captures the slow tail people actually feel, not the flattering average. “p90 of 15:00” means 1 call in 10 took longer than 15 minutes.
High-priority calls
the most urgent dispatches (PPB priority 1–3: in-progress crimes, injuries, threats to life). Filtering to these compares each bureau on the calls where speed matters most.
Response clock
Fire measures turnout + travel (time from alarm to arrival). Police response also includes time in the dispatch queue — so the two clocks are not directly comparable. The honest comparison is the trend over time, plus like-for-like parts (travel vs travel).
Time in dispatch queue
for police, the wait after a 911 call-taker has logged the call, until a unit is actually sent. It measures officer availability (no free car to dispatch) — it is not the 911 phone-answer delay.
Fiscal year (FY)
Portland's fiscal year runs Jul–Jun, so FY2020 = Jul 2019–Jun 2020. Fire reports come by fiscal year; charts here use FY. Police FY2019 is incomplete (data starts Jan 2019), so trends are indexed to FY2020.
Confidence markers
on the staffing charts, solid dots are figures confirmed or reported from a primary source; hollow dots (and a trailing * in the tables) are estimates still being verified — treat them as directional. Police filled-sworn counts are sourced figures (PPB staffing reports, City adopted budgets, news citations).
Officer-initiated stop
a stop the officer chose to make (a traffic or pedestrian stop), as recorded under Oregon's STOP Act (HB 2355). This is proactive policing — a different universe from a 911-dispatched call, which the community initiates. The two are never summed in this report.
Stop reason (traffic vs other)
PPB records whether a stop cited only a traffic offense or invoked some other crime. In 2024, ~98% of officer-initiated stops were traffic-only — the proactive-effort echo of the Catalyst California finding. Oregon records no stop duration, so this is share of stops, not officer-hours.
Call group
PPB buckets every dispatched call into eight groups (Disorder, Crime, Traffic, Alarm, Civil, Assist, Other, Community Policing). Disorder/quality-of-life calls are the largest share (~46%); traffic is small (~8%). This is call mix — what the public asks police to handle — not time on task.
Chart 2#

Dispatch queue — not travel — drives the police delay

Police high-priority response, split into its two components (minutes)

2026-06-24T12:06:43.463797 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 5 10 15 20 25 30 35 40 minutes Fire (for reference) Travel time Time waiting in dispatch queue Source: Portland Fire & Rescue Annual Performance Reports; PPB Dispatched Calls open data (RegJIN). See METHODOLOGY.md — police & fire use different response-time clocks.

⤓ Download this chart (PNG)

What this shows. The police high-priority response time, split into its two parts: the blue bar is actual travel time; the orange bar stacked on top is time waiting in the dispatch queue. The dashed line is fire, for scale.

What to look for. The orange (queue) segment grows from a sliver into the majority of the bar. The slowdown isn't cars driving slower — it's calls waiting longer for any car to be free, which points at officer availability, not traffic.

Police high-priority p90 response by component (mm:ss)
FYTravelDispatch-queue waitTotal responseFire (ref)
202011:452:4714:327:38
202113:246:2219:467:57
202213:5510:4424:397:55
202314:3421:4336:178:19
202415:0922:5238:018:27
202515:4225:1740:598:27
Chart 3#

Fewer calls, slower response — a staffing crisis, not a surge

Police high-priority demand vs speed, by fiscal year

2026-06-24T12:06:43.520411 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 10 20 30 40 50 60 70 high-priority calls (thousands) High-priority calls (000s) response (min) 0 5 10 15 20 25 30 35 40 response time (minutes) Source: Portland Fire & Rescue Annual Performance Reports; PPB Dispatched Calls open data (RegJIN). See METHODOLOGY.md — police & fire use different response-time clocks.

⤓ Download this chart (PNG)

What this shows. Two things on one chart for police: green bars are the number of high-priority calls; the purple line is how slow p90 response got. If rising demand were the cause, bars and line would climb together.

What to look for. They move in opposite directions — calls fall while response times rise. Fewer calls but slower service is the signature of a capacity / staffing problem, not a demand surge.

Police high-priority demand vs speed, by fiscal year
FYHigh-priority callsp90 response (mm:ss)
202070,77014:32
202170,90919:46
202268,41724:39
202361,97936:17
202453,29538:01
202552,21240:59
Chart 4#

Even fire is slipping further below its own standard

Share of high-priority fire responses meeting the 5:20 turnout+travel target

2026-06-24T12:06:43.566525 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 0 20 40 60 80 100 % within 5:20 NFPA 1710 target: 90% Police publishes no equivalent response-time standard. Fire: % of high-priority responses within 5:20 Source: Portland Fire & Rescue Annual Performance Reports; PPB Dispatched Calls open data (RegJIN). See METHODOLOGY.md — police & fire use different response-time clocks.

⤓ Download this chart (PNG)

What this shows. The share of high-priority fire responses that arrive within the 5:20 benchmark. The dotted line is the NFPA 1710 national target of meeting that standard 90% of the time.

What to look for. Even fire — the better-performing bureau — is drifting below its own target and trending down. It's still far ahead of police, but the direction is the wrong way for everyone.

Fire high-priority responses within the 5:20 standard
FY% within 5:20
201958%
202055%
202149%
202248%
202344%
202443%
202542%
NFPA 1710 target: 90%. Police publishes no equivalent standard.

Why more budget won’t fix it: staffing & dollars#

Chart 5#

More money, fewer cops — PPB's budget rose as its ranks fell

PPB total budget (all funds) vs filled sworn officers, by fiscal year

2026-06-24T12:06:43.622757 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 2026 0 50 100 150 200 250 300 budget ($ millions) PPB total budget ($M, all funds) Sworn officers (filled) 780 800 820 840 860 880 900 920 940 sworn officers (filled) Source: City of Portland adopted budgets; PPB Staffing Report; PF&R Annual Performance Reports; BOEC budget docs.

⤓ Download this chart (PNG)

What this shows. PPB's total budget, all funds (blue bars) against the number of filled sworn officers (purple line). “Sworn” = badge-carrying police, as opposed to civilian staff.

What to look for. The money line climbs from ~$237M to ~$308M while officers fell from a 2020 peak of 934 into the high-700s — more dollars are buying fewer cops on the street. That undercuts the claim that a bigger budget is what produces more policing capacity.

PPB total budget (all funds) vs filled sworn officers
FYBudget (all funds)Filled sworn
2019881
2020$236.8M934
2021$223.3M824
2022$230.9M773
2023$249.0M809
2024$261.7M804
2025$282.4M822
2026$308.5M798
Chart 6#

PPB can't fill the jobs it already funds

Authorized vs filled sworn officers — the gap is unfilled funded positions

2026-06-24T12:06:43.674691 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 2026 0 200 400 600 800 1000 sworn officers Funded but UNFILLED (vacancies) Authorized (funded) positions Officers actually on staff Source: City of Portland adopted budgets; PPB Staffing Report; PF&R Annual Performance Reports; BOEC budget docs.

⤓ Download this chart (PNG)

What this shows. Two officer counts: authorized (positions the budget already funds) and filled (officers actually on staff). The shaded band between them is unfilled funded positions — jobs the city is paying for but can't fill.

What to look for. The shaded gap persists and widens. PPB isn't blocked by a lack of funding — it can't hire and retain up to the headcount it's already funded for. More budget can't fix a hiring problem.

Authorized vs filled sworn officers (the gap = unfilled funded jobs)
FYAuthorized (funded)FilledUnfilled gap
20191,001881120
2020916934-18
202188282458
2022882773109
202388180972
202483980435
202587782255
Chart 8#

Fire staffed up and held its response; police did neither

Filled sworn officers (police) vs total personnel (fire, FTE) — y-axis starts at 650

2026-06-24T12:06:43.730128 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 2026 650 700 750 800 850 900 Staffing (people) 729 774 881 798 Fire staffing (FTE) Police staffing (sworn) Source: City of Portland adopted budgets; PPB Staffing Report; PF&R Annual Performance Reports; BOEC budget docs.

⤓ Download this chart (PNG)

What this shows. Both bureaus' staffing in absolute headcount — police filled sworn officers and total fire personnel (FTE). The y-axis starts at 650 (not zero) so the year-to-year movement is legible; the values are real counts, not an index.

What to look for. Police peaked at 934 sworn in FY2020, shed ~160 officers by FY2022 after the 2020 budget cuts and the wave of departures, and never recovered — even as its budget kept climbing. Fire, by contrast, grew its ranks and held its response. Staffing, not budget, is what tracks with service.

Bureau staffing — absolute headcount (FY2019 index shown for reference)
FYFire FTEPolice swornFire indexPolice index
2019729881100100
202072593499106
202173582410194
202275277310388
202380080911092
202480080411091
202577482210693
202679891
Chart 9#

As police staffing fell, response time blew up

Filled sworn officers vs full high-priority response (incl. dispatch-queue wait), FY2020–2025

2026-06-24T12:06:43.791697 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 780 800 820 840 860 880 900 920 940 filled sworn officers Filled sworn officers high-priority response, full (min) 0 5 10 15 20 25 30 35 40 response time (minutes) +182% Source: PPB Staffing Report & City adopted budgets (staffing); PPB Dispatched Calls open data (RegJIN) & PF&R Annual Performance Reports (response). Police & fire use different response clocks — see METHODOLOGY.md.

⤓ Download this chart (PNG)

What this shows. Police filled sworn officers (blue, left axis) against p90 full response time including the dispatch-queue wait (purple, right axis), FY2020–2025. The response axis is zero-based; each line is read by its direction.

What to look for. The lines open like scissors: as officers fall, response time climbs — full p90 response is up +182% across the window. Fewer officers, dramatically slower service.

Police: filled sworn officers vs p90 full response, by fiscal year
FYFilled swornp90 response, full (mm:ss)
202093414:32
202182419:46
202277324:39
202380936:17
202480438:01
202582240:59
Chart 10#

Fire added staff — and held its response

Total fire personnel (FTE) vs high-priority response (turnout+travel), FY2019–2025

2026-06-24T12:06:43.851094 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 730 740 750 760 770 780 790 800 fire personnel (fte) Fire personnel (FTE) high-priority response (turnout+travel, min) 0 1 2 3 4 5 6 7 8 response time (minutes) +14% Source: PPB Staffing Report & City adopted budgets (staffing); PPB Dispatched Calls open data (RegJIN) & PF&R Annual Performance Reports (response). Police & fire use different response clocks — see METHODOLOGY.md.

⤓ Download this chart (PNG)

What this shows. The same pairing for fire: total personnel in FTE (vermillion, left axis) against p90 response — turnout+travel (purple, right axis). The response axis is zero-based, so the line's near-flatness is honest, not a scaling trick.

What to look for. Fire grew its staffing and its response held — up just +14% over six years, a fraction of police's blow-up. The contrast is the whole argument: staffing tracks service.

Fire: total personnel (FTE) vs p90 response, by fiscal year
FYFire FTEp90 response (mm:ss)
20197297:24
20207257:38
20217357:57
20227527:55
20238008:19
20248008:27
20257748:27