# Florida Restaurant Inspections, Closures & New Licenses (`finaldynamics/florida-restaurant-inspections`) Actor

Filter Florida DBPR food service inspections, emergency closures, new licenses, ownership approvals and active licenses. Includes locations, source dates and published contact details when available.

- **URL**: https://apify.com/finaldynamics/florida-restaurant-inspections.md
- **Developed by:** [Final Dynamics](https://apify.com/finaldynamics) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Florida Restaurant Inspections, Closures & New Licenses

Florida's Division of Hotels and Restaurants licenses and inspects every public food service
business in the state, from restaurants and caterers to food trucks and vending machines, and
publishes the records as download files. This actor turns them into filtered rows.

The Division republishes those files about once a week. This actor reads a weekly copy of them
rather than the Division's site directly, so rows are as current as the Division's latest
publication, and every row carries the date the copy was taken. Pick one of four datasets:

- **Inspections:** every inspection this fiscal year, with the result and the violations found by
  category. Updated weekly.
- **Emergency closures:** restaurants the Division closed, with the reason (such as roach activity)
  and when they were allowed to reopen. Updated weekly.
- **License changes:** new food service licenses and approved changes of owner for a fiscal year,
  with seats, address and phone.
- **Active licenses:** every active food service license with seats, risk level, last inspection
  date and phone, and an option to deliver only the licenses that are new since your last run.
  Updated weekly.

Built for pest control and food safety companies looking for restaurants with recent violations or
closures, restaurant suppliers, POS and payment providers, insurers, linen and beverage distributors
looking for new and newly sold restaurants, and local news.

### What you get

Every row has `dataset`, `licenseNumber`, `businessName`, `address`, `city`, `zip`, `sourceUrl`,
`sourceLastModified` and `sourceFetchedAt`, plus the fields of its dataset. Blank values are `null`;
phone numbers are shown as published. `sourceLastModified` is when the Division published the file;
`sourceFetchedAt` is when our copy of it was taken, so you can see the age of what you are reading.

| Dataset             | Main fields                                                                                                                                                                                                                       |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `inspections`       | `county`, `inspectionDate`, `inspectionType`, `disposition`, `totalViolations`, `highPriorityViolations`, `intermediateViolations`, `basicViolations`, `violations` (for example `"41: † Chemicals/toxic substances (count: 1)"`) |
| `emergencyClosures` | `closureDate`, `closureTime`, `conditionsForClosure` (for example `Roach activity`), `reopeningDate`, `reopeningTime`, `district`                                                                                                 |
| `licenseChanges`    | `changeType` (`new` or `changeOwner`), `approvedDate`, `licenseeName`, `licenseType` (for example `Permanent Food Service`, `Mobile MFDV`, `Catering`), `seats`, `phone`, mailing address                                         |
| `activeLicenses`    | `county`, `licenseeName`, `seats`, `phone`, mailing address, status and risk level codes, last inspection date, and `changeType: "new"` in the new-since-last-run mode                                                            |

### How to use it

**Restaurants with serious violations this month:**

```json
{
  "dataset": "inspections",
  "counties": ["Orange", "Seminole", "Osceola"],
  "dispositions": ["warning", "emergency order", "administrative complaint"],
  "dateFrom": "2026-09-01",
  "minHighPriorityViolations": 1,
  "maxResults": 1000
}
```

`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`,
`Call Back - Extension given, pending`, `Administrative complaint recommended`,
`Emergency order recommended` and `Emergency Order Callback Complied`.

**This week's emergency closures statewide:** `{"dataset": "emergencyClosures", "weeks": 1}`. Use up
to 12 weeks. Closure files have no county or ZIP column, so filter by `cities`.

**New restaurants and new owners:**

```json
{ "dataset": "licenseChanges", "cities": ["TAMPA"], "dateFrom": "2026-01-01" }
```

`changeTypes` picks `new`, `changeOwner` or both; `licenseTypes` narrows to, for example,
`["Permanent Food Service"]`. These files cover a July-to-June fiscal year and have no county
column, so filter by `cities` or `zipCodes`.

**A weekly feed of newly licensed restaurants:** use `activeLicenses` with `newSinceLastRun: true`,
create a key-value store in Apify Console and select it as `stateStoreId`, then schedule the task
weekly. The first run saves the current list and delivers nothing. Each later run delivers only the
license numbers that were not on the list before. Add `minSeats` to skip vending machines and carts.

Counties and cities are not case sensitive, and `Miami-Dade` and `Dade` both work. `zipCodes` takes
ZIP codes or their first 3 or 4 digits. Dates are inclusive.

### Pricing

Pay per event. There are no platform usage charges on top.

| Event         |  Price | When                                   |
| ------------- | -----: | -------------------------------------- |
| `actor-start` |  $0.01 | Once per run, after the source answers |
| `record`      | $0.003 | Per row delivered, any dataset         |

Examples: the 66 Orange County inspections with a warning in the first half of September 2026 cost
$0.21. 1,000 rows cost $3.01. A run that matches nothing costs $0.01. A run that cannot reach the
data at all, or that refuses it for being out of date, costs nothing.

Set a maximum charge on the run for a hard ceiling; the actor stops cleanly at the cap and never
delivers a row it has not charged for.

### Good to know

- The source is the Division of Hotels and Restaurants' public records downloads on
  myfloridalicense.com. Rows are what the Division published, abbreviations included.
- The data is refreshed weekly from Florida DBPR, not read live. Runs read a copy that is
  re-downloaded on a schedule, which is why results are identical between two runs on the same day.
  `sourceFetchedAt` on every row tells you when that copy was taken. If the copy ever falls more
  than ten days behind, the run fails and tells you the date instead of delivering old rows as
  though they were current.
- An inspection is a snapshot of the day it happened. The violation list shows counts by the
  Division's violation categories, not the inspector's written notes.
- The inspection files cover the current fiscal year, from July 1 to the Division's latest weekly
  update. The license change files cover a whole fiscal year; the 2025-26 files were published on
  July 9, 2026 and end in June 2026.
- Inspections and active licenses read all seven district files, so a county filter does not make
  those runs faster.
- The actor is not affiliated with the Florida Department of Business and Professional Regulation.

Questions or a filter that does not behave? Open an issue on the actor page and include the input
you used.

# Actor input Schema

## `dataset` (type: `string`):

Choose inspections, weekly closures, fiscal-year license changes or active licenses.

## `counties` (type: `array`):

Case-insensitive names; Dade and Miami-Dade are equivalent. Empty selects all counties. Available for inspections and activeLicenses only; XLSX sources lack county columns.

## `cities` (type: `array`):

Case-insensitive exact business location city names. Empty selects all cities.

## `zipCodes` (type: `array`):

3–5 digit location ZIP prefixes. Empty selects all ZIPs. Not available for emergencyClosures, whose source lacks ZIPs.

## `dateFrom` (type: `string`):

Optional inclusive YYYY-MM-DD inspection, closure or approved date. Not supported for activeLicenses.

## `dateTo` (type: `string`):

Optional inclusive YYYY-MM-DD inspection, closure or approved date. Not supported for activeLicenses.

## `dispositions` (type: `array`):

Inspections only: case-insensitive substring match; any listed term contained in the disposition matches. Empty selects all. For example, emergency order matches Emergency order recommended and all Emergency Order Callback values; warning matches Warning Issued. Published values include Emergency order recommended; Emergency Order Callback Complied; Emergency Order Callback Not Complied; Emergency Order Callback Time Extension; Call Back - Complied; Call Back - Admin. complaint recommended; Warning Issued; Administrative complaint recommended; Inspection Completed - No Further Action; Call Back - Extension given, pending.

## `minHighPriorityViolations` (type: `integer`):

Inspections only: optional inclusive minimum. Blank or malformed source values cannot match this bound.

## `includeViolationText` (type: `boolean`):

Inspections only: include nonzero category counts with published descriptions, or narrative text if supplied by the source. False returns an empty list.

## `weeks` (type: `integer`):

Emergency closures only: read the most recent N listed weekly XLSX files. Duplicate orders are delivered once per run.

## `changeTypes` (type: `array`):

License changes only: new and/or changeOwner. Owner changes are approved requests, not pending applications.

## `fiscalYear` (type: `string`):

License changes only: consecutive YYZZ (for example 2526). Omit to select the newest listed XLSX year. CSV-only years are unsupported.

## `licenseTypes` (type: `array`):

License changes only: exact case-insensitive source text, e.g. Seating, Non-Seating, Mobile MFDV, Vending or Catering. Empty selects all.

## `newSinceLastRun` (type: `boolean`):

Active licenses only. First empty-baseline run saves all district licenses and delivers nothing. Incomplete or capped runs never advance the baseline.

## `stateStoreId` (type: `string`):

Required for newSinceLastRun. Choose a persistent Apify key-value store. Use one store per scheduled stream and avoid concurrent runs.

## `minSeats` (type: `integer`):

Active licenses only: optional inclusive seat count. Missing or malformed counts cannot match this bound.

## `maxResults` (type: `integer`):

Maximum rows delivered across all files. Stops and cancels the active CSV download at this limit or the charge limit. A capped run does not save baseline state.

## `maxSourceAgeDays` (type: `integer`):

Records come from our mirror of the Florida DBPR files, refreshed weekly. A run fails, and is not charged, if any file it would read was last refreshed more than this many days ago.

## Actor input object example

```json
{
  "dataset": "inspections",
  "counties": [],
  "cities": [],
  "zipCodes": [],
  "dispositions": [],
  "includeViolationText": true,
  "weeks": 1,
  "changeTypes": [
    "new",
    "changeOwner"
  ],
  "licenseTypes": [],
  "newSinceLastRun": false,
  "maxResults": 100,
  "maxSourceAgeDays": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "dataset": "inspections",
    "counties": [],
    "cities": [],
    "zipCodes": [],
    "dispositions": [],
    "includeViolationText": true,
    "weeks": 1,
    "changeTypes": [
        "new",
        "changeOwner"
    ],
    "licenseTypes": [],
    "newSinceLastRun": false,
    "maxResults": 100,
    "maxSourceAgeDays": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("finaldynamics/florida-restaurant-inspections").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "dataset": "inspections",
    "counties": [],
    "cities": [],
    "zipCodes": [],
    "dispositions": [],
    "includeViolationText": True,
    "weeks": 1,
    "changeTypes": [
        "new",
        "changeOwner",
    ],
    "licenseTypes": [],
    "newSinceLastRun": False,
    "maxResults": 100,
    "maxSourceAgeDays": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("finaldynamics/florida-restaurant-inspections").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "dataset": "inspections",
  "counties": [],
  "cities": [],
  "zipCodes": [],
  "dispositions": [],
  "includeViolationText": true,
  "weeks": 1,
  "changeTypes": [
    "new",
    "changeOwner"
  ],
  "licenseTypes": [],
  "newSinceLastRun": false,
  "maxResults": 100,
  "maxSourceAgeDays": 10
}' |
apify call finaldynamics/florida-restaurant-inspections --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,finaldynamics/florida-restaurant-inspections"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/93WfFq8haFjs5Qp4o/builds/MkzAjfXk2A1ZpamDY/openapi.json
