Beta release. We are still refining and welcome feedback.

Methodology

How we collect and present each public-records source. Click a section to expand. The 311 entry is the deepest because it’s the source with the most cross-checking against the City’s own dashboards; other sources are stubs that we’ll flesh out as they get more use.

311 service requestsDetailed methodologyrva311 — daily, ~485k records since June 2018
+

How we collect

We collect from two publicly available City sources, both free and open to anyone. Records from each source are merged by request ID:

  1. Public REST API. Returns service type, date, location, coordinates, status, and community votes. Covers DPW (Public Works), DPU (Utilities), PDR (Planning), RPD (Police), and DPR (Parks). June 2018 – present.
  2. Power BI dashboard API. The same database behind the City’s Insights dashboard. Covers all departments — including DSS (Social Services), DOF (Finance), and HSD (Human Services) — and provides close dates. March 2021 – present.

When both sources have a record, the REST API provides the service categorization (service type and group) and the Power BI source provides the department and close date.

Example record

Here’s an actual request from our dataset — a pothole report with 5 community votes, submitted March 2026, resolved in 10 days:

FieldValueSource
Request IDDPW000228495City API
Service typePothole on RoadCity API
Service groupRoads, Alleys, Sidewalks and RampsCity API
SubmittedMar 2, 2026City API
StatusCompleted (code: 5)City API (code); label inferred by us
LocationCameron St & Ellwood AveCity API
Coordinates37.5580, -77.4904City API
Votes5City API
ClosedMar 12, 2026City Power BI dashboard
Council district1Assigned by us — point-in-polygon
Census tract51760050300Assigned by us — 2020 TIGER shapefiles

View this request on the City’s site: DPW000228495 on rva311.com. Every Public-visibility record (about 42% of our archive) has a link like this. Private-visibility records (the remaining ~58%, mostly benefits and hardship cases) are not published individually on the City’s site, so they have no per-record URL.

Status codes

The City’s API returns integer status codes. We inferred the labels by spot-checking numerous records against the City’s website:

API codeLabel on rva311.com
2Assigned
3In Progress
5Completed

Department tag provenance

The City began consistently tagging each 311 record with a department around 2022; older records often arrived without a tag at all. To present a complete department breakdown without silently mislabeling records, every record in our archive is classified into one of four buckets, and the source of its department tag is recorded alongside the value itself.

Source of department tagAll-timeLast 30 days
Tagged by the City directly432,6877,065
Inferred from request type54,05899
Inferred from record-ID prefix2,7730
Could not classify (department not displayed)8035
Total490,3217,169

Counts come from the live database. The all-time column reflects the entire archive; the last-30-days column shows recent ingestion. The ID-prefix bucket is mostly historical — the City tags new records with a department reliably enough that the prefix fallback rarely fires on recent records.

What each bucket means

  • Tagged by the City directly. The City’s data feed included a department on the record. We use it as-is.
  • Inferred from request type. The City left the department empty, but the request type (e.g., “Pothole on Road”) always maps to a single department in records the City did tag. We use that mapping. The lookup is derived at runtime from the tagged portion of the dataset.
  • Inferred from record-ID prefix. The request type was ambiguous (it appears under more than one department in tagged records), but the record ID begins with one of six prefixes that map to a named department with at least 99.6% reliability: DPW, DSS, DOF, DPU, PDR, HSD. Other prefixes that look departmental (e.g., RPD and CS0) are deliberately excluded — they have meaningful cross-department drift in the tagged data, so using them would mislabel records.
  • Could not classify. Neither the request type nor the record-ID prefix yielded a confident department. These records still appear in our archive, but we do not display a department label for them on public surfaces.

When we display a record whose department was inferred, the detail page surfaces a disclosure naming the department, the inference path, and the date the inference was applied. See any record with department_source beginning with inferred_from_ on the request detail page.

The unclassified records

803 records (0.16% of the archive). Each row below is a distinct combination of request type and record-ID prefix that neither inference path could resolve.

Request typeID prefixRecords
Abandoned Vehicles on City StreetRPD309
OLD Request Bulk Trash PickupCS0214
On Street Parking ViolationsRPD105
OLD Abandoned Vehicle on City StreetCS043
OLD Report On-Street Parking ViolationCS035
Request Collection of Storm Debris10127
OLD Report Missed Trash CollectionCS016
OLD Report Missed Recycling CollectionCS015
OLD Request Dead Animal RemovalCS08
Report Graffiti on Private PropertyCS08
OLD Contact Animal Care and ControlCS07
Clean Street1015
Request Police Attendance at Community Meeting or EventRPD4
TEST4_16CS03
Report Issue in Richmond City ParkDPR2
Report Graffiti on Public PropertyCS01
Request New Streetlight1011

