# US Property Owner Lookup: NY, NYC, CT, Chicago, Philly, DC (`larkmoor/us-property-owner-lookup`) Actor

Who owns this property? Search official open assessor data by owner name, address, ZIP or parcel id: owner and mailing address, market/assessed value, last sale, year built, units. New York State, NYC, Connecticut, Cook County IL, Philadelphia, Washington DC, Norfolk VA, Baton Rouge. $10/1k.

- **URL**: https://apify.com/larkmoor/us-property-owner-lookup.md
- **Developed by:** [Larkmoor Data](https://apify.com/larkmoor) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.50 / 1,000 property records

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/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

## US Property Owner Lookup: NY, NYC, CT, Chicago, Philly, DC

**Who owns this property?** Search official property-assessment records by **owner name**, **property address**, **ZIP code** or **parcel id** and get one clean row per parcel: owner name(s), owner mailing address, market and assessed value, last sale date and price, year built, building and lot size, units, property class, and the parcel id you need for the county's own records.

The data comes straight from the open data that the governments publish themselves — no people-search sites, no login, no captcha:

| Jurisdiction | Source | Owner names | Mailing address | Values | Last sale |
|---|---|---|---|---|---|
| New York State (every county outside NYC) | NYS Office of Real Property Tax Services, local assessment rolls | ✓ (up to 4) | ✓ | market + assessed | – |
| New York City (5 boroughs) | NYC Dept. of City Planning PLUTO | ✓ | – | assessed | – |
| Connecticut (all towns) | CT Office of Policy and Management parcel + CAMA data | ✓ + co-owner | ✓ | appraised + assessed | ✓ |
| Cook County IL / Chicago | Cook County Assessor | ✓ | ✓ | – | – |
| Philadelphia PA | Office of Property Assessment | ✓ (2) | ✓ | market | ✓ |
| Washington DC | Office of Tax and Revenue (ITS public extract) | ✓ (2) | ✓ | assessed + annual tax + balance due | ✓ |
| Norfolk VA | Office of the Real Estate Assessor | ✓ | – | total + land | ✓ |
| East Baton Rouge Parish LA | Assessor tax parcels | ✓ | ✓ | assessed + fair market | sale year |

### What you can use it for

- **Real-estate investors and wholesalers**: find who owns a property and where they get their mail (absentee owners have a different mailing address)
- **Portfolio research**: every parcel an LLC or a person owns across New York State, Connecticut, Philadelphia or DC
- **Due diligence**: confirm the owner of record, assessed value and last sale before a deal
- **Prospecting for contractors, solar, roofing and property managers**: owner lists for a ZIP or a town, filtered by value
- **Tax research in DC**: annual tax and current balance due per parcel

### Why this one

- **$10 per 1,000 properties** ($0.01 each) — other owner-lookup actors charge $50 per 1,000
- **Official sources only**, linked in every row (`sourceUrl`), refreshed by the publishers on their own schedule (NY roll year shown as `taxYear`)
- **One schema for every jurisdiction**: the same field names whether the parcel is in Albany, Brooklyn, Hartford, Chicago or Philadelphia
- **Any word order for names**: "McHugh Peter" and "Peter McHugh" both work; add `*` for a prefix (`Acme*`)
- **Forgiving addresses**: "5th Ave" finds "5 AVENUE"; street types are compared loosely
- **Value filters** so you only pay for the properties you want

### Input

| Field | What it does |
|---|---|
| Owner name | Person or company; every word must appear in an owner name |
| Property address | House number + street |
| ZIP code | 5 digits or a prefix |
| Parcel id | PIN / BBL / SSL / print key / account, partial works |
| City, town, county or borough | Narrow NY State, NYC, Connecticut and Cook County searches |
| Jurisdictions | Pick some or leave empty for all |
| Owner match | Fast (default) or contains-anywhere |
| Minimum / maximum value | Filter by market (or assessed) value |
| Max properties | Cap for the run |

```json
{ "ownerName": "Acme Holdings LLC", "jurisdictions": ["ny_state", "connecticut"], "maxResults": 50 }
```

```json
{ "address": "1600 Pennsylvania Ave", "jurisdictions": ["washington_dc"] }
```

```json
{ "zipCode": "06232", "minValue": 500000, "jurisdictions": ["connecticut"] }
```

### Output

```json
{
  "jurisdiction": "Washington DC (Office of Tax and Revenue)",
  "jurisdictionKey": "washington_dc",
  "state": "DC",
  "county": "District of Columbia",
  "city": "Washington",
  "parcelId": "1077 0130",
  "address": "1600 PENNSYLVANIA AVE SE",
  "zip": "20003",
  "ownerName": "BDC 1600 PENN LLC",
  "otherOwners": [
    "DNB 1600 PENN LLC"
  ],
  "mailingAddress": "4800 HAMPDEN LN STE 1200",
  "mailingCity": "BETHESDA MD 20814-2930",
  "propertyClass": "Residential-Apartment (Elevato",
  "useCode": "022",
  "neighborhood": "Old City 1",
  "lotAreaSqft": 17447,
  "assessedValue": 15983920,
  "assessedLandValue": 4845030,
  "annualTax": 135863.32,
  "taxBalanceDue": 0,
  "ownerOccupied": false,
  "lastSaleDate": "2017-02-17",
  "lastSalePrice": 26500000,
  "ward": "6",
  "sourceUrl": "https://opendata.dc.gov/datasets/integrated-tax-system-public-extract",
  "retrievedAt": "2026-10-30T10:47:11+00:00"
}
```

A New York State row adds `county`, `taxYear`, `schoolDistrict`, up to three `otherOwners` and `exemptionCodes`. Depending on the jurisdiction you also get `yearBuilt`, `lotAreaSqft`, `buildingAreaSqft`, `livingAreaSqft`, `bedrooms`, `bathrooms`, `floors`, `residentialUnits`, `appraisedValue`, `lastSaleDate`, `lastSalePrice`, `zoning`, `latitude`/`longitude` (NYC, Philadelphia), `annualTax` and `taxBalanceDue` (DC), `floodZone` (Baton Rouge), `exemptionCodes` (NY) a `detailsUrl` to the official property page where one exists, and for owner searches `matchedOn` (`owner`, or `co-owner or mailing name` when your name matched a second owner). Rows where the main owner matches come first, and a search across several jurisdictions mixes them evenly.

### How much does it cost?

Pay per event: **$0.01 per property returned** plus $0.001 per run start. Searches that find nothing cost only the start. Higher Apify plans get tier discounts (Bronze −5%, Silver −10%, Gold and up −15%).

Worked examples (Free tier):

- **One owner lookup** across all jurisdictions, 12 parcels found: **$0.12**
- **500 properties in one Connecticut ZIP above $500k**: **$5.00**
- **A daily check of 20 addresses**: about **$6 a month**

### FAQ

**Is it legal?** Yes. Every source is official open data that the government publishes for public reuse (New York's Open Data portal, NYC Open Data, CT Open Data, Cook County's data catalog, OpenDataPhilly, Open Data DC, Norfolk and Baton Rouge open data). The actor reads their public APIs politely and never touches a login.

**Can I use it for tenant, credit or employment screening?** No. This is not a consumer report under the FCRA and must not be used for those purposes. Use owner data in line with the privacy and marketing laws that apply to you (for example do-not-call rules).

**Why no phone numbers or emails?** Assessor records do not contain them, and we do not add data from people-search sites.

**How current is it?** As current as each publisher's last update: NY State rolls yearly, PLUTO a few times a year, Cook County and Philadelphia yearly with updates, DC regularly. `taxYear` / `dataVersion` show what you got.

**Why did my NYC address not match?** PLUTO lists one address per tax lot; large buildings can be filed under another street number on the same lot. Search by owner or BBL instead.

**More counties?** Yes — tell us which ones in the Issues tab; jurisdictions with official open owner data are added regularly.

### Tips

- Owner names are stored "LAST FIRST" in most places; any order works here, but use full words (or `*` for a prefix).
- Combine owner name and city to find a person's parcels in one town.
- Use `minValue` to skip cheap parcels and save money.

### Integrations

Export as CSV, Excel or JSON, call it from the Apify API, Make, Zapier or n8n, or schedule it to watch a list of addresses.

### Changelog

- 0.1 (Oct 2026): first release — 8 jurisdictions (NY State, NYC, Connecticut, Cook County, Philadelphia, DC, Norfolk, East Baton Rouge), owner/address/ZIP/parcel search, value filters.

# Actor input Schema

## `ownerName` (type: `string`):

Person or company, any word order: 'Smith John', 'John Smith', 'Acme Holdings LLC'. Every word must appear in an owner name. Add \* to a word for a prefix match (e.g. Acme\*).

## `address` (type: `string`):

House number and street, e.g. '1600 Pennsylvania Ave' or '135 Willow St'. Street type and ordinals are matched loosely (5th = 5).

## `zipCode` (type: `string`):

5-digit ZIP (or the first digits). Not available for New York State outside NYC and Baton Rouge.

## `parcelId` (type: `string`):

Parcel / PIN / BBL / SSL / account number as the jurisdiction writes it (partial values work).

## `cityOrCounty` (type: `string`):

Narrows the search: a New York county or town (e.g. Albany, Hempstead), an NYC borough (Brooklyn), a Connecticut town (Hartford) or a Cook County city (Evanston).

## `jurisdictions` (type: `array`):

Where to search. Empty = all of them.

## `ownerMatch` (type: `string`):

How owner names are looked up in the source data before the exact word check.

## `minValue` (type: `integer`):

Keep only properties whose market (or assessed) value is at least this. Rows without a value are skipped.

## `maxValue` (type: `integer`):

Keep only properties whose market (or assessed) value is at most this.

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

Total cap for the run (and per jurisdiction).

## Actor input object example

```json
{
  "ownerName": "BDC 1600 Penn LLC",
  "jurisdictions": [
    "washington_dc",
    "philadelphia_pa"
  ],
  "ownerMatch": "startsWith",
  "maxResults": 100
}
```

# Actor output Schema

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

All results as JSON items in the run's default dataset (also downloadable as CSV/Excel from the dataset).

# 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 = {
    "ownerName": "BDC 1600 Penn LLC",
    "jurisdictions": [
        "washington_dc",
        "philadelphia_pa"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("larkmoor/us-property-owner-lookup").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 = {
    "ownerName": "BDC 1600 Penn LLC",
    "jurisdictions": [
        "washington_dc",
        "philadelphia_pa",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("larkmoor/us-property-owner-lookup").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 '{
  "ownerName": "BDC 1600 Penn LLC",
  "jurisdictions": [
    "washington_dc",
    "philadelphia_pa"
  ]
}' |
apify call larkmoor/us-property-owner-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,larkmoor/us-property-owner-lookup"
        }
    }
}
```

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/gsW1jU8NngBYX4Ubm/builds/eTPTcbjYtmCueFX7t/openapi.json
