# Realtor License Roster, New Applicants & Broker Change Delta (`malonestar/realtor-license-roster-delta`) Actor

Real estate licensee lead feeds for recruiters: TREC daily new license applications (future agents), newly licensed agents, and agent-switched-broker (affiliation change) events. TX live via Socrata; FL weekly DBPR roster. Normalized records with license, status, county, sponsoring broker.

- **URL**: https://apify.com/malonestar/realtor-license-roster-delta.md
- **Developed by:** [Kyle Maloney](https://apify.com/malonestar) (community)
- **Categories:** Lead generation, Real estate, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Realtor License Roster, New Applicants & Broker Change Delta

Real-estate licensee **lead feeds** for brokerage recruiters, title companies, and proptech —
built directly on official state licensing data. Three feeds in one actor:

| Feed | What you get | Why it matters |
|---|---|---|
| `new_applicants` | **TREC daily license applications** — people who just applied for a Texas real-estate license | Future agents, **pre-license**. Reach them before they pick a brokerage. No other public feed surfaces this. |
| `delta` → `newly_licensed` | Licenses that appeared since your last run | Brand-new agents, day-one recruiting window |
| `delta` → `affiliation_change` | An agent's **sponsoring broker changed** (with `previous_broker`) | THE recruiting/retention signal: who is switching brokerages, from whom, to whom |
| `roster` | Bounded slice of the current licensee roster | Bulk enrichment, territory mapping, CRM seeding |

### Who it's for
- **Brokerage recruiters / team leads** — daily pipeline of new applicants, newly licensed agents, and agents in motion between brokerages.
- **Title, escrow, and mortgage BD teams** — new licensees are new relationship targets; affiliation changes reshuffle referral networks.
- **Proptech & data teams** — clean, normalized licensee records with stable snake_case fields for enrichment pipelines and agent-graph products.

### Data sources (verified live 2026-07-23)
- **TX — TREC Real Estate License Roster** (Socrata, `data.texas.gov/resource/s7ft-44qi.json`): full roster with license status, type, original license date, county, and the **sponsoring-broker relation** used for affiliation tracking.
- **TX — TREC License Applications** (Socrata, `data.texas.gov/resource/bf5n-799f.json`): daily applications with applicant name, license type, and date received. Powers the unique `new_applicants` feed.
- **FL — DBPR Real Estate weekly extract** (regional CSVs from the [Real Estate Commission public-records page](https://www2.myfloridalicense.com/real-estate-commission/public-records/)): full licensee rows including **mailing address**, city, county, statuses, and dates. Choose regions 1–14 via `flRegions` (files are large; default is region 1).

### Example input
```json
{
  "states": ["TX"],
  "feed": "new_applicants",
  "daysBack": 14,
  "maxResults": 200
}
````

The `daysBack` window is **anchored to the newest date in the applications dataset**, not to
today — so the feed never returns empty just because the state paused publishing for a few days.

Other useful inputs:

```json
{ "states": ["TX"], "feed": "delta", "licenseType": "Sales Agent", "maxScan": 20000, "maxResults": 500 }
```

```json
{ "states": ["FL"], "feed": "roster", "flRegions": ["1"], "county": "Escambia", "maxResults": 200 }
```

### Output fields

Every record uses the same normalized schema:
`state`, `feed`, `licensee_name`, `license_type`, `license_number`, `license_status`,
`county`, `city` (FL), `mailing_address` (FL), `sponsoring_broker_name`,
`sponsoring_broker_license`, `original_license_date`, `application_date`,
`event_type` (`new_applicant` | `newly_licensed` | `affiliation_change` | `roster`),
`previous_broker` (on affiliation changes), `source`, `source_url`.

### How the delta works

- The **first** `delta` run seeds a baseline (license number → status + sponsoring broker) in the
  actor's key-value store and emits **no events** — that's honest delta semantics, not a bug.
- Every later run compares the freshest `maxScan` roster records (TX is scanned
  most-recently-updated first) against the baseline and emits `newly_licensed` and
  `affiliation_change` events, then updates the baseline. Schedule it daily or weekly.
- Scanned records are not billed — only emitted events are.

### Honest notes / limitations

- **Contact fields:** public licensing files contain **no email or phone**. TX gives you
  name + license + county; FL gives you name + full mailing address. This is a
  licensing-signal feed you enrich, not a contact list.
- **FL** has no public application feed, so `new_applicants` is TX-only (FL is skipped with a
  warning for that feed). FL supports `roster` and `delta`.
- FL sponsoring-broker columns are mapped best-effort from the weekly extract layout; TX
  affiliation data comes from the verified `related_license_*` roster columns.
- TX roster `county` is frequently blank at the source.

### Use as an MCP tool

This actor is callable by AI agents (Claude, Cursor, etc.) via [mcp.apify.com](https://mcp.apify.com) —
the normalized field-level output schema makes it easy to chain into enrichment or CRM workflows.

### FAQ

**How do I find newly licensed real estate agents in Texas?**
Run `feed: "delta"` on a schedule; after the first baseline run, every run emits `newly_licensed` events. For an even earlier signal, `feed: "new_applicants"` lists people who only just applied.

**How do I know when an agent switches brokerages?**
Scheduled `delta` runs emit `affiliation_change` events with the new sponsoring broker and the `previous_broker` they left.

**Does this include agent emails or phone numbers?**
No — state licensing files don't publish them. You get name, license, status, county (TX) and mailing address (FL) to feed your enrichment stack.

**Which states are covered?**
Texas (roster + daily applications + delta, live) and Florida (weekly roster + delta). More states can be added as config blocks — request one.

**Why was my first delta run empty?**
By design: it seeds the baseline. The second run onward emits events.

### Pricing

Pay per result: you are billed only for the licensee records actually emitted (cap with `maxResults`). Records scanned to build a delta baseline are **not** billed. Runs that match nothing cost only the actor start.

### Related actors

| Actor | What it adds |
|---|---|
| [RIA Registration Delta Monitor](https://apify.com/malonestar/ria-registration-delta-monitor) | The same new-registration / affiliation-change pattern for SEC investment advisers |
| [NYC Landlord Registry Lead List](https://apify.com/malonestar/nyc-landlord-registry-lead-list) | Property-manager and landlord contacts for the agents you recruit |
| [Absentee Owner Lead List Builder](https://apify.com/malonestar/absentee-owner-lead-list-builder) | Listing-side seller leads to hand new agents on day one |

# Actor input Schema

## `states` (type: `array`):

US states to pull. Supported: TX (roster + daily new applications + delta) and FL (weekly roster CSV + delta). Default TX.

## `feed` (type: `string`):

Which lead feed to produce. new\_applicants = TREC daily license applications (future agents, pre-license, TX only). roster = a bounded slice of the current licensee roster. delta = compare against the saved baseline and emit newly\_licensed + affiliation\_change events (first run only seeds the baseline).

## `daysBack` (type: `integer`):

Look-back window in days for the new\_applicants feed. Anchored to the newest date in the applications dataset (not today), so the feed never comes back empty because of publishing lag.

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

Maximum number of records to push to the dataset (billing is per result).

## `name` (type: `string`):

Optional case-insensitive filter on licensee name (TX: full name; applications: last name; FL: licensee name).

## `county` (type: `string`):

Optional case-insensitive county filter, e.g. "Travis" or "Escambia". Note: many TX rows have a blank county.

## `licenseType` (type: `string`):

Optional case-insensitive license-type filter, e.g. "Sales Agent", "Broker", "Corporation".

## `status` (type: `string`):

Optional case-insensitive license-status filter, e.g. "Active". Ignored on the TX applications dataset (it has no status column).

## `flRegions` (type: `array`):

Florida DBPR region numbers 1-14 to download when states includes FL (each region is one weekly CSV; files are large, so default is region 1 only).

## `maxScan` (type: `integer`):

How many roster records to scan per state when building/comparing the delta baseline. TX is scanned most-recently-updated first, so changes land inside this window. Scanned records are not billed - only emitted delta events are.

## Actor input object example

```json
{
  "states": [
    "TX"
  ],
  "feed": "new_applicants",
  "daysBack": 14,
  "maxResults": 200,
  "flRegions": [
    "1"
  ],
  "maxScan": 20000
}
```

# Actor output Schema

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

The default dataset of licensee lead records.

# 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 = {
    "states": [
        "TX"
    ],
    "feed": "new_applicants",
    "daysBack": 14,
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/realtor-license-roster-delta").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 = {
    "states": ["TX"],
    "feed": "new_applicants",
    "daysBack": 14,
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/realtor-license-roster-delta").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "states": [
    "TX"
  ],
  "feed": "new_applicants",
  "daysBack": 14,
  "maxResults": 200
}' |
apify call malonestar/realtor-license-roster-delta --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malonestar/realtor-license-roster-delta",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Realtor License Roster, New Applicants & Broker Change Delta",
        "description": "Real estate licensee lead feeds for recruiters: TREC daily new license applications (future agents), newly licensed agents, and agent-switched-broker (affiliation change) events. TX live via Socrata; FL weekly DBPR roster. Normalized records with license, status, county, sponsoring broker.",
        "version": "1.0",
        "x-build-id": "6op5c41IjrqxxTrzF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/malonestar~realtor-license-roster-delta/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-malonestar-realtor-license-roster-delta",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/malonestar~realtor-license-roster-delta/runs": {
            "post": {
                "operationId": "runs-sync-malonestar-realtor-license-roster-delta",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/malonestar~realtor-license-roster-delta/run-sync": {
            "post": {
                "operationId": "run-sync-malonestar-realtor-license-roster-delta",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "states": {
                        "title": "States",
                        "type": "array",
                        "description": "US states to pull. Supported: TX (roster + daily new applications + delta) and FL (weekly roster CSV + delta). Default TX.",
                        "default": [
                            "TX"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "feed": {
                        "title": "Feed",
                        "enum": [
                            "new_applicants",
                            "roster",
                            "delta"
                        ],
                        "type": "string",
                        "description": "Which lead feed to produce. new_applicants = TREC daily license applications (future agents, pre-license, TX only). roster = a bounded slice of the current licensee roster. delta = compare against the saved baseline and emit newly_licensed + affiliation_change events (first run only seeds the baseline).",
                        "default": "new_applicants"
                    },
                    "daysBack": {
                        "title": "Days back (new_applicants)",
                        "minimum": 0,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Look-back window in days for the new_applicants feed. Anchored to the newest date in the applications dataset (not today), so the feed never comes back empty because of publishing lag.",
                        "default": 14
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum number of records to push to the dataset (billing is per result).",
                        "default": 200
                    },
                    "name": {
                        "title": "Name contains",
                        "type": "string",
                        "description": "Optional case-insensitive filter on licensee name (TX: full name; applications: last name; FL: licensee name)."
                    },
                    "county": {
                        "title": "County contains",
                        "type": "string",
                        "description": "Optional case-insensitive county filter, e.g. \"Travis\" or \"Escambia\". Note: many TX rows have a blank county."
                    },
                    "licenseType": {
                        "title": "License type contains",
                        "type": "string",
                        "description": "Optional case-insensitive license-type filter, e.g. \"Sales Agent\", \"Broker\", \"Corporation\"."
                    },
                    "status": {
                        "title": "Status contains",
                        "type": "string",
                        "description": "Optional case-insensitive license-status filter, e.g. \"Active\". Ignored on the TX applications dataset (it has no status column)."
                    },
                    "flRegions": {
                        "title": "FL regions",
                        "type": "array",
                        "description": "Florida DBPR region numbers 1-14 to download when states includes FL (each region is one weekly CSV; files are large, so default is region 1 only).",
                        "default": [
                            "1"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxScan": {
                        "title": "Max records scanned (delta)",
                        "minimum": 100,
                        "maximum": 500000,
                        "type": "integer",
                        "description": "How many roster records to scan per state when building/comparing the delta baseline. TX is scanned most-recently-updated first, so changes land inside this window. Scanned records are not billed - only emitted delta events are.",
                        "default": 20000
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
