# Absentee Owner Lead List Builder — County Assessor Rolls (`malonestar/absentee-owner-lead-list-builder`) Actor

Build absentee-owner lead lists from county assessor rolls: Cook County IL, Philadelphia PA, NYC. Flags out-of-state and out-of-city owners by situs-vs-mailing mismatch, LLC/trust entity owners, with class and value filters. Clean JSON/CSV leads for wholesalers, flippers, direct mail and agents.

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

## Pricing

from $13.75 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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

## Absentee Owner Lead List Builder — County Assessor Rolls

Build **absentee-owner lead lists** straight from official county assessor / parcel rolls — no scraping of paywalled lead vendors, no stale resold data. The actor pulls live parcel records, compares the **property (situs) address against the owner's tax-bill mailing address**, and classifies every parcel into an absentee tier, so you can pull a targeted list of out-of-state landlords, tired out-of-town owners, or LLC-held inventory in minutes.

**Covered jurisdictions (v1):**

| County key | Source | What you get |
|---|---|---|
| `cook-il` | Cook County Assessor **Parcel Universe** (Socrata, latest assessment year auto-resolved) | Full mismatch classification + owner mailing address |
| `philadelphia-pa` | Philadelphia **OPA Properties** (Carto SQL API) | Full mismatch classification + market value |
| `nyc` | NYC **PLUTO** (Socrata) | Owner-name lists only — see limitation below |

### Who this is for

- **Wholesalers & flippers** — pull every out-of-state owner of residential parcels in Cook County and start driving for dollars with a real list.
- **Direct-mail investors** — export mailing name + address columns, dedupe, and drop a campaign; the tier field lets you segment "out-of-state" vs "same city, different address."
- **Real-estate agents & farm builders** — find absentee landlords in your farm area likely to sell.
- **Data / prop-tech teams** — a clean, unified JSON schema across counties, callable as an API or MCP tool.

### Example input

```json
{
  "county": "cook-il",
  "absenteeTier": "out_of_state",
  "propertyClassPrefix": "2",
  "entityOnly": false,
  "maxResults": 100
}
````

Filters:

- `county` — `cook-il` | `philadelphia-pa` | `nyc`
- `absenteeTier` — `any` | `out_of_state` | `out_of_city` (alias `out_of_county`) | `same_area_diff_address` | `owner_occupied_likely`
- `entityOnly` — keep only LLC / trust / corp / partnership owners
- `propertyClassPrefix` — source class-code prefix (Cook `2` = residential, `5` = commercial; PLUTO `A` = one-family; OPA `1` = single family)
- `minAssessedValue` — value floor (Philadelphia `market_value`, NYC `assesstot`; not available for Cook)
- `maxResults` — cost cap, up to 10,000 rows per run

### Output fields (one row per parcel lead)

`county`, `parcel_id`, `situs_address`, `situs_city`, `situs_state`, `owner_name`, `owner_mailing_address`, `owner_mailing_city`, `owner_mailing_state`, `owner_mailing_zip`, `absentee_tier`, `entity_flag`, `assessed_value`, `property_class`, `property_class_desc`, `lat`, `lon`, `source`, `source_url`

#### The absentee-tier classifier

| Tier | Meaning |
|---|---|
| `out_of_state` | Mailing state differs from the property state — the strongest absentee/motivated-seller signal |
| `out_of_city` | Mailing city differs, same state (out-of-town landlord) |
| `same_area_diff_address` | Same city, different street address (local landlord) |
| `owner_occupied_likely` | Mailing address matches the property (street-normalized; same-building condo units count as matches) |
| `unknown` | No mailing data in the source (all `nyc` rows) |

`entity_flag` is true when the owner name matches LLC, L.L.C., LP, LLP, LTD, TRUST, TR, CORP, INC, CO, COMPANY, PARTNERS, HOLDINGS, PROPERTIES, or BANK — combine `entityOnly: true` with a tier for investor-owned absentee inventory.

### Honest limitation: the NYC leg

NYC PLUTO publishes owner **names** but **no owner mailing address**, so the situs-vs-mailing comparison is impossible for NYC in v1. The `nyc` county therefore ships as a **corporate/LLC-owner flag list** (`absentee_tier` is always `unknown`; use `entityOnly: true`). Mailing-address enrichment for NYC is on the roadmap.

Other notes: Cook County's Parcel Universe has no assessed-value column, so `assessed_value` is null and `minAssessedValue` is ignored for `cook-il`. Tiers are heuristics computed from address strings — verify before making offers.

### Use as an MCP tool

This actor is callable by AI agents (Claude, Cursor, etc.) via [mcp.apify.com](https://mcp.apify.com) — the input and output schemas are fully described at field level, so an agent can request e.g. "out-of-state entity owners of multi-family parcels in Cook County" and chain the resulting leads into skip-tracing or CRM tools.

### FAQ

**How do I find absentee owners of a property for free?**
County assessor rolls are public record. This actor automates the pull and the situs-vs-mailing comparison across Cook County IL, Philadelphia PA, and NYC, and gives you export-ready JSON/CSV.

**How do I get a list of out-of-state property owners in Chicago / Cook County?**
Run with `county: "cook-il"`, `absenteeTier: "out_of_state"`, `propertyClassPrefix: "2"` (residential). Each row includes the owner's out-of-state mailing address for direct mail.

**Can I get absentee owner leads for Philadelphia?**
Yes — `county: "philadelphia-pa"` classifies every OPA parcel by mailing mismatch and includes `market_value` so you can set a value floor.

**How do I find LLC-owned properties in NYC?**
Run `county: "nyc"` with `entityOnly: true` (optionally `propertyClassPrefix` like `"C"` for walk-up apartments). PLUTO has no mailing addresses, so NYC rows are owner-name flag lists.

**Is this data legal to use for marketing?**
The sources are official open-data portals published for public use. You are responsible for complying with local telemarketing/mail regulations (e.g. do-not-call lists).

**How fresh is the data?**
Live at run time. The Cook leg auto-resolves the latest assessment year in the Parcel Universe; Philadelphia OPA and NYC PLUTO are updated by their agencies on their own cycles.

### Pricing

Pay per result row — you only pay for the leads you pull (set `maxResults` to cap spend). Empty runs cost virtually nothing.

# Actor input Schema

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

Which assessor/parcel roll to build leads from. cook-il = Cook County IL (Chicago area, full mailing-address mismatch classification). philadelphia-pa = Philadelphia OPA (full classification). nyc = NYC PLUTO (owner names only — no mailing address in the source, so rows are corporate/LLC-owner flag lists with absentee\_tier=unknown).

## `absenteeTier` (type: `string`):

Keep only leads in one absentee tier. out\_of\_state = owner's mailing state differs from the property state (strongest absentee signal). out\_of\_city = mailing city differs, same state (out\_of\_county is accepted as an alias). same\_area\_diff\_address = same city but a different street address. owner\_occupied\_likely = mailing matches the property. any = no tier filter. Ignored for nyc (no mailing data).

## `entityOnly` (type: `boolean`):

Keep only parcels whose owner name looks like a legal entity (LLC, LP, LLP, LTD, TRUST, TR, CORP, INC, CO, COMPANY, PARTNERS, HOLDINGS, PROPERTIES, BANK). Great for targeting investor-owned inventory; this is the only useful filter for the nyc leg.

## `propertyClassPrefix` (type: `string`):

Filter by the source's property-class code prefix. cook-il: Cook Assessor major class, e.g. "2" = residential, "3" = multi-family, "5" = commercial/industrial. nyc: PLUTO building class, e.g. "A" = one-family, "C" = walk-up apartments. philadelphia-pa: OPA category\_code, e.g. "1" = single family (applied client-side). Leave empty for all classes.

## `minAssessedValue` (type: `integer`):

Keep only parcels at or above this value. Uses market\_value for philadelphia-pa and assesstot for nyc. The Cook County Parcel Universe dataset carries no assessed-value column, so this filter is ignored for cook-il (a warning is logged).

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

Maximum number of lead rows to emit (caps your cost — you are billed per result row). Hard cap 10,000 per run.

## Actor input object example

```json
{
  "county": "cook-il",
  "absenteeTier": "out_of_state",
  "entityOnly": false,
  "propertyClassPrefix": "2",
  "maxResults": 100
}
```

# Actor output Schema

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

The default dataset of classified absentee-owner leads.

# 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 = {
    "county": "cook-il",
    "absenteeTier": "out_of_state",
    "propertyClassPrefix": "2",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/absentee-owner-lead-list-builder").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 = {
    "county": "cook-il",
    "absenteeTier": "out_of_state",
    "propertyClassPrefix": "2",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/absentee-owner-lead-list-builder").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 '{
  "county": "cook-il",
  "absenteeTier": "out_of_state",
  "propertyClassPrefix": "2",
  "maxResults": 100
}' |
apify call malonestar/absentee-owner-lead-list-builder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malonestar/absentee-owner-lead-list-builder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Absentee Owner Lead List Builder — County Assessor Rolls",
        "description": "Build absentee-owner lead lists from county assessor rolls: Cook County IL, Philadelphia PA, NYC. Flags out-of-state and out-of-city owners by situs-vs-mailing mismatch, LLC/trust entity owners, with class and value filters. Clean JSON/CSV leads for wholesalers, flippers, direct mail and agents.",
        "version": "1.0",
        "x-build-id": "8s08brY53jzbTFXpd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/malonestar~absentee-owner-lead-list-builder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-malonestar-absentee-owner-lead-list-builder",
                "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~absentee-owner-lead-list-builder/runs": {
            "post": {
                "operationId": "runs-sync-malonestar-absentee-owner-lead-list-builder",
                "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~absentee-owner-lead-list-builder/run-sync": {
            "post": {
                "operationId": "run-sync-malonestar-absentee-owner-lead-list-builder",
                "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": {
                    "county": {
                        "title": "County / city",
                        "enum": [
                            "cook-il",
                            "philadelphia-pa",
                            "nyc"
                        ],
                        "type": "string",
                        "description": "Which assessor/parcel roll to build leads from. cook-il = Cook County IL (Chicago area, full mailing-address mismatch classification). philadelphia-pa = Philadelphia OPA (full classification). nyc = NYC PLUTO (owner names only — no mailing address in the source, so rows are corporate/LLC-owner flag lists with absentee_tier=unknown).",
                        "default": "cook-il"
                    },
                    "absenteeTier": {
                        "title": "Absentee tier filter",
                        "enum": [
                            "any",
                            "out_of_state",
                            "out_of_city",
                            "same_area_diff_address",
                            "owner_occupied_likely"
                        ],
                        "type": "string",
                        "description": "Keep only leads in one absentee tier. out_of_state = owner's mailing state differs from the property state (strongest absentee signal). out_of_city = mailing city differs, same state (out_of_county is accepted as an alias). same_area_diff_address = same city but a different street address. owner_occupied_likely = mailing matches the property. any = no tier filter. Ignored for nyc (no mailing data).",
                        "default": "any"
                    },
                    "entityOnly": {
                        "title": "Entity owners only (LLC / trust / corp)",
                        "type": "boolean",
                        "description": "Keep only parcels whose owner name looks like a legal entity (LLC, LP, LLP, LTD, TRUST, TR, CORP, INC, CO, COMPANY, PARTNERS, HOLDINGS, PROPERTIES, BANK). Great for targeting investor-owned inventory; this is the only useful filter for the nyc leg.",
                        "default": false
                    },
                    "propertyClassPrefix": {
                        "title": "Property class prefix",
                        "type": "string",
                        "description": "Filter by the source's property-class code prefix. cook-il: Cook Assessor major class, e.g. \"2\" = residential, \"3\" = multi-family, \"5\" = commercial/industrial. nyc: PLUTO building class, e.g. \"A\" = one-family, \"C\" = walk-up apartments. philadelphia-pa: OPA category_code, e.g. \"1\" = single family (applied client-side). Leave empty for all classes."
                    },
                    "minAssessedValue": {
                        "title": "Minimum assessed / market value (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only parcels at or above this value. Uses market_value for philadelphia-pa and assesstot for nyc. The Cook County Parcel Universe dataset carries no assessed-value column, so this filter is ignored for cook-il (a warning is logged)."
                    },
                    "maxResults": {
                        "title": "Max leads",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of lead rows to emit (caps your cost — you are billed per result row). Hard cap 10,000 per run.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
