US Food Safety Inspections - 7 sources, one result vocabulary avatar

US Food Safety Inspections - 7 sources, one result vocabulary

Pricing

from $2.00 / 1,000 inspection records

Go to Apify Store
US Food Safety Inspections - 7 sources, one result vocabulary

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

Rishi Vinodkumar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

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.

SourceStateRecordsLast verified
New York StateNY~1,399,2012026-07-17
CincinnatiOH~341,2462026-07-28
ChicagoIL~313,4372026-07-27
King County (Seattle)WA~106,0772026-07-28
Marin CountyCA~49,4612026-07-27
Prince George's CountyMD~45,0732026-05-16
AustinTX~20,9642026-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:

JurisdictionColumnVocabulary
ChicagoresultsPass / Fail / Pass w/ Conditions
King Countyinspection_resultSatisfactory / Unsatisfactory + numeric score
Cincinnatiaction_statusApproved - No Violations / Approved - Minor Violations / Not In Compliance
Prince George'sinspection_resultsCritical Violations observed
Marin Countyinspection_resultNOVIOL / VIOLMINOR / VIOLFOUND
New York Statecritical_violationCritical Violation / Not Critical Violation
Austinscorenumeric 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 requests
python local_run.py --coverage
python local_run.py --after 2026-01-01 --limit 10
python local_run.py --failed-only --after 2026-01-01 --limit 20
python verify.py # health-check every source
python test_results.py # result-classification regression tests

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.