# Florida Certificates of Occupancy (`xprm-llc/florida-certificates-of-occupancy`) Actor

New certificates of occupancy and completion from official Florida open data (Orlando, Miami-Dade): address, work type, valuation, builder. Weekly new-only feed.

- **URL**: https://apify.com/xprm-llc/florida-certificates-of-occupancy.md
- **Developed by:** [Paul Scharr](https://apify.com/xprm-llc) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 certificate rows

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 Certificates of Occupancy

Get a weekly feed of **new certificates of occupancy (CO), temporary COs and certificates of completion** from official Florida open data, normalized into one table. Sources: **City of Orlando** and **Miami-Dade County** (unincorporated, county-issued permits). A historical-only Hillsborough layer is opt-in.

A CO means a building has just become ready to occupy. That's the moment new owners, tenants and businesses need movers, furniture, internet, security, insurance, landscaping, pest control, pool service, signage and property management.

### Who uses it

Home services and moving companies, ISPs and security installers, insurance agents, commercial cleaning, property managers, B2B suppliers, real-estate and construction market analysts, and AI sales agents.

### Output (one row per certificate)

| Field | Example |
|---|---|
| permitNumber | BLD2026-15271 |
| certificateType | CO / TCO / CC / CO/CC |
| coIssueDate | 2026-09-22 |
| permitIssueDate | 2026-07-23 |
| address, city, state, zip | 10090 TIDAL WAVE ST, Orlando, FL |
| county / jurisdiction | Orange / City of Orlando |
| occupancyClass | Residential / Commercial |
| workType, description | Building Permit / New, PP-STARWOOD MERIDIAN PARK… |
| units, squareFeet, valuation | when the source publishes them |
| contractorName | business names only |
| coDateBasis, sourceName, sourceUrl, fetchedAt | provenance |

**Privacy by design:** owner names and other personal owner fields are never requested from the sources and never appear in the output. Contractor names are included only when they're clearly a business (LLC, Inc, Corp, Homes, Construction…). Individual names are dropped.

**Coverage gaps:** Orlando doesn't publish city-wide ZIP codes in this dataset, and Miami-Dade's layer has no city or ZIP. Those fields are `null` rather than guessed.

### Input

| Field | What it does |
|---|---|
| sources | `orlando`, `miami-dade`, `hillsborough-legacy` (historical). |
| certificateTypes | `CO`, `TCO`, `CC`. |
| lookbackDays / dateFrom / dateTo | Certificate issue-date window. Default 30 days. |
| occupancyClass | `any`, `residential` or `commercial`. |
| workTypeKeywords | e.g. `["new","pool","roof"]`. |
| excludeDemolition | Default on. |
| newOnly | Default on, deduped through the named KV store `fl-certificates-of-occupancy-seen`. |
| maxItems | Cost cap. |

#### Examples

New-home COs only, both sources:

```json
{ "certificateTypes": ["CO", "TCO"], "occupancyClass": "residential", "workTypeKeywords": ["new", "sfr"] }
```

Commercial completions in Miami-Dade, September 2026:

```json
{ "sources": ["miami-dade"], "occupancyClass": "commercial", "dateFrom": "2026-09-01", "dateTo": "2026-09-30", "newOnly": false }
```

### Scheduling guide

Save a Task, then open **Schedules** and create a weekly one (e.g. `0 7 * * 1`). Keep **newOnly** on and the lookback at 30 days so late-posted certificates are still caught. Each certificate is delivered once. Send the rows to Sheets, a CRM, Zapier or Make through Integrations.

### Use with AI agents (MCP)

Add the Apify MCP server (`https://mcp.apify.com`) to your MCP client and enable `xprm-llc/florida-certificates-of-occupancy`. Ask things like *"List new residential COs in Orlando this week with valuation over $300k."* The input is documented JSON and the output follows a typed dataset schema.

### FAQ

**Which places are covered?** City of Orlando (CO, TCO and CC dates from the city's open-data Permit Applications dataset) and Miami-Dade County (building-permit completion dates for county-issued permits, mostly unincorporated areas). We add a jurisdiction only when it publishes a clean public dataset that's reachable from the Apify cloud.

**Why are Miami-Dade rows labeled CO/CC?** The county layer publishes one building-completion date. It's when the CO or CC is issued, but it doesn't say which one.

**What's hillsborough-legacy?** Hillsborough's old Permits Plus CO layer is still online but hasn't received new records since mid-2024. It's useful for history only.

**What about Tampa, Palm Beach, Lee, Orange County (unincorporated)?** We didn't find a documented public CO dataset for them. They're candidates for later.

**How fresh is it?** Orlando updates its dataset several times a day. Miami-Dade's GIS layer updates regularly, typically within days.

**What if a source is down?** The run warns, notes it in `RUN_SUMMARY` and continues. Error rows are never written, so you're never charged for them.

### Public records note

All data is public record under Florida's public records law (Ch. 119, F.S.), read only from official open-data APIs: Socrata SODA for the City of Orlando, and ArcGIS REST for the counties. No logins, captchas or proxies are used, robots.txt and the terms are respected, requests are rate-limited, and the User-Agent identifies the Actor. Owner and personal fields are excluded. You're responsible for lawful outreach (TCPA, CAN-SPAM, do-not-call). This Actor isn't affiliated with any government.

# Actor input Schema

## `sources` (type: `array`):

Which official open-data sources to read. Default: orlando, miami-dade.

## `certificateTypes` (type: `array`):

CO = certificate of occupancy, TCO = temporary CO, CC = certificate of completion (e.g. finished roofs, additions). Miami-Dade publishes one completion date covering CO or CC, so its rows are labeled CO/CC. Default: all.

## `lookbackDays` (type: `integer`):

Used when Date from is empty: certificates issued in this many days before today.

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

Earliest certificate (CO/CC) issue date.

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

Latest certificate issue date. Default today.

## `occupancyClass` (type: `string`):

Keep only residential or only commercial certificates.

## `workTypeKeywords` (type: `array`):

Keep rows whose work type or description contains any of these words, e.g. new, SFR, pool, roof, addition, tenant. Empty = all.

## `excludeDemolition` (type: `boolean`):

Skip demolition permits (they close with a completion date but no occupancy).

## `newOnly` (type: `boolean`):

Remember delivered certificates in the named key-value store fl-certificates-of-occupancy-seen and emit only ones not delivered before. Use with weekly schedules.

## `maxItems` (type: `integer`):

Cost cap. 0 = no limit.

## Actor input object example

```json
{
  "sources": [
    "orlando",
    "miami-dade"
  ],
  "certificateTypes": [
    "CO",
    "TCO",
    "CC"
  ],
  "lookbackDays": 30,
  "occupancyClass": "any",
  "workTypeKeywords": [],
  "excludeDemolition": true,
  "newOnly": true,
  "maxItems": 300
}
```

# Actor output Schema

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

Normalized rows (overview view).

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

Per-source counts and warnings.

# 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 = {
    "sources": [
        "orlando",
        "miami-dade"
    ],
    "certificateTypes": [
        "CO",
        "TCO",
        "CC"
    ],
    "lookbackDays": 30,
    "workTypeKeywords": [],
    "maxItems": 300
};

// Run the Actor and wait for it to finish
const run = await client.actor("xprm-llc/florida-certificates-of-occupancy").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 = {
    "sources": [
        "orlando",
        "miami-dade",
    ],
    "certificateTypes": [
        "CO",
        "TCO",
        "CC",
    ],
    "lookbackDays": 30,
    "workTypeKeywords": [],
    "maxItems": 300,
}

# Run the Actor and wait for it to finish
run = client.actor("xprm-llc/florida-certificates-of-occupancy").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 '{
  "sources": [
    "orlando",
    "miami-dade"
  ],
  "certificateTypes": [
    "CO",
    "TCO",
    "CC"
  ],
  "lookbackDays": 30,
  "workTypeKeywords": [],
  "maxItems": 300
}' |
apify call xprm-llc/florida-certificates-of-occupancy --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xprm-llc/florida-certificates-of-occupancy"
        }
    }
}
```

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/G9Ctwzk2SS1XLdtHy/builds/sPoxCrepBQhO1G1cd/openapi.json
