What Your City's 311 Log Actually Confirms — and How to Read It Like a Beat Reporter
A 311 request is a small act of faith. You tap through an app or dial a number, describe a broken thing, and trust that somewhere a person writes it down. What most residents never see is the second half: the record, the assignment, the closure code, the timestamp eight months later. That database is public in most American cities, and it is the closest thing local government has to a diary.
This is a working guide to reading it. Not to prove your city is failing — to find out what it is actually doing, and to ask about the parts that don't add up.
Start with the portal, not the complaint
Search your city or county website for 'open data' or '311 data.' Many municipalities run on Socrata, where you can export any dataset as a CSV from a button in the corner or by adding a filter to the URL. Others use ArcGIS Open Data hubs or CKAN catalogs. If your city has a public 311 dashboard with charts, look for the download link underneath it, because the dashboard is a summary and summaries hide things.
If nothing is published, file a public records request with the city clerk or the department that runs 311. Ask for service request records for a defined period, in electronic format, with these fields: request ID, request type, date created, date closed, current status, street address or coordinates, and the agency assigned. Mention your state's public records statute by name. Keep the request narrow enough that a clerk can fill it without a legal review.
The columns that carry the story
The date created tells you demand. The date closed tells you responsiveness. The gap between them is what residents actually experience, and it is almost never the same as the number on the dashboard.
The status field is where honesty goes to die. A ticket marked 'closed' may mean repaired, may mean inspected and found to be someone else's responsibility, may mean the crew drove past and saw nothing, or may mean a supervisor cleared a backlog before an audit. Look for fields named resolution, disposition, or close code, if they exist. If they don't exist, that absence is itself a finding worth raising.
Also check whether the dataset includes the responsible department and the council district. Without those two columns, you can measure the city but not hold anyone specific to a timeline.
Clean it before you count it
Sort by date and delete obvious duplicates — the same address reported four times in one afternoon by four frustrated neighbors is one problem, not four. Watch for test entries, internal work orders mixed into the public feed, and category names that shift mid-year when the software was upgraded. Note the date ranges where the data looks thin; a sudden 90 percent drop in requests is usually a system migration, not a miracle.
Then compare medians rather than averages. One culvert project that sat open for two years will drag an average into nonsense. The median tells you what the typical request experienced, which is the number your neighbor would recognize.
Compare districts, but adjust first
Raw counts favor big, dense neighborhoods — more people, more reports. Divide before you compare. Pothole requests per mile of paved street. Illegal dumping reports per 1,000 residents. Streetlight outages per square mile of residential blocks. Census tract data is free and joins to addresses easily enough with a spreadsheet function or a free geocoder.
Plot your council district against the citywide median for the same request type and the same quarter. A district that files more requests than average may have more broken things, or it may simply have more people who know the app exists. That distinction matters, and it is the kind of nuance that makes a council member listen instead of bristle.
Watch the closure patterns, not just the volume
Three patterns are worth a closer look. First, bulk closures: dozens or hundreds of tickets closed on a single date, often the last day of a fiscal quarter. Second, same-day closures: a high rate can mean fast, efficient triage, or it can mean tickets never left the front desk. Third, reopens: if you can access a reopen field, it is the closest thing to a confession that the first fix didn't take.
Map the open tickets by neighborhood and the picture gets sharper. Concentrations along one arterial suggest a maintenance schedule. Scattered clusters in a few blocks suggest something structural — a drainage problem, an absentee landlord, a route that crews skip.
Turn the spreadsheet into a question that lands
A council meeting rewards specificity. 'The city doesn't care about our street' gets a sympathetic nod and nothing else. Instead, try this shape: a number, a comparison, and a request.
Something like: 'In the third quarter, the median time to close a pothole request in District 4 was 61 days, compared with 19 days citywide. Can public works explain the difference, and will the department publish quarterly closure times by district?'
That question has a source, a benchmark, and an ask. It also has an implicit deadline, which is what separates a comment from a campaign.
Publish your work
Post the cleaned spreadsheet. Link the portal. Show the query you used. Every number you put in public is a number the city has to either confirm or correct, and either outcome teaches the rest of us something.
One caution before you go: 311 is not a census of what's broken. It's a census of who called. The block with no requests may be the block with no broadband, no English-language flyer, and no reason to believe anyone answers. Reading the data is step one. Asking who never shows up in it is step two.