Maricopa County Restaurant Inspections API – Phoenix (AZ)
Pricing
from $2.10 / 1,000 permit with inspection histories
Maricopa County Restaurant Inspections API – Phoenix (AZ)
Restaurant inspection grades (A–D) & violation history for Phoenix & Maricopa County, AZ. For food-safety research, lead lists and local apps. Search by ZIP or business name. Free sample (100 rows, real output): https://drive.google.com/uc?export=download&id=1AqtJBgB-sHU_QXVQgd55BkgPYDRsmLQj
Pricing
from $2.10 / 1,000 permit with inspection histories
Rating
0.0
(0)
Developer
Groundplane Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Features
Share
The Maricopa County restaurant inspections scraper gives you one row per restaurant permit (with its inspection history) for Phoenix & Maricopa County, AZ, straight from the public Restaurant Search endpoints of Maricopa County Environmental Services (envapp.maricopa.gov). No login or coding needed: run it in your browser, on a schedule, or through the Apify API, and export results as JSON, CSV or Excel.
Get food-establishment permits, letter grades and inspection history for Maricopa County, Arizona: Phoenix, Scottsdale, Tempe, Mesa, Chandler, Gilbert, Glendale, Peoria and more. Maricopa is the 4th-largest county in the US.
Who uses it
- Food-safety researchers, consultants and trainers tracking grade trends and repeat violations by area
- Restaurant suppliers, POS vendors and insurers researching local food businesses and market size
- Delivery apps, review sites and journalists who need grades in bulk
Free sample
Download a free sample (100 rows, real actor output, CSV): https://drive.google.com/uc?export=download&id=1AqtJBgB-sHU_QXVQgd55BkgPYDRsmLQj — check the columns and data quality before you run anything.
How to scrape Maricopa County restaurant inspections
- Click Try for free (or Start) on this page. A free Apify account is enough.
- Leave the prefilled input to get a quick sample, or set the filters described below.
- Set maxPermits to cap how many rows (and how much) a run returns.
- Click Start and wait a few seconds to a minute.
- Download the results as JSON, CSV or Excel, or connect them to Google Sheets, Zapier, Make or a webhook.
Input
| Field | Meaning |
|---|---|
zipCodes | Search by ZIP code (one search per ZIP) |
businessNames + city | Search by part of the business name, optionally within one city (e.g. TEMPE) |
permitTypeContains | For example Eating & Drinking |
includeInspections | Adds the inspection history (one extra request per permit) |
onlyGrades | Exact grade values, e.g. ["C","D"]. Matches the latest graded inspection. Needs includeInspections (the run fails with a clear message otherwise). |
maxPermits, maxInspectionsPerPermit, requestDelaySecs (0.5–10 s, default 1 s) | Limits and politeness delay |
maxScanSeconds (default 180) | Time budget for the run, enforced inside every request and retry and capped at the run timeout minus 30 s. When it runs out the run returns what it found, with a PARTIAL: status. |
ZIP codes must be 5 digits; invalid ones are skipped with a warning. If you give no ZIP codes and no business names, the run falls back to example ZIP 85281, capped at 20 permits. If you give a business name, no ZIP is added: a name-only search returns only name matches (and only in city if given). Like the county's own search page, a city search must also include a business name. For whole areas, search by ZIP.
onlyGrades on big ZIPs
Grades are only known after each permit page is read (about 1.5 s per permit), and C or D grades are uncommon. With the default 180 s budget a run checks roughly 100 permits, so a large ZIP may return only a few C/D matches and end PARTIAL: time budget reached. To scan a whole large ZIP, set maxScanSeconds to about 1200 and the run timeout (Run options) to about 1300 s, or search several smaller ZIPs.
Example input (quick canary)
{"zipCodes": ["85281"],"includeInspections": true,"maxPermits": 5}
Output (one row per permit)
Rows are sorted by latestInspectionDate, newest first, within the permits scanned: the run takes the first maxPermits matching permits in the county's search order, then sorts them (permits with no inspections on record come last).
permitId, businessName, permitType, address, zip, cuttingEdgeParticipant, inspectionCount, latestInspectionDate, latestGrade, latestGradeDate, latestLetterGrade, latestPriorityViolations, inspections[{date, purpose, grade, status, priorityViolations, reportUrl}], detailUrl
Grade values
The county uses more than A–D. latestGrade is taken from the newest inspection that has a grade, so ungraded Food Advisory visits are skipped (latestInspectionDate is still the newest visit of any kind). Values you will see:
A,B,C,D: letter grades- other text values the county shows on some inspections (for example Cutting Edge labels)
R: county code shown on some inspectionsNot Participating: the establishment isn't in the voluntary grading programnull: no graded inspection on record
Stale grades: if a permit's newest inspection has no grade, latestGrade comes from an older graded inspection. Compare latestGradeDate with latestInspectionDate to see when that happens.
latestLetterGrade holds only a plain A–D letter, or null. inspectionCount is the total number of inspections listed on the permit page, before the maxInspectionsPerPermit trim.
Data source & responsible use
Why not an API? Maricopa County publishes no open-data API or bulk file for food inspections (checked October 2026). This Actor reads the same public JSON search endpoint and permit pages that the county's own Restaurant Search page uses. That backend is not documented, so the Actor checks every response: if the county renames a field, changes the inspection table or the date format, the run says PARTIAL: schema drift ... instead of returning wrong data. It sends an honest User-Agent, no proxies, and waits about one second between requests. Every request has a timeout and is retried with backoff on rate limits (HTTP 429) and server errors.
Terms risk, please read. This Actor uses an undocumented county web endpoint, not an official open-data API. Of all our restaurant inspection Actors, this one carries the most terms-of-use risk: the county could change or block the endpoint, and it has not granted an open-data license. Before using the data commercially, review Maricopa County's website terms of use and get your own legal advice if needed. The Actor reads slowly (about one request per second) and does not bypass any access controls.
The Actor reads the same public endpoints as the county's Restaurant Search page (envapp.maricopa.gov). It needs no login and reads at about one request per second. The data covers business permits and inspection outcomes only, as the county publishes them. It does not collect contact details such as emails or phone numbers. Note that some sole-proprietor businesses are listed under the owner's name. Inspection records are public, and the county keeps reports for 3 years. Not affiliated with Maricopa County.
Pricing (pay per event)
$3 per 1,000 permits ($0.003 each), plus Apify's minimal $0.00005 start fee. Example: the prefilled input (ZIP 85281, 100 permits) costs about $0.30. An empty input runs a 20-permit sample for about $0.06. If a run hits your max charge limit, it stops cleanly and reports how many rows it delivered.
Sample output
{"permitId": "FD-00021","businessName": "Hackett House","permitType": "Food Establishment - Eating & Drinking","address": "95 W 4th ST TEMPE AZ 85281","zip": "85281","cuttingEdgeParticipant": false,"detailUrl": "https://envapp.maricopa.gov/Permit/PermitResults/FD-00021","searchedBy": {"Zip": "85281"},"scrapedAt": "2026-10-12T17:53:29.560468Z","inspectionCount": 6,"inspections": [{"date": "2026-05-01","purpose": "Food Routine Inspection","grade": "A","status": "Completed","priorityViolations": 0,"reportUrl": "https://envapp.maricopa.gov/Inspection/FD-00021/INSP-209844-2025"},{"date": "2025-10-22","purpose": "Food Routine Inspection","grade": "A","status": "Completed","priorityViolations": 0,"reportUrl": "https://envapp.maricopa.gov/Inspection/FD-00021/INSP-084373-2025"}],"latestInspectionDate": "2026-05-01","latestGrade": "A","latestGradeDate": "2026-05-01","latestLetterGrade": "A","latestPriorityViolations": 0}
Source, license & data caveats
Data is provided as published on the county's public Restaurant Search (envapp.maricopa.gov). The county publishes no open-data license for this search. Inspection results are public records under Arizona public records law (A.R.S. § 39-121), and use of the site is subject to Maricopa County's website terms of use. Check the county's terms before commercial reuse. Grades reflect the county's voluntary Cutting Edge program.
Run status messages
Complete: 100 permits (reached maxPermits=100): everything worked.Complete: 0 permits. ...: the county search had no matches for your filters.PARTIAL: ...: some data could not be read (county site errors after retries, a format change, the scan time budget, or your max charge limit). Rows already collected are kept. Every row is validated; rows that fail are skipped, counted and named in the status, never pushed half-filled. APARTIAL:status also appears if a ZIP that should have permits returns none (the Actor re-checks with known-good ZIP 85281), or if grades suddenly can't be read: too many recent routine inspections with a blank grade, permits with no grade at all, unknown grade labels, or a Priority Violation column that is no longer a number. If the only reason is your own max charge limit, the status says so and nothing is wrong with the source.
Troubleshooting
If a run ends PARTIAL because of county site errors or schema drift, try again later; if it keeps happening, please open an issue on this actor's Issues tab and we'll fix it fast. Found a problem or need a field? Open an issue on the Issues tab; we respond quickly.
Quick test input (returns a few rows in under 30 seconds): {"zipCodes": ["85281"], "maxPermits": 5}
Known gaps: latestGrade is null when a permit has no graded inspection on record; in our October 2026 test of ZIP 85281 about a third of permits showed Not Participating. Some business names are a person's name, because that is how the county lists the permit holder.
Changelog
-
0.3 (2026-10-27): docs: free-sample section + store refresh; no code changes.
-
0.2.3 (2026-10-24): Grade checks (blank recent routine grades, no-grade rate, unknown grade labels), Priority Violation text check, 0-result check for business-name searches too, batched output.
-
0.2.2 (2026-10-24): Every search row validated, 0-result check against a known-good ZIP, grade-column check, time budget enforced inside retries and capped at the run timeout (default 180 s), rows sorted newest first.
-
0.2 (2026-10-24): Retries with backoff on every request, schema checks on every county response with clear
PARTIAL:statuses, inspection table read by column name, ZIP validation,maxScanSecondstime budget, cleaner status messages. -
0.1 (2026-10-11): First release.
FAQ
How much does it cost to scrape Maricopa County restaurant inspections?
You pay $0.003 per result ($3 per 1,000) plus a $0.00005 start fee, and nothing else. That is the free-plan price: on paid Apify plans you pay less per result (Bronze 10%, Silver 20%, Gold and above 30% off). Apify's free plan includes $5 of monthly credit, which covers about 1,600 results. See Pricing above for a worked example.
Is it legal to scrape Maricopa County restaurant inspections?
This Actor reads public records from the public Restaurant Search endpoints of Maricopa County Environmental Services (envapp.maricopa.gov), using only public endpoints (no login, no CAPTCHA bypass, no private accounts). See the source/license section above for the dataset's terms. You are responsible for how you use the data; this is not legal advice.
How fresh is the data?
Each run reads the county's search live, so new inspections appear as soon as the county posts them (usually within days of the visit). The county keeps about 3 years of inspection history per permit.
Can I use it via API, on a schedule, or with Google Sheets?
Yes. Every Apify Actor has a REST API and client libraries for Python and JavaScript. You can schedule daily or weekly runs, and send results to Google Sheets, Slack, Zapier, Make, n8n, webhooks, or an AI agent via the Apify MCP server.
How do I know the Actor is working today?
Run the quick test input {"zipCodes": ["85281"], "maxPermits": 5}. It should finish in under 30 seconds with a Complete: status and at least one row. We run this same check on a schedule; if it ever ends PARTIAL:, please open an issue on the Issues tab.
I need another city, county or field. Can you add it?
Open an issue on the Issues tab with the city or data source you need. We build new public-records scrapers regularly.
More public-records scrapers by Groundplanes
Same clean output, pay-per-result pricing and official public data sources:
Restaurant & food inspections
- Las Vegas Restaurant Inspections & Grades Scraper (SNHD)
- Pittsburgh Restaurant Inspections Scraper (Allegheny County)
- Delaware Restaurant Inspections Scraper — Statewide Violations
- Boulder CO Restaurant Inspections Scraper — 2013–2026 Snapshot
- Montgomery County MD Restaurant & Food Inspections Scraper
- NY State Restaurant Inspections Scraper — NYSDOH, Non-NYC
- Boston Restaurant Inspections Scraper — Health Violations
- Santa Clara County Restaurant Inspections Scraper — San Jose
Code violations & code enforcement
- Pittsburgh Code Violations Scraper
- Orlando FL Code Enforcement Scraper
- New Orleans Code Violations Scraper