US Food Safety Inspections - 7 sources, one result vocabulary
Pricing
from $2.00 / 1,000 inspection records
US Food Safety Inspections - 7 sources, one result vocabulary
Restaurant and food-facility inspections from 7 US health departments (~2.3M records) normalised into one schema with a unified pass/fail/conditional result.
Pricing
from $2.00 / 1,000 inspection records
Rating
0.0
(0)
Developer
Rishi Vinodkumar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
US Food Safety Inspections — 7 sources, one result vocabulary
Restaurant and food-facility inspections from seven US health departments, normalised into a single schema with one comparable pass/fail outcome.
~2,275,459 inspection records across 7 actively-maintained sources.
| Source | State | Records | Last verified |
|---|---|---|---|
| New York State | NY | ~1,399,201 | 2026-07-17 |
| Cincinnati | OH | ~341,246 | 2026-07-28 |
| Chicago | IL | ~313,437 | 2026-07-27 |
| King County (Seattle) | WA | ~106,077 | 2026-07-28 |
| Marin County | CA | ~49,461 | 2026-07-27 |
| Prince George's County | MD | ~45,073 | 2026-05-16 |
| Austin | TX | ~20,964 | 2026-05-22 |
Why this exists
The transport is identical everywhere (Socrata). The semantics are not. The inspection result — the one field anyone actually wants — is published six different ways:
| Jurisdiction | Column | Vocabulary |
|---|---|---|
| Chicago | results | Pass / Fail / Pass w/ Conditions |
| King County | inspection_result | Satisfactory / Unsatisfactory + numeric score |
| Cincinnati | action_status | Approved - No Violations / Approved - Minor Violations / Not In Compliance |
| Prince George's | inspection_results | Critical Violations observed |
| Marin County | inspection_result | NOVIOL / VIOLMINOR / VIOLFOUND |
| New York State | critical_violation | Critical Violation / Not Critical Violation |
| Austin | score | numeric 0–100, no pass/fail at all |
Anyone wanting "failed inspections across metros" has to learn all six. This
actor maps them to one result_status of PASS / FAIL / CONDITIONAL / OTHER /
UNKNOWN, and always keeps the original string in raw_result — a lossy
normalisation nobody can audit is worse than none.
The mapping is substring-based and order-sensitive, because these vocabularies contain each other:
"NOVIOL" contains "VIOL" -> must be tested first"Unsatisfactory" contains "Satisfactory" -> must be tested first"Approved - Minor Violations" -> must precede bare "Approved""Not Critical Violation" contains "Critical Violation" -> must be first
Get the order wrong and you silently invert a restaurant's grade.
test_results.py locks all of it down against strings observed in live data.
Three traps worth knowing
1. King County's score is inverted. inspection_score counts violation
points — lower is better. Sorting descending to find the worst offenders would
return the cleanest restaurants. Every record carries score_direction
(lower_better / higher_better / none) so the meaning travels with the data.
2. Cincinnati publishes enforcement actions, not graded inspections. Its
rows are approvals and compliance findings, so it yields few clean PASS/FAIL
outcomes relative to its size. Filtering failedOnly across all sources works,
but do not read Cincinnati's volume as comparable to Chicago's.
3. New York State rows are violations, not inspections. One inspection appears as several rows, so counting rows overstates inspection volume. It is also statewide excluding New York City, and it is the largest source here by a wide margin — leave it out if you want metro-level comparability.
Output
{"source": "chicago","source_label": "Chicago","state": "IL","facility_name": "MADISON TOBACCO INC.","license_number": "3082417","inspection_id": "2640288","inspection_date": "2026-07-28","inspection_type": "License","result_status": "PASS","raw_result": "Pass","score": null,"score_direction": "none","risk_category": "Risk 3 (Low)","violations": "49. NON-FOOD/FOOD CONTACT SURFACES CLEAN - Comments: OBSERVED DEBRIS...","address": "5134 W MADISON ST","city_name": "CHICAGO","zip_code": "60644","latitude": 41.8804954751,"longitude": -87.7540313826,"source_url": "https://data.cityofchicago.org/resource/4ijn-s7e5.json","source_dataset_id": "4ijn-s7e5"}
inspection_date, result_status, address, city_name and zip_code are
populated for 100% of records. Coordinates are published by Chicago, Cincinnati,
Marin and New York State only — King County, Prince George's and Austin
publish none.
Who this is for
- Food-delivery and restaurant-discovery platforms surfacing hygiene data
- Food-safety compliance vendors monitoring client portfolios
- Commercial insurers and underwriters pricing restaurant risk
- Local journalists and researchers tracking enforcement patterns
Usage
Failed inspections in the last quarter, geocoded:
{"sources": ["chicago", "king_county", "marin_county"],"inspectedAfter": "2026-05-01","failedOnly": true,"requireAddress": true,"maxResults": 2000}
Local development
pip install requestspython local_run.py --coveragepython local_run.py --after 2026-01-01 --limit 10python local_run.py --failed-only --after 2026-01-01 --limit 20python verify.py # health-check every sourcepython test_results.py # result-classification regression tests
Legal
Public, logged-out municipal open-data endpoints served through each jurisdiction's official Socrata API. No authentication, no account, no terms accepted, no anti-bot circumvention. Inspection results are public records published by the health department; facility names are businesses, not individuals. Rate limits are respected with exponential backoff.