# US Property Lookup & Listing Scraper by APN/Parcel (`scrapebench/property-lookup-by-apn`) Actor

Give a US parcel number (APN), get the property's address from the county parcel map, then its Zillow / Redfin record: price, estimate, beds, baths, size, photos and listing link. Pay per property found.

- **URL**: https://apify.com/scrapebench/property-lookup-by-apn.md
- **Developed by:** [ScrapeBench](https://apify.com/scrapebench) (community)
- **Categories:** Real estate
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.008 / property found

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

## US Property Lookup & Listing Scraper by APN/Parcel

### Pain points

- Zillow, Redfin and Realtor.com do not search by parcel number: in our 2026-10-29 test, Zillow's and Realtor.com's own search boxes resolved 0 of 10 known APNs.
- Turning a list of APNs into addresses means opening each county's parcel map, one parcel at a time, and every county's map works differently.
- County rolls write addresses a listing site cannot find: '0010 Dunkin DR (CR 521)' in 'Unincorporated Summit County', with no ZIP.

### What we solve

- Looks each parcel number up in the county's or state's public parcel map and reads the property address from it.
- Cleans that address into a postal one (leading zeros and county-road tags removed; the postal town and ZIP from the US Census geocoder when the roll has none) and looks it up on Redfin, then Zillow.
- Returns one row per parcel number, and says plainly why when there is no property: state not covered, parcel not found, no street address on the roll, or no listing.

### Summary

Give it US parcel numbers (APNs) written STATE/County/APN and it returns each property's Zillow or Redfin record: address, property type, beds, baths, living area, lot size, year built, price or estimate, photos and the listing link, plus the parcel's own address as the county roll writes it. Step one reads the county's public parcel map, so coverage goes state by state: statewide in Arkansas, California, Colorado, Connecticut, Florida, Idaho (13 counties), Indiana, Massachusetts, Minnesota (opt-in counties), Montana, New Jersey, New York, North Carolina, Ohio, Utah, Vermont, Washington and Wisconsin, plus big counties in 16 more states (Cook IL, Dallas and Tarrant TX, Maricopa AZ, Washoe NV, Philadelphia PA and more). A parcel number repeats across counties, so the county is required. You pay only for a parcel number that reaches a listing-site property; every other row is free and says why.

### Who it's for

- Real-estate investors working from tax-delinquent, probate or auction lists that carry parcel numbers, not addresses
- Title, appraisal and lending teams matching assessor records to market listings
- Land and property data teams joining parcel datasets to listing data
- Agents and wholesalers researching a list of parcels in a county

### How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

```json
{
  "apns": [
    "CA/Santa Clara/00361019",
    "CO/Adams/0171901104005"
  ]
}
```

See **Inputs** below for every available field.

### What you get

One row per record:

| Field | Description |
|---|---|
| `apn` | The parcel number you asked for |
| `found` | True when the parcel reached a listing-site property |
| `county, parcelId, parcelAddress` | The county, and the parcel number and property address as the county roll writes them |
| `searchedAddress` | The postal address sent to the listing sites |
| `address, city, state, zip` | The property as the listing site resolved it |
| `propertyType, beds, baths, sqft, lotSizeSqft, yearBuilt` | Core facts from the listing site |
| `sourceUrl` | The listing page |
| `images, floorPlans` | Photos and floor plans the listing publishes (\[] when none) |
| `source` | redfin or zillow |
| `notice, notice_type` | On a free row: why there is no property (not_covered, not_found, no_address, no_match, blocked, input_error) |

Sample:

```json
{
  "apn": "CA/Santa Clara/00361019",
  "county": "Santa Clara",
  "parcelId": "00361019",
  "parcelAddress": "745 GARLAND DR",
  "searchedAddress": "745 GARLAND DR, PALO ALTO, CA 94303",
  "found": true,
  "address": "745 Garland Dr",
  "city": "Palo Alto",
  "state": "CA",
  "zip": "94303",
  "propertyType": "Single Family Residential",
  "beds": 5,
  "baths": 4.5,
  "sqft": 4110,
  "lotSizeSqft": 12722,
  "yearBuilt": 2012,
  "estimatedValue": 8864967,
  "price": 6750000,
  "priceLabel": "Last Sold Price",
  "lastSoldDate": "2018-08-09",
  "status": "Sold",
  "taxAssessedValue": 7680343,
  "sourceUrl": "https://www.redfin.com/CA/Palo-Alto/745-Garland-Dr-94303/home/1210666",
  "source": "redfin"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `apns` | no | array | `["CA/Santa Clara/00361019", "CO/Adams/0171901104005"]` | Assessor parcel numbers, one per line, written STATE/County/APN, e.g. 'CO/Summit/400358' or 'CA/Alameda/66-2763-16'. A parcel number is only unique within its county, so the county is required (or set it once below). Write the APN as the county does; dashes and spaces are optional. |
| `apn` | no | string | — | One parcel number; kept for saved tasks and API callers that send one value. Combined with 'Parcel numbers'. |
| `stateHint` | no | string | — | Two-letter state for bare parcel numbers (no 'STATE/County/' prefix), e.g. 'CO'. |
| `countyHint` | no | string | — | County for bare parcel numbers, e.g. 'Summit'. Used with 'State'. |
| `source` | no | string | `"auto"` | Where to look the address up. 'Redfin, then Zillow' tries Redfin first and falls back to Zillow. 'All' also checks Realtor.com through Apify's Web Fetch with YOUR Apify account, so Apify bills you for that separately (about $0.0015 a page). |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Optional. The county and state parcel maps answer without a proxy; set one only if a map refuses Apify's IPs. |

### Pricing (Pay Per Event)

You pay per result (`property-found`) — **no charge for empty runs**. Example: **100 properties found** at *$0.008/result* ≈ **$0.80**.

Example: 100 parcel numbers that each reach a property cost $0.80; parcel numbers that do not are free. With 'All' sites selected, Realtor.com pages are opened through Apify's Web Fetch on your account and billed by Apify separately (about $0.0015 a page). Apify platform usage is billed separately per your plan.

### Use cases

- Tax-sale and auction lists: turn the county's list of parcel numbers into addresses with beds, baths, size and an estimate.
- Parcel dataset enrichment: add the listing link, photos and property facts to rows keyed by APN.
- Portfolio checks: see which of a set of parcels is listed for sale right now.
- Due diligence: confirm the property address behind a parcel number before an offer.

### Why this actor

- Parcel number in, listing-site record out, in one run: no copying addresses out of county parcel maps by hand.
- Addresses are cleaned into postal ones first, so parcels in unincorporated areas still match.
- Every row says what happened; parcels that do not reach a property cost nothing.
- Built on the same property lookup as Zillow & Redfin Property Data Scraper.

### Limitations & updates

US parcels in the covered states and counties only; coverage follows the public parcel maps counties and states publish, and some leave out the street address. The county is required. Harris County TX publishes only a bulk file and is not read yet. The listing record comes from Redfin or Zillow and exists only for homes they track. Parcel maps are snapshots the counties refresh on their own schedule.

### FAQ

**Which states and counties are covered?**

Statewide: Arkansas, California, Colorado (44 of 64 counties), Connecticut, Florida, Idaho (13 of 44 counties), Indiana, Massachusetts, Minnesota (counties that publish open data), Montana, New Jersey, New York (most counties), North Carolina, Ohio, Utah, Vermont, Washington (all but Asotin County) and Wisconsin. Counties: Maricopa and Pima AZ, Fulton and Cobb GA, Cook and DuPage IL, Detroit and Oakland MI, Clay MO, Hinds and DeSoto MS, Lancaster NE, Santa Fe NM, Washoe NV (Reno), Multnomah OR (Portland), Philadelphia and Bucks PA, Davidson TN, Dallas and Tarrant TX, Chesterfield VA, Mobile AL and New Castle DE (Wilmington). A parcel elsewhere returns a free not_covered row.

**How do I write a parcel number?**

STATE/County/APN, e.g. 'CO/Summit/400358' or 'CA/Alameda/66-2763-16'. The county is required because the same number exists in other counties. If every parcel is in one county, give bare numbers and set State and County once. Write the number as the county does; dashes and spaces are optional, but a county that writes dashes cannot always be matched from a number typed without them.

**Why did a parcel come back with no property?**

The row says why. not_covered: no public parcel map we read covers that county yet. not_found: the county's map has no parcel with that number. no_address: the parcel has no street address on the roll (vacant land, roads, many rural lots). no_match: the address exists but neither Redfin nor Zillow has the property. blocked: a site did not answer; try again later. None of these are charged.

**Does it accept a county's account number instead of the parcel number?**

In Colorado and Utah, yes: those counties hand out both, and a lookup matches either exactly.

**How am I charged?**

$0.008 per parcel number that reaches a Zillow or Redfin property. Everything else is free. Realtor.com pages (optional, the 'All' setting) are billed by Apify to your account at about $0.0015 a page.

**I already have addresses. Which tool should I use?**

Zillow & Redfin Property Data Scraper: it takes addresses and returns the full property record (estimates, price and tax history, schools, agent).

### Which actor to choose

Related property tools in the same suite:

- **Zillow & Redfin Property Data Scraper** — You already have street addresses and want the full property record.
- **US Property Records Export & Owner Lookup** — You want the assessor's own record for a parcel (owner, mailing address, assessed value, last sale), or every parcel in a county or ZIP.

### Guides & use cases

Written up on **[scrapebench.dev](https://scrapebench.dev)** — the bench that runs and verifies this actor against the live source every night:

- **How-to:** [How to run US Property Lookup & Listing Scraper by APN/Parcel](https://scrapebench.dev/guides/how-to-property-lookup-by-apn/)
- **Use case:** [Santa Clara County APN Lookup: Parcel Number to Zillow & Redfin](https://scrapebench.dev/use-cases/santa-clara-apn-lookup/)

More actors, coverage and nightly verification results: **[scrapebench.dev](https://scrapebench.dev)**

### Works with AI assistants (MCP)

Callable as an MCP tool, so Claude, Cursor, VS Code Copilot and other MCP clients can run it directly. Grab the config from the [MCP tab](https://apify.com/scrapebench/property-lookup-by-apn/api/mcp) on this page — Apify hosts the server and keeps that snippet current, and OAuth signs you in on first connect, so no API token goes in your config file.

Then just ask:

> "Look up parcel 00361019 in Santa Clara County, California, and give me the property's address, size and listing link."

Parcel 00361019 is 745 Garland Dr, Palo Alto, CA 94303: a 5-bed, 4,110 sq ft home built in 2012, with its Redfin listing link (test run, 2026-10-29). Runs started this way bill exactly like any other run.

### Data & lawful use

This actor collects publicly available information that County and state assessor and GIS offices (the parcel maps), the US Census Bureau (its public geocoder), and Redfin and Zillow (the listing data) publishes for public
lookup — licence records, business listings and the contact details professionals list there.
Some of it identifies individuals (sole proprietors, licence holders, agents), so treat any
names, phone numbers and emails in your results as personal data.

When you run this actor, you decide what is collected and what it is used for, so you are the
controller of that data and we act only as your processor (Apify Standard Actor Contract).
You need a lawful basis for your use, must honour opt-out and deletion requests, and must
follow the marketing rules that apply to you (CAN-SPAM, TCPA, GDPR, CCPA and similar).
Don't use the output for unsolicited bulk messaging, for screening covered by the FCRA, or
for anything the source's own terms forbid.

Your results are stored in your own Apify account. We don't keep a copy of your results and
don't sell or share them.

### Disclaimer

This is an independent tool. It is not affiliated with, endorsed by or sponsored by
County and state assessor and GIS offices (the parcel maps), the US Census Bureau (its public geocoder), and Redfin and Zillow (the listing data). Names and marks are used only to describe the data source. Records are
provided as published by the source and may be out of date or incomplete. For anything
consequential (hiring, a permit, a legal decision), confirm the record with the issuing
agency. You are responsible for making sure your use complies with applicable law and the
source's terms.

### Need help?

Open an issue on this actor's **Issues** tab and we'll respond there. Bug reports, missing
fields and feature requests are all welcome. Guides and examples: [scrapebench.dev](https://scrapebench.dev).

If you are a person named in this data and want your record removed from our copy, email
apify-help@scrapebench.dev; the source agency remains the official record.

Your run may be used to improve our services. If something looks off, or you want this actor to fit your use better, please share your run data with us: [Apify Console → Settings → Security → Share run data with developers](https://console.apify.com/settings/security). It lets us see exactly what went wrong and keep improving the actor.

# Actor input Schema

## `apns` (type: `array`):

Assessor parcel numbers, one per line, written STATE/County/APN, e.g. 'CO/Summit/400358' or 'CA/Alameda/66-2763-16'. A parcel number is only unique within its county, so the county is required (or set it once below). Write the APN as the county does; dashes and spaces are optional.

## `apn` (type: `string`):

One parcel number; kept for saved tasks and API callers that send one value. Combined with 'Parcel numbers'.

## `stateHint` (type: `string`):

Two-letter state for bare parcel numbers (no 'STATE/County/' prefix), e.g. 'CO'.

## `countyHint` (type: `string`):

County for bare parcel numbers, e.g. 'Summit'. Used with 'State'.

## `source` (type: `string`):

Where to look the address up. 'Redfin, then Zillow' tries Redfin first and falls back to Zillow. 'All' also checks Realtor.com through Apify's Web Fetch with YOUR Apify account, so Apify bills you for that separately (about $0.0015 a page).

## `proxyConfiguration` (type: `object`):

Optional. The county and state parcel maps answer without a proxy; set one only if a map refuses Apify's IPs.

## Actor input object example

```json
{
  "apns": [
    "CA/Santa Clara/00361019",
    "CO/Adams/0171901104005"
  ],
  "source": "auto",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Each row is one parcel number you asked for; a free notice row says why when there is no property.

# 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 = {
    "apns": [
        "CA/Santa Clara/00361019",
        "CO/Adams/0171901104005"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapebench/property-lookup-by-apn").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 = { "apns": [
        "CA/Santa Clara/00361019",
        "CO/Adams/0171901104005",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("scrapebench/property-lookup-by-apn").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 '{
  "apns": [
    "CA/Santa Clara/00361019",
    "CO/Adams/0171901104005"
  ]
}' |
apify call scrapebench/property-lookup-by-apn --silent --output-dataset

```

## MCP server setup

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

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/5glFV8a6NIfglpr5k/builds/xwZVffYDKRtNabOV3/openapi.json
