# Florida Property Sales & New Owner Leads (Tax Roll) (`finaldynamics/florida-deed-transfer-leads`) Actor

Florida new homeowner mailing list and recently sold homes: recorded sales and deed transfers with price, month and the owner of record's mailing address.

- **URL**: https://apify.com/finaldynamics/florida-deed-transfer-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 $2.00 / 1,000 sales

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 Property Sales & New Owner Leads (Tax Roll)

Every Florida county reports its recorded property sales to the Florida Department of Revenue along
with its tax roll. This actor builds a new homeowner mailing list and a recently sold homes list
from those sale files for the counties you pick and joins each sale to the same parcel on the tax
roll. One row per sale: the price, the month, whether the appraiser treats it as a market sale, and
the parcel's owner of record with mailing address, property address, use, acreage, year built and
values.

Built for marketers mailing new owners (movers, home services, insurance, solar), land investors
pulling sold comps for vacant parcels, and agents and appraisers who want a county's sales as a
table instead of one lookup at a time.

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 recorded sale, with flat fields that drop into Google Sheets, a CRM or a mail house
upload.

| Field                                                                   | Example                                                        |
| ----------------------------------------------------------------------- | -------------------------------------------------------------- |
| `county`, `parcelId`                                                    | `Miami-Dade`, `0131130570810`                                  |
| `saleDate`, `saleYear`, `saleMonth`                                     | `2026-05`, `2026`, `5`                                         |
| `salePrice`                                                             | `293800`                                                       |
| `qualifiedSale`, `qualificationCode`, `qualificationDescription`        | `true`, `01`, `Arm's-length transfer qualified by examination` |
| `vacantOrImproved`, `multiParcelSale`                                   | `improved`, `false`                                            |
| `orBook`, `orPage`                                                      | `35326`, `3241` (the deed's Official Records book and page)    |
| `dorUseCode`, `dorUseDescription`                                       | `001`, `Single Family`                                         |
| `ownerName`                                                             | `ORANGE COUNTY CONSTRUCTORA LLC`                               |
| `ownerAddress1`, `ownerAddress2`, `ownerCity`, `ownerState`, `ownerZip` | `3088 SW 4 ST`, `null`, `MIAMI`, `FL`, `null`                  |
| `ownerOutOfState`                                                       | `false`                                                        |
| `situsAddress`, `situsCity`, `situsZip`                                 | `98 NE 70 ST`, `Miami`, `33138`                                |
| `acres`, `landSqFt`, `yearBuilt`, `livingAreaSqFt`                      | `0.18`, `8025`, `1926`, `1499`                                 |
| `justValue`, `landValue`, `homestead`                                   | `489048`, `337050`, `false`                                    |
| `legalDescription`                                                      | `DUPONT ADDN PB 13-56`                                         |
| `rollMatch`                                                             | `true` when the parcel was found on the tax roll               |

Also included: `countyNumber`, `stateParcelId`, `saleId`, `clerkNumber`, `saleChangeCode`,
`publicLandCode`, `rollYear`, `rollType`, the source file names and links, and `sourceLastModified`.
Anything the files leave blank is `null`.

### How to use it

Pick counties and run. The default returns up to 100 sales in Liberty County.

```json
{
  "counties": ["Orange", "Seminole", "Osceola"],
  "saleDateFrom": "2026-01",
  "saleDateTo": "2026-06",
  "qualifiedOnly": true,
  "vacantOrImproved": "improved",
  "landUseCodes": ["001"],
  "minSalePrice": 150000,
  "maxResults": 5000
}
```

**New owner mailing list:** the input above returns market sales of single-family homes in the first
half of 2026 with the owner of record's mailing address.

**Vacant land comps:** set `"vacantOrImproved": "vacant"`, `"qualifiedOnly": true` and land use
`000` (vacant residential), then filter by `minAcres` and `maxAcres` to price lots like the one you
are looking at.

**Market sales only:** `qualifiedOnly` keeps the sales the appraiser counts as arm's length (codes
`01` to `06`). It drops family transfers, quit claim deeds, foreclosures, bank and government sales
and other transfers that do not reflect market price. `qualificationCodes` lets you pick exact codes
instead, for example `["11", "12"]` for quit claim and bank transfers.

**Multi-parcel sales:** a sale of several parcels on one deed often shows the whole price on every
parcel. `excludeMultiParcel` drops them when you are pricing single properties.

**Owners:** `ownerLocation: "out-of-state"` keeps parcels whose owner of record has a mailing
address outside Florida. `excludePublicOwners` drops government, school, water district and railroad
land.

**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.

### 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 recently sold homes list from property transfer records](https://finaldynamics.com/florida-property-sales-guide.html).

1. Open the example "Single-family home sales, Orange County FL, 2026" 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 sales 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 new-owner list that follows the roll:** save your counties and filters in a task, with
`saleDateFrom` set to the months you want. 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 sale files
are republished with each tax roll (preliminary in July, final from October), so a monthly schedule
is enough.

**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 sales 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           |
| `sale`        | $0.002 | Per sale row delivered |

Examples: all 578 sales in Liberty County's 2026 file cost $1.17. 1,000 sales cost $2.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 sources are the Department of Revenue's published sale data (SDF) and tax roll (NAL) files,
  downloaded straight from floridarevenue.com. Values and codes are what the county property
  appraiser submitted.
