Export Florida restaurant inspections, closures and new licenses
Pick a dataset, filter by county, city, or ZIP code, and keep a list of inspection results, emergency closures, or newly licensed restaurants that you can refresh each week.
What you’ll make
A spreadsheet with one row per inspection, emergency closure, or food service license, depending on the dataset you choose. Every row carries the license number, business name, address, and source information. You’ll need an Apify account and a spreadsheet app. The actor reads a weekly copy of the files that Florida’s Division of Hotels and Restaurants publishes.
An inspection row describes the day of that inspection. Its violation list gives counts by the Division’s categories, without the inspector’s written notes. Phone numbers appear in the license datasets where the Division publishes them, and no dataset contains email addresses.
1. Try one county’s inspections
Open Florida Restaurant Inspections, Closures & New Licenses on Apify and paste this into the JSON input.
{
"dataset": "inspections",
"counties": [
"Miami-Dade"
],
"minHighPriorityViolations": 1,
"maxResults": 20
}The inspection files cover the current fiscal year, from July 1 to the Division’s latest weekly update. Add dateFrom and dateTo to narrow that window, and both dates are inclusive. minHighPriorityViolations keeps inspections with at least that many high priority violations, and a row with a blank count does not match it.
Check the actor’s current pricing and set a maximum charge before starting. A small maxResults limits delivered rows; it does not make a sample a complete county export. Check the run log for limits and incomplete results.
2. Filter by inspection result
dispositions matches any part of the result text, without case. The results the Division uses include Inspection Completed - No Further Action, Warning Issued, Call Back - Complied, Administrative complaint recommended, and Emergency order recommended. Entering warning matches the warning results, and emergency order matches both the recommendation and its callbacks.
Add cities or zipCodes to work below county level. City names must match the Division’s spelling, and zipCodes takes full ZIP codes or their first 3 or 4 digits. Inspection runs read every district file, so a county filter narrows the rows without making the run faster.
3. Switch to closures or new licenses
Set dataset to emergencyClosures for restaurants the Division closed, with the reason and the reopening date. weeks reads the most recent weekly files, up to 12. Closure files have no county or ZIP column, so filter them with cities.
licenseChanges lists new food service licenses and approved changes of owner, with seats, phone, and mailing address. changeTypes picks new, changeOwner, or both, and licenseTypes narrows by license type. These files cover a July-to-June fiscal year, so the newest rows can be months old. They have no county column, so filter with cities or zipCodes.
For a weekly feed of newly licensed restaurants, use activeLicenses with newSinceLastRun: true and select an Apify key-value store as stateStoreId. The first run saves the current list and delivers nothing. Each later run delivers the license numbers that were not on the list before. minSeats skips vending machines and carts.
4. Export and check the fields
When the run finishes, open its output dataset and inspect a few rows. Choose CSV or Excel from the export options. In Google Sheets, use File → Import → Upload. Keep license numbers and ZIP codes as text so leading zeros survive the import.
| county | businessName | inspectionDate | highPriorityViolations |
|---|---|---|---|
| Dade | DEMO CAFE | 2026-09-02 | 2 |
| Dade | EXAMPLE GRILL LLC | 2026-09-04 | 1 |
Keep dataset, licenseNumber, businessName, address, city, and zip, plus the fields of your dataset: inspectionDate, disposition, and the violation counts for inspections, closureDate, conditionsForClosure, and reopeningDate for closures, or changeType, approvedDate, seats, and phone for license changes.
Retain sourceUrl, sourceLastModified, and sourceFetchedAt alongside your research. sourceLastModified is when the Division published the file, and sourceFetchedAt is when the actor’s copy was taken. Blank source values become null.
5. Check a record before acting on it
Look up selected license numbers in the Division’s public license search on myfloridalicense.com and compare the business name, address, and latest inspection with your export. A closure row with a reopening date means the restaurant was allowed to reopen. Keep separate spreadsheet columns for your checked date, source link, and research notes so your conclusions remain distinct from the published records.
6. Refresh each week
Save the input as an Apify task. The Division republishes its files about once a week, so a weekly schedule is enough, and repeating a run against the same copy returns the same rows. If the actor’s copy is more than ten days old, the run fails, names the date, and is not charged.
Keep each dated export. For a current working sheet, match inspections by license number and inspection date, and closures by license number and closure date, and update those rows instead of appending duplicates. A restaurant missing from a capped or differently filtered run is not evidence of a clean record.
If the export is empty
Check that the date range falls inside the current fiscal year, then loosen dispositions and the violation minimum. Confirm city names match the Division’s spelling. A counties filter on closures or license changes stops the run with a message, because those files have no county column. Review the log for download failures and limits; a source that could not be read is different from a completed search with no matching records.
Start with a small export.
Check the sample against its source before expanding or scheduling your search.
Open the actor on Apify