# Florida Vacant Land & Absentee Owner Leads (Tax Roll) (`finaldynamics/florida-vacant-land-leads`) Actor

Florida vacant land leads and absentee owner list from the state tax roll: vacant parcels with owner mailing address, acreage, value and last sale, all 67 counties.

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

## Pricing

from $1.00 / 1,000 parcels

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 Vacant Land & Absentee Owner Leads (Tax Roll)

Every Florida county sends its full property tax roll to the Florida Department of Revenue, which
publishes it once or twice a year. This actor turns those rolls into vacant land leads: it reads the
counties you pick and returns the vacant parcels that match your filters. Each row has the owner's
mailing address, acreage, land and just value, the legal description and the most recent recorded
sale. Filter by land use, out-of-state owners, acreage, value and how long the owner has held the
land, then mail the list.

Built for land investors sending offer letters to owners of empty lots, land flippers checking a
county's supply of cheap acreage, and anyone who pays per list for "vacant land and absentee owner"
leads and would rather pull the rows themselves.

There is no skip tracing. The tax roll has names and mailing addresses, not phone numbers or email
addresses.

### What you get

One row per parcel, with flat fields that drop into Google Sheets, a CRM or a mail house upload.

| Field                                                                   | Example                                                  |
| ----------------------------------------------------------------------- | -------------------------------------------------------- |
| `county`, `parcelId`, `stateParcelId`                                   | `Miami-Dade`, `0101010601050`, `C23-000-197-6618-7`      |
| `dorUseCode`, `dorUseDescription`                                       | `010`, `Vacant Commercial - with/without extra features` |
| `acres`, `landSqFt`                                                     | `0.13`, `5621`                                           |
| `justValue`, `landValue`, `taxableValue`                                | `1124200`, `1124200`, `289447`                           |
| `ownerName`                                                             | `RING EQUITY PROPERTIES LLC`                             |
| `ownerAddress1`, `ownerAddress2`, `ownerCity`, `ownerState`, `ownerZip` | `115 FIG DRIVE`, `null`, `DIX HILLS`, `NY`, `null`       |
| `ownerOutOfState`                                                       | `true`                                                   |
| `situsAddress`, `situsCity`, `situsZip`                                 | `1040 NW 1 CT`, `Miami`, `33136`                         |
| `legalDescription`, `township`, `range`, `section`                      | `P W WHITES RE-SUB PB B-34`, `50S`, `41E`, `1`           |
| `lastSalePrice`, `lastSaleYear`, `lastSaleMonth`                        | `55000`, `2025`, `7`                                     |
| `lastSaleQualificationCode`, `lastSaleVacantOrImproved`                 | `01`, `V`                                                |
| `homestead`, `publicLandCode`                                           | `false`, `null`                                          |
| `rollYear`, `rollType`, `sourceFile`, `sourceUrl`                       | `2026`, `preliminary`, the county file it came from      |

Also included: `countyNumber`, `altKey`, `countyUseCode` (the county appraiser's own code),
`fiduciaryName`, `censusBlock`, `neighborhoodCode`, `lastSaleBook`, `lastSalePage` and
`sourceLastModified`. Anything the roll leaves blank is `null`.

### How to use it

Pick counties and run. The default returns up to 100 vacant residential parcels in Liberty County.

```json
{
  "counties": ["Polk", "Lake", "Marion"],
  "landUseCodes": ["000"],
  "ownerLocation": "out-of-state",
  "minAcres": 0.2,
  "maxAcres": 10,
  "maxJustValue": 60000,
  "lastSaleBeforeYear": 2024,
  "maxResults": 5000
}
```

**Out-of-state owners of cheap lots:** the input above. Owners who live far from their land are the
usual target for offer letters. `ownerOutOfState` is based on the mailing state in the roll; a blank
state counts as neither in-state nor out-of-state.

**Land use codes:** `000` vacant residential (the default), `010` vacant commercial, `040` vacant
industrial, `070` vacant institutional, `080` vacant governmental, `099` acreage not zoned
agricultural. Any Department of Revenue code from `000` to `099` works, so agricultural codes (`050`
to `069`) can be added for rural acreage.

**Whole state:** `"counties": ["all"]` reads all 67 counties in order and stops at `maxResults`.
County names are not case sensitive; `St. Johns`, `Saint Lucie`, `Dade` and `De Soto` also work.

**Leave out owners you do not want:** `excludePublicOwners` (on by default) drops land owned by
federal, state, county, city, school, water district and railroad owners. `ownerNameExcludes` drops
owners whose name contains any text you list, for example `["HOMEOWNERS", "ASSOCIATION", "CHURCH"]`.
`excludeHomestead` drops parcels with a homestead exemption.

**Which roll:** `roll: "latest"` (default) uses the newest roll the Department has published. Each
year the preliminary roll arrives in July and the final roll from October. You can ask for either by
year with `roll` and `rollYear`.

### Quick start

No code needed; about two minutes from input to spreadsheet. For a longer walkthrough with example
output, read the guide
[Build a Florida vacant land and absentee owner list](https://finaldynamics.com/florida-vacant-land-guide.html).

1. Open the example "Vacant lots with out-of-state owners, Polk County FL" on this actor's page, or
   paste one of the inputs above into the input form.
2. Click **Start** and wait until the run shows **Succeeded**.
3. Open the **Output** tab to see the parcels as a table.
4. Click **Export**, choose CSV or Excel, and download the file.
5. In Google Sheets, choose **File > Import > Upload** and select the file.

### Automate it

**A list that follows the tax roll:** save your counties and filters in a task. Click **Save as a
new task**, then add a schedule for that task under **Schedules** in Apify Console (for example
every Monday at 07:00). The Department publishes a new roll twice a year (preliminary in July, final
from October), so a monthly schedule is enough; the results change when a new roll appears.

**Into Google Sheets with n8n:** add the **Apify** node with the **On new Apify Event** trigger,
choose your task and the succeeded event, then add an **Apify** node with **Get Dataset Items**
using the run's `defaultDatasetId`, and finish with a **Google Sheets** node that appends the rows.
Every scheduled run then adds its parcels to the same sheet. Make and Zapier have Apify integrations
that work the same way.

### Pricing

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

| Event         |  Price | When                     |
| ------------- | -----: | ------------------------ |
| `actor-start` |  $0.01 | Once per run             |
| `parcel`      | $0.001 | Per parcel row delivered |

Examples: all 121 out-of-state vacant residential parcels in Liberty County cost $0.13. 1,000
parcels cost $1.01. A run that matches nothing costs $0.01.

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 Department of Revenue's published NAL (name, address, legal) files, downloaded
  straight from floridarevenue.com. Values and codes are exactly what the county property appraiser
  submitted, typos included.
- This is a snapshot as of the roll date, not live ownership. A parcel sold since the roll was made
  still shows the previous owner. Check the county property appraiser's site before you rely on a
  single parcel.
- Some counties leave the owner ZIP blank for many rows. Miami-Dade does so for most parcels,
  including many out-of-state owners, so `ownerZip` can be `null` even with a full street address.
- Vacant means the appraiser's land use code says so. It does not mean the lot is buildable, has
  road access or is free of liens.
- The sale fields hold the most recent of up to two recent sales the roll carries, not a full sale
  history. `lastSaleBeforeYear` keeps parcels with no sale in the roll as well, since those owners
  usually bought before the roll's sale window.
- Records the law keeps confidential, such as the addresses of protected owners, are not in the
  public files and so are not in the results.
- Big counties take minutes: reading all of Miami-Dade's roll (about 938,000 parcels) took about six
  minutes on the default 512 MB of memory. Runs that stop at `maxResults` early finish sooner.
- The actor is not affiliated with the Florida Department of Revenue or any county.

### FAQ

**How do I get a vacant land owner list for a Florida county?**

Pick the county, keep land use `000` (vacant residential) and run. Each row has the owner's name and
mailing address, acreage, value and last sale.

**How do I find absentee owners of vacant lots?**

Set `ownerLocation` to `out-of-state`. The roll records the owner's mailing state, so you get owners
who live outside Florida.

**Does it include phone numbers?**

No. The tax roll has names and mailing addresses only. You can add phone numbers with a skip-tracing
service if you need them.

**How current is the data?**

It is the Department of Revenue's latest published roll: preliminary rolls arrive in July and final
rolls from October.

### Related actors

- [Florida Property Sales & New Owner Leads](https://apify.com/finaldynamics/florida-property-sales-leads):
  recorded sales with the new owner's mailing address.
- [Florida Lis Pendens, Pre-Foreclosure & Deed Leads](https://apify.com/finaldynamics/florida-lis-pendens-leads):
  lis pendens and deeds from five Florida county clerks.
- [Code Violation Leads](https://apify.com/finaldynamics/code-violation-leads): code enforcement
  cases from Accela cities and counties.

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

# Actor input Schema

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

County names, not case sensitive. St. Johns, Saint Lucie, Dade and De Soto spellings work. Use "all" for all 67 counties; otherwise counties run in the order listed.

## `roll` (type: `string`):

Latest selects the newest listed year, final if non-empty, otherwise preliminary; ignores rollYear. Preliminary/final uses rollYear, or the newest listed year when blank.

## `rollYear` (type: `integer`):

Optional four-digit assessment year for preliminary or final; blank defaults to the newest listed year. An empty or missing folder is a source error.

## `landUseCodes` (type: `array`):

Three-digit codes 000–099. Common vacant uses: 000 residential, 010 commercial, 040 industrial, 070 institutional, 080 governmental, 099 acreage not zoned agricultural. Other codes, including agricultural, are accepted.

## `ownerLocation` (type: `string`):

Where the owner's mailing address is: any, out of state (another state or a foreign country), or in state (Florida). Owners with no mailing state on the roll match neither out of state nor in state.

## `excludePublicOwners` (type: `boolean`):

Leave out land owned by federal, state, county, city, school, water district and railroad owners, and parcels with a government land use code (080 to 089). Turn off to include them.

## `excludeHomestead` (type: `boolean`):

Leave out parcels with a homestead exemption, which usually means the owner lives there.

## `minAcres` (type: `number`):

Smallest parcel size in acres, from the land area on the roll. Leave empty for no minimum. Parcels with no land area on the roll are left out when this is set.

## `maxAcres` (type: `number`):

Largest parcel size in acres, from the land area on the roll. Leave empty for no maximum. Parcels with no land area on the roll are left out when this is set.

## `minJustValue` (type: `integer`):

Optional inclusive minimum JV in dollars. Blank disables this bound; missing source values do not match an active bound.

## `maxJustValue` (type: `integer`):

Optional inclusive maximum JV in dollars. Blank disables this bound; missing source values do not match an active bound.

## `lastSaleBeforeYear` (type: `integer`):

Keep parcels whose most recent sale on the roll was before this year, plus parcels with no sale on the roll. The roll carries up to two recent sales, not the full history. Leave empty to ignore sales.

## `ownerNameExcludes` (type: `array`):

Drop owners containing any of these case-insensitive substrings.

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

Maximum parcels across all counties. The current download is cancelled when this limit or the charge limit is reached.

## Actor input object example

```json
{
  "counties": [
    "Liberty"
  ],
  "roll": "latest",
  "landUseCodes": [
    "000"
  ],
  "ownerLocation": "any",
  "excludePublicOwners": true,
  "excludeHomestead": false,
  "ownerNameExcludes": [],
  "maxResults": 100
}
```

# 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 = {
    "counties": [
        "Liberty"
    ],
    "roll": "latest",
    "landUseCodes": [
        "000"
    ],
    "ownerLocation": "any",
    "excludePublicOwners": true,
    "excludeHomestead": false,
    "ownerNameExcludes": [],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("finaldynamics/florida-vacant-land-leads").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 = {
    "counties": ["Liberty"],
    "roll": "latest",
    "landUseCodes": ["000"],
    "ownerLocation": "any",
    "excludePublicOwners": True,
    "excludeHomestead": False,
    "ownerNameExcludes": [],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("finaldynamics/florida-vacant-land-leads").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 '{
  "counties": [
    "Liberty"
  ],
  "roll": "latest",
  "landUseCodes": [
    "000"
  ],
  "ownerLocation": "any",
  "excludePublicOwners": true,
  "excludeHomestead": false,
  "ownerNameExcludes": [],
  "maxResults": 100
}' |
apify call finaldynamics/florida-vacant-land-leads --silent --output-dataset

```

## MCP server setup

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

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/eSCDomAeLXdyfEYpB/builds/ZYyX0yM6xLa6lGzUn/openapi.json