Limitations and variances

  • Call center records excluded. The City’s system includes internal call center logs (IDs starting with “CS”). The City’s own dashboard excludes them, and so do we.
  • Pre-2021 data quality. About 7% of older records have garbled category values from system maintenance windows. These are excluded from analysis.
  • Close dates. 444 records from 2018–2019 are missing close dates because they predate our Power BI source. An additional 69 records are missing close dates in the City’s own data.
  • District assignment. About 100,000 records — mostly from Finance and Public Works — have no coordinates in the source data, so they cannot be assigned to a council district. An additional ~4,000 Social Services records have coordinates that fall outside the City’s district boundaries.
  • District boundary version. The City’s Power BI dashboard uses pre-2022 council district boundaries for its district assignments. We use the post-redistricting boundaries adopted by Ordinance 2022-132 on May 23, 2022. This causes our district counts to differ from the City’s dashboard by about 0.4% of records — primarily along the District 2 / District 3 boundary, which changed significantly in redistricting. Our boundaries are the legally current ones; the City’s dashboard has not yet been updated.
  • Duplicate closures. ~4% of completed requests were closed as duplicates. We include them because excluding changes median resolution time by less than 0.2 days.

Reconciliation with the City’s PBI dashboard

The City of Richmond publishes its 311 data on a public dashboard at rva311.com. It shows monthly counts of requests opened, requests closed, and breakdowns by department and neighborhood — but no single “currently open” total. We run a nightly comparison against the City’s published data, request by request, so we can catch drift early. Here’s how the most recent comparison lines up for a settled month, looking at Public Works (DPW):

WhatCityrvametricsDifference
DPW requests opened in March 20252,8362,8360
DPW requests closed in March 20253,4423,4420
DPW currently opennot published9,714

For older months, our archive matches the City’s data exactly. The most recent month or two can show a small lag — the City’s dashboard sometimes records a closure a day or two before we pick it up on the next sync, typically a sub-1% gap that closes on the following day. Settled months always come back to zero difference.

The “currently open” count isn’t something the City publishes. We add it up ourselves by counting every request the City’s system still has marked as Assigned or In Progress. About 16% of currently-open DPW requests were submitted before 2022 — we include them because the City’s system still has them flagged as open.

Definitions

Dates and timezones. All dates on this site are in Eastern Time (America/New_York), matching the City’s own dashboard.

Resolution time. Calendar days from submission to completion. Only computed for completed requests with close dates.

Service type vs. service group. Service type is the specific request (e.g., “Pothole on Road”). Service group is the category (e.g., “Roads, Alleys, Sidewalks and Ramps”).

Crime incidentsSource notesRPD CrimeInfo — daily, ~960k records since 2000
+
  • Source. HTML scrape of the Richmond Police Department’s public CrimeInfo app. Offense codes are NIBRS standard.
  • Coverage. 2000 to present, ~960k incidents across ~207 distinct offense codes and ~149 neighborhoods.
  • Addresses are block-level. RPD intentionally anonymizes individual addresses to the block (e.g., “33XX BROAD ST”). Good for street and neighborhood patterns; not precise to a building.
  • No per-incident URL. The CrimeInfo app doesn’t expose a permalink for individual incidents, so our detail pages are the canonical view.
  • What we don’t collect. Arrestee data (name, race, age, address, occupation) and vehicle data are deliberately excluded.
Building permitsSource notesEnerGov — daily, ~505k records since 1900
+
  • Source. Tyler Technologies’ EnerGov platform, accessed via a reverse-engineered POST API behind the City’s self-service portal. Undocumented but unauthenticated.
  • Coverage. 1900 to present, ~505k permits. Our detail pages link out to the permit’s case page on EnerGov self-service.
  • Geography. Permits inherit coordinates from the parcel they reference (~97% match rate). The remaining ~3% are gas and utility permits with no parcel — legitimately ungeocodable.
  • Sister datasets. Plan reviews, inspections, projects, and code-enforcement cases come from the same EnerGov platform via different search modules. They’re collected but not currently surfaced to subscribers — we add a source to the public side only after it passes our surface-certification process.
Land use casesSource notesPDR ArcGIS — weekly, ~1,628 cases
+
  • Source. The Planning & Development Review department’s curated LandUseProjectsNew ArcGIS layer.
  • What it covers. Active and recent planning pipeline cases — Special Use Permits, rezonings, PODs, subdivisions. Cases adopted by Council link to the ordinance.
  • What it doesn’t cover. This layer is curated by PDR staff mid-review and isn’t the intake layer. About 47% of adopted SUPs never appeared here, and new filings show up in the EnerGov plans dataset first. Filing-to-adoption typically takes 5–8 months.
  • Cross-references. The case’s file ID matches EnerGov plan case numbers and Special Use Permit file numbers, so the same case shows up in multiple datasets at different lifecycle stages.
Towed vehiclesSource notesTowViewing — daily, permanent archive
+
  • Source. HTML scrape of the City’s public TowViewing app.
  • Coverage. The City’s app only retains the most recent ~14 days. We snapshot daily and keep the full archive, which has been growing at roughly 70 tows per day in 2026.
  • Geography. ~94% of tows in the rolling 30-day window are precisely geocoded to a neighborhood. The remaining ~6% are structurally hard to geocode — highway tows, ambiguous intersections, malformed location strings — and are kept in the archive without a precise neighborhood tag.

Want a daily digest for your neighborhood? Subscribe.