I mapped 40 years of Santa Cruz crime data: here’s what it can’t tell you
Official totals say reported Part I crime in Santa Cruz County fell from 15,611 in 1985 to 4,644 in 2025. Mapping the incidents behind those totals shows how little of the record is actually public.
CruzLens started as a crime map of Santa Cruz County. The goal was simple: put every public crime report on a map, going back as far as the records go. What we learned building it is mostly about what the records leave out.
There are two very different kinds of crime data here. Official annual totals go back 41 years, but say nothing about where. Incident reports say where, but only a fraction of them are public, for windows ranging from a month to a few decades.
Source: California DOJ OpenJustice, Crimes and Clearances with Arson 1985–2025 · Data: doj-santa-cruz.json · Code: CruzLens
Show the data (41 rows)
| Year | Part I | Violent | Property | Arson | Agencies reporting |
|---|---|---|---|---|---|
| 1985 | 15,611 | 1,085 | 14,450 | 76 | 11 |
| 1986 | 15,121 | 1,248 | 13,754 | 119 | 11 |
| 1987 | 14,324 | 1,146 | 13,073 | 105 | 11 |
| 1988 | 13,508 | 1,067 | 12,376 | 65 | 11 |
| 1989 | 13,486 | 1,023 | 12,413 | 50 | 11 |
| 1990 | 13,794 | 1,099 | 12,620 | 75 | 11 |
| 1991 | 13,775 | 1,253 | 12,454 | 68 | 11 |
| 1992 | 14,078 | 1,594 | 12,409 | 75 | 11 |
| 1993 | 14,138 | 1,704 | 12,344 | 90 | 10 |
| 1994 | 15,006 | 1,677 | 13,239 | 90 | 10 |
| 1995 | 13,940 | 1,757 | 12,086 | 97 | 10 |
| 1996 | 13,399 | 1,774 | 11,550 | 75 | 10 |
| 1997 | 12,285 | 1,613 | 10,577 | 95 | 10 |
| 1998 | 10,051 | 1,394 | 8,591 | 66 | 9 |
| 1999 | 8,761 | 1,065 | 7,612 | 84 | 9 |
| 2000 | 8,735 | 1,187 | 7,504 | 44 | 9 |
| 2001 | 10,171 | 1,203 | 8,910 | 58 | 9 |
| 2002 | 10,208 | 1,099 | 9,037 | 72 | 9 |
| 2003 | 11,187 | 1,268 | 9,865 | 54 | 9 |
| 2004 | 10,654 | 1,198 | 9,397 | 59 | 9 |
| 2005 | 11,459 | 1,155 | 10,255 | 49 | 9 |
| 2006 | 11,104 | 1,083 | 9,936 | 85 | 9 |
| 2007 | 10,194 | 1,239 | 8,866 | 89 | 9 |
| 2008 | 9,201 | 1,247 | 7,882 | 72 | 9 |
| 2009 | 10,341 | 1,215 | 9,059 | 67 | 9 |
| 2010 | 9,642 | 1,313 | 8,267 | 62 | 9 |
| 2011 | 9,952 | 1,169 | 8,744 | 39 | 9 |
| 2012 | 9,793 | 1,041 | 8,709 | 43 | 9 |
| 2013 | 9,202 | 1,002 | 8,140 | 60 | 9 |
| 2014 | 9,312 | 1,139 | 8,121 | 52 | 9 |
| 2015 | 10,502 | 1,171 | 9,282 | 49 | 9 |
| 2016 | 10,624 | 1,101 | 9,485 | 38 | 9 |
| 2017 | 10,072 | 1,056 | 8,947 | 69 | 9 |
| 2018 | 8,603 | 989 | 7,530 | 84 | 9 |
| 2019 | 8,165 | 1,106 | 7,005 | 54 | 9 |
| 2020 | 7,200 | 970 | 6,155 | 75 | 9 |
| 2021 | 6,604 | 1,052 | 5,478 | 74 | 9 |
| 2022 | 6,510 | 1,200 | 5,239 | 71 | 9 |
| 2023 | 5,018 | 1,070 | 3,886 | 62 | 10 |
| 2024 | 5,045 | 939 | 4,027 | 79 | 9 |
| 2025 | 4,644 | 862 | 3,728 | 54 | 9 |
The 41-year view: totals without places
The California Department of Justice publishes annual counts for every police agency in the state. For Santa Cruz County that is 391 agency-year rows from 41-year series like the Santa Cruz Police Department to short-lived ones like the Pajaro Coast state parks unit.
The long view is clear: reported Part I crime was 15,611 in 1985, the highest year in the series, and 4,644 in 2025. Almost all of that decline is property crime (−74.2%). Violent crime moved much less (−20.6%), with a rise through the mid-1990s:
Source: California DOJ OpenJustice, Crimes and Clearances with Arson 1985–2025 · Data: doj-santa-cruz.json · Code: CruzLens
Three things in the DOJ file make the trend harder to read than the chart suggests:
- Definitions changed. The rape definition broadened in 2014, and from 2021 the DOJ combines old summary-format submissions with converted incident-based (NIBRS) ones. A step at either year can be a counting change.
- Agencies come and go. 11 agencies reported in 1985 and 9 in 2025; Cabrillo College’s police stopped appearing after 1997.
- No denominators. The file has counts, not rates. The county’s population and its summer visitors changed over 41 years, and the totals don’t adjust for either.
And none of the totals have a location below the agency. A Sheriff’s count covers everything from Boulder Creek to La Selva Beach.
The incident view: places without completeness
To map crime you need incident records with addresses, and in Santa Cruz County those come from several sources, each with its own gap:
- Santa Cruz Police publishes approved activity logs as PDFs. Each covers about a day and is kept online for roughly 30 days, so a map built today only reaches back about a month. Our first snapshot held 485 reports from 32 documents.
- The Sheriff publishes case-log PDFs. The index page labels some of them with the wrong month (a July file labeled June), so dates are read from inside the documents. Six PDFs added 2,119 reports covering April to July 2026.
- Watsonville publishes scanned logs that need OCR. Of 20 indexed documents, 15 were readable; five failed our validation checks and are shown as gaps rather than guessed at.
- UC Santa Cruz and Scotts Valley have public case maps going back to 1997 and 2012, which added 5,399 and 719 cases.
- Capitola’s public map refuses queries older than 12 months; it added 65 reports.
Put together, the sample is dominated by whoever publishes the most:
Source: SCPD, Sheriff and Watsonville logs; UCSC, Scotts Valley and Capitola public maps · Data: cruzlens.json · Code: CruzLens
Show the data (12 rows)
| Community | Mapped reports |
|---|---|
| Santa Cruz | 6,196 |
| Scotts Valley | 749 |
| UC Santa Cruz | 456 |
| Watsonville | 408 |
| Aptos | 252 |
| Soquel | 196 |
| Unspecified | 145 |
| Felton | 127 |
| Boulder Creek | 120 |
| Capitola | 80 |
| Ben Lomond | 61 |
| La Selva Beach | 20 |
The city of Santa Cruz accounts for 70% of the 8,810 mapped records, and Watsonville for 408. That is not because Watsonville has little crime: over 2016–2025 its police reported 13,471 Part I crimes to the DOJ. It is because its logs are scanned, short-lived and partly unreadable. A gap on the map means missing records, not safety, and CruzLens draws unknown coverage in gray instead of green.
Wrangling PDFs without leaking people
Police logs are written for people, not machines. Turning them into rows meant:
- reading text positions from the PDF rather than eyeballing columns, and falling back to OCR for scans;
- keeping only the location and charge columns, and dropping names, ages and narrative text at parse time;
- deduplicating cases that appear in several daily documents, keeping the newest version;
- placing each report at the center of its block, never at an exact address, and leaving unmatched locations unmapped rather than guessing.
That parser became its own tool, blotter2csv, which drops personal names and narratives by default.
What the data can’t tell you
- Whether a neighborhood is safe. Reports reflect what was reported and published, not what happened, and publication windows differ by agency from a month to decades.
- Trends at the block level. The long series are countywide agency totals; the block-level records mostly cover the last year.
- Comparisons between communities. Different agencies, sources and windows make rates meaningless across places.
What it can do is show what the public record contains, link every report to its source and make the gaps visible. That is why the current CruzLens default view is a map of crashes, spills, water quality and other conditions of places, with crime as one small, optional layer. The design rules behind that map are in a separate post.
Methods
- Annual totals. California DOJ "Crimes and Clearances with Arson, 1985–2025", all Santa Cruz County agencies summed by year (
scripts/derive_doj.py). Part I = violent (homicide, rape, robbery, aggravated assault) + property (burglary, vehicle theft, larceny-theft) + arson. Negative or blank published values are treated as unknown, not zero. Our 2016–2025 total for the Santa Cruz Police Department (28,606) matches CruzLens exactly. - Incident sample. Counts by published community label from the CruzLens police snapshot. Source descriptions, document counts and OCR failures are from the CruzLens README and
docs/SOURCES.md.
Limits
The DOJ uses a hierarchy rule (generally only the most serious offense per incident is counted, with arson separate), so totals undercount offenses. Agency boundaries do not match community names. The incident sample is a snapshot and changes every time logs expire or new ones are published.
Data and code
Every number and chart in this post is generated from these files:
The projects that collected the data:
- CruzLens source · live demo
- blotter2csv (source not published yet)