# Property Data API - Parcels, Zoning, Owners and Risk (`nabeelbaghoor/commercial-property-data-api`) Actor

Look up any US address and read the land record: parcel boundaries and APN, ownership, county assessment with building detail, zoning district with setbacks, height limits and floor area ratio, recorded sale and loan history, owner phone numbers, flood zone and hazard risk.

- **URL**: https://apify.com/nabeelbaghoor/commercial-property-data-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Real estate, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 property record returneds

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?

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Property Data API - Parcels, Zoning, Owners and Risk

Give it a US address and get the land record behind it: who owns the parcel, what the county says about the building, what the zoning allows, what it last sold for, and what hazards it sits in.

### What this actor does

- **Parcel records.** Assessor parcel number, standardised address, owner name and ownership status, land use and category, lot size and dimensions, assessed and market values, tax amount and delinquency year, last market sale and last loan, opportunity zone flag, census tract and CBSA.
- **County assessments.** The full building record: beds, baths, rooms, stories, units, living and building area, parking, construction, exterior wall, roof, heating, air conditioning, pool, plus the provider's own value estimate with its low and high bounds.
- **Zoning.** District and code, permitted use, floor area ratio, maximum site coverage, minimum lot area, front, side and rear setbacks, maximum building height and stories, and a link to the ordinance itself.
- **Recorded sales and loans.** Every transaction with buyer, seller, sale amount, price per area, transfer and filing dates, lender, loan amount, type and term, interest rate, and the arms-length, cash, foreclosure and REO flags.
- **Owner contacts.** The people and business entities behind a property, with match confidence, mailing address, phone numbers with type and last-seen date, and business emails and corporate status.
- **Hazards and overlays.** FEMA flood zone, FEMA national risk index, wetlands, public schools and location info.
- **Building footprints.** Outline geometry, footprint area, height and story count.
- **Pay per result.** You are charged for rows that carry a real record. Addresses with no match are free.

### Bring your own key

This actor calls the provider with **your own API key**, sent in its `x-api-key` header. Paste it into the API key field, or set it as the `DATA_API_KEY` secret. Nothing runs on anyone else's credentials, and a run without a key ends cleanly with an explanation rather than failing.

### Example output

```json
{
  "recordType": "zoning",
  "requested": "100 Main St, Denver, CO 80202",
  "found": true,
  "parcelId": "0201310AA00100",
  "jurisdiction": "City and County of Denver",
  "zoningCode": "C-MX-8",
  "zoningDistrict": "Urban Center Mixed Use 8",
  "zoningCategory": "Mixed Use",
  "permittedUse": "Residential, Retail, Office",
  "floorAreaRatio": 4,
  "maximumSiteCoveragePercent": 90,
  "frontSetback": 0,
  "sideSetback": 0,
  "rearSetback": 5,
  "maximumBuildingHeight": 110,
  "maximumStories": 8,
  "ordinanceUrl": "https://example.gov/zoning-ordinance"
}
```

### FAQ

#### What can I look up with a street address?

All of it. Every service in this actor accepts a plain address: parcel, assessment, building footprints, zoning, owner contacts, flood zone, risk index, wetlands, schools, location info and geocoding. The sale history and the two assessment histories chain off the assessment record, and the actor resolves the address to one for you without charging for that step.

#### How do I find zoning for a property?

Run the actor in "Zoning" mode with the address. You get the zoning code and district, the permitted use, the floor area ratio, the maximum site coverage, the minimum lot area, the front, side and rear setbacks, the maximum building height and story count, and a link to the ordinance the numbers came from. That is the set of constraints a feasibility study starts from.

#### Can I get the owner's phone number?

Owner contacts mode returns the people and business entities behind a property with their phone numbers, phone types, and when each number was last seen, plus a match confidence and a flag on contacts the provider believes have died. Business entities also carry emails and corporate status. This is a licensed dataset, so it has to be on your agreement.

#### What is the difference between the parcel and the assessment?

The parcel is the land: boundaries, parcel number, owner, land use, lot size, tax. The assessment is the county's record of what is built on it: beds, baths, stories, living area, construction, roof, heating, and the assessed and market values by year. Most workflows want both, and the identifiers in each row let you chain from one to the other without re-matching the address.

#### Can I search an area instead of an address?

Yes. Put `latitude, longitude` pairs in the coordinates field and set a search buffer. The parcel, flood, risk, wetlands and geocode modes then return everything inside the area rather than a single match, which is how you assemble every parcel on a block or every flood zone touching a site.

#### What does it cost?

Pricing is pay per result: 0.015 USD per parcel, assessment, zoning record or recorded sale, 0.02 USD per owner contact, and 0.006 USD per geocoded address, footprint or overlay record, with Apify platform usage included. Addresses with no match are not charged. You also need your own agreement with the data provider, which bills separately and licenses each service separately.

#### Does the actor fail if my key is wrong?

No. A missing key, a rejected key, a service that is not on your plan, an exhausted allowance or an empty input all end the run cleanly with a message saying what to change. A refusal that names the dataset says so explicitly, so you do not go hunting for a bad key when the real answer is that the service needs adding to your agreement.

### Keyword map

property data API, parcel data API, zoning API, zoning lookup by address, setback and height limit data, floor area ratio API, commercial real estate data API, CRE property data, assessor parcel number lookup, APN lookup, county assessment data, property ownership lookup, true owner API, property owner phone number, recorded sales API, deed and mortgage data, FEMA flood zone API, national risk index, wetlands data, building footprint API, address geocoding API, site selection data, land use data

# Actor input Schema

## `mode` (type: `string`):

Each option reads one of the provider's services. Every service sits behind the same key but is licensed separately, so a service that is not part of your agreement will say so rather than returning nothing.

## `addresses` (type: `array`):

One property address per line, for example "100 Main St, Denver, CO 80202". This is the normal way to use the actor: every service accepts an address.

## `coordinates` (type: `array`):

One "latitude, longitude" pair per line, for example "39.7392, -104.9903". Accepted by the parcel, flood, risk, wetlands and geocode modes, which return everything within the search area rather than a single match.

## `identifiers` (type: `array`):

One provider identifier per line, taken from the lightBoxId, parcelId or assessmentId column of an earlier run. Skips the address match, which is faster and exact. Parcel identifiers work with the parcel, structures, zoning, owners, flood, risk and wetlands modes; assessment identifiers work with the assessment, transactions and history modes.

## `bufferDistance` (type: `number`):

Coordinate lookups only. How far around each point to search. Leave empty to search the exact point, which returns just the parcel or zone it falls in.

## `bufferUnit` (type: `string`):

The unit for the search buffer above.

## `includeAssessmentWithOwners` (type: `boolean`):

Owner contacts mode. Returns the county assessment alongside each contact, so the property's values and characteristics arrive in the same call rather than needing a second run.

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

The most rows this run will save and charge for. A coordinate search with a buffer, a sale history and an owner lookup can each return many rows per address, so allow room for those modes.

## `requestsPerMinute` (type: `integer`):

How fast to call the provider. Lower this if your agreement rate limits the run.

## `apiKey` (type: `string`):

Your own API key for the property data provider, sent in its x-api-key header. This actor is bring your own key: it never uses anyone else's credentials, and the key is stored as a secret.

## Actor input object example

```json
{
  "mode": "parcel",
  "bufferUnit": "ft",
  "includeAssessmentWithOwners": false,
  "maxResults": 500,
  "requestsPerMinute": 120
}
```

# Actor output Schema

## `records` (type: `string`):

One row per record, alongside the address, coordinate or identifier that produced it.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/commercial-property-data-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/commercial-property-data-api").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 '{}' |
apify call nabeelbaghoor/commercial-property-data-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/commercial-property-data-api"
        }
    }
}

```

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/Tgbp9KowcHuES7fOM/builds/izKvnTroVsihEhFuf/openapi.json