- Each year's files cover sales from January of the previous year up to the roll date. The 2026
  preliminary files, published in July, hold sales from January 2025 to June 2026. The last months
  are thin: Miami-Dade's file has 5,000 to 7,000 sales in each month from January to April 2026,
  then 1,665 in May and 79 in June.
- The owner fields are the owner of record on the tax roll, which is usually the buyer for sales
  before the roll date but not always, for example when a parcel sold again later or the roll had
  not caught up with the deed. Check the county property appraiser or clerk before relying on a
  single record.
- Sale dates are month and year only; the files do not carry the day.
- Some counties leave the owner ZIP blank for many rows. Miami-Dade does so for most parcels, so
  `ownerZip` can be `null` even with a full street address.
- A parcel that sold twice in the period appears once per sale.
- 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: the actor reads each county's sale file, then its whole tax roll to
  find the matching parcels. A run stops reading as soon as it has matched every sale it kept.
- The actor is not affiliated with the Florida Department of Revenue or any county.

### FAQ

**How do I get a new homeowner mailing list in Florida?**

Pick counties, set `saleDateFrom`, keep `qualifiedOnly` on and use land use `001` for single-family
homes. Each row has the owner of record's mailing address.

**Is the owner always the buyer?**

Usually, but not always: the owner is whoever the tax roll lists, which can lag behind a very recent
deed or show a later buyer.

**Can I use it for sold comps?**

Yes. Filter by land use, `vacantOrImproved`, price and acreage, and keep `qualifiedOnly` on so
family transfers and foreclosure sales are left out.

### Related actors

- [New Homeowner & Business Leads (Certificates of Occupancy)](https://apify.com/finaldynamics/certificate-of-occupancy-leads):
  newly finished homes and business premises.
- [Florida Vacant Land & Absentee Owner Leads](https://apify.com/finaldynamics/florida-vacant-land-leads):
  vacant parcels and out-of-state owners in every Florida county.
- [Florida Lis Pendens, Pre-Foreclosure & Deed Leads](https://apify.com/finaldynamics/florida-lis-pendens-leads):
  lis pendens and deeds from five Florida county clerks.

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`):

Which yearly files to read. "Latest" uses the newest year the Department has published for both sales and the tax roll (final if available, otherwise preliminary). Choose preliminary or final to pick one, with the year below.

## `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.

## `saleDateFrom` (type: `string`):

First sale month to include, as YYYY-MM (for example 2026-01). Leave empty for no start.

## `saleDateTo` (type: `string`):

Last sale month to include, as YYYY-MM. Leave empty for no end.

## `qualifiedOnly` (type: `boolean`):

Keep only sales the property appraiser counts as arm's-length market sales (qualification codes 01 to 06). Drops family transfers, quit claim deeds, foreclosures, bank and government sales.

## `qualificationCodes` (type: `array`):

Keep only these two-digit qualification codes, for example \["11", "12"]. Leave empty for any. Used together with the option above when both are set.

## `vacantOrImproved` (type: `string`):

Whether the sale price was for vacant land or for land with buildings, as the appraiser recorded it.

## `minSalePrice` (type: `integer`):

Optional inclusive sale price bound in dollars. Blank disables the bound; missing prices do not match an active bound. Zero is a real value.

## `maxSalePrice` (type: `integer`):

Optional inclusive sale price bound in dollars. Blank disables the bound; missing prices do not match an active bound. Zero is a real value.

## `excludeMultiParcel` (type: `boolean`):

Leave out sales of several parcels on one deed, where each parcel often shows the whole price.

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

Department of Revenue land use codes, three digits. Leave empty for any. Examples: 000 vacant residential, 001 single family, 004 condominium, 010 vacant commercial, 040 vacant industrial.

## `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 parcels owned by federal, state, county, city, school, water district and railroad owners, and parcels with a government land use code (080 to 089). Sales whose parcel is not on the tax roll are left out when this is on.

## `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.

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

The most sale rows one run delivers, across all counties. A parcel that sold twice counts as two rows.

## Actor input object example

```json
{
  "counties": [
    "Liberty"
  ],
  "roll": "latest",
  "qualifiedOnly": false,
  "qualificationCodes": [],
  "vacantOrImproved": "any",
  "excludeMultiParcel": false,
  "landUseCodes": [],
  "ownerLocation": "any",
  "excludePublicOwners": false,
  "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",
    "qualifiedOnly": false,
    "qualificationCodes": [],
    "vacantOrImproved": "any",
    "excludeMultiParcel": false,
    "landUseCodes": [],
    "ownerLocation": "any",
    "excludePublicOwners": false,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("finaldynamics/florida-deed-transfer-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",
    "qualifiedOnly": False,
    "qualificationCodes": [],
    "vacantOrImproved": "any",
    "excludeMultiParcel": False,
    "landUseCodes": [],
    "ownerLocation": "any",
    "excludePublicOwners": False,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("finaldynamics/florida-deed-transfer-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",
  "qualifiedOnly": false,
  "qualificationCodes": [],
  "vacantOrImproved": "any",
  "excludeMultiParcel": false,
  "landUseCodes": [],
  "ownerLocation": "any",
  "excludePublicOwners": false,
  "maxResults": 100
}' |
apify call finaldynamics/florida-deed-transfer-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,finaldynamics/florida-deed-transfer-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/v3oIX0ucQ2wEMYQBa/builds/VfFgSjp4U0yRduIAe/openapi.json
