Parcel Owner Lookup — Address to Owner & Assessor Record avatar

Parcel Owner Lookup — Address to Owner & Assessor Record

Pricing

from $11.00 / 1,000 results

Go to Apify Store
Parcel Owner Lookup — Address to Owner & Assessor Record

Parcel Owner Lookup — Address to Owner & Assessor Record

Address to parcel ID, owner name, mailing address & assessed value from official assessor rolls: Chicago, Philadelphia, NYC + NC, NY State, WI, CO, MN, AR, MA, CT, VT statewide, Phoenix, Houston, Cleveland, Nashville & DC. Census fallback elsewhere. $0.02/lookup.

Pricing

from $11.00 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

1

Bookmarked

8

Total users

6

Monthly active users

13 hours ago

Last modified

Share

Parcel Owner Lookup — Address to Owner & Assessor Record API

Turn any US street address into a parcel ID, owner name, owner mailing address, assessed value, property class, and coordinates — straight from official government assessment rolls, with a US Census geocoder fallback. One address in, exactly one structured row out. $0.02 per lookup (pay per result).

Built as an address-grounding primitive: the boring-but-critical first step of property research, lead generation, skip tracing, and AI-agent real-estate workflows.

Who it's for

  • AI agents & LLM apps — ground a free-text address to a canonical parcel + owner before doing anything else (valuation, permits, liens, outreach). Clean, described output fields make this a chainable MCP tool.
  • Proptech developers — add "who owns this property?" to your product without licensing a parcel-data vendor.
  • Skip tracing / real-estate lead gen — the owner_mailing_address field is the pre-step for direct-mail and owner-outreach lists.
  • Title, lending & due-diligence analysts — confirm the recorded owner and parcel ID behind an address in seconds.

Coverage (v1.1 — 17 jurisdictions, 9 of them statewide)

Addresses in Chicago, Philadelphia and NYC are routed by city/ZIP exactly as in v1. Every other address is geocoded first (US Census) and routed by the geocoded point's own state + county FIPS — never by the free-text city name — to the roll below. Row counts, owner coverage and dates were measured live on 2026-09-25.

State / countyOfficial source (keyless)ParcelsOwnerMailing addrValueYear built / saleFreshness (measured)Notes
Chicago / Cook County, ILCook County Assessor Parcel Universe (Socrata tx2p-k2g9)—yesyesnonoarchived 2023 vintageunchanged from v1
Philadelphia, PAOPA property roll (Carto opa_properties_public)—yesyesmarket valuenolive rollunchanged from v1
New York City (5 boroughs)MapPLUTO (Socrata 64uk-42ks)—yesnoassessedyear builtliveunchanged from v1 (+ year_built)
North Carolina (statewide)NC OneMap NC1Map_Parcels5,938,90099.0%yesparcel valueyear built, sale dateper-county refreshHoke County excluded (0% owners published)
New York State (outside NYC)NYS ITS NYS_Tax_Parcels_Public3,827,530yesyesfull market valueyear builtroll year 2025NYC is still answered by PLUTO
Wisconsin (statewide)WI V12 statewide parcel database3,574,646yesyes (one line)assessednotax roll 2025; layer edited 2026-06-30
Colorado (41 counties)Colorado OIT public parcel composite2,599,74485.5%yesappraisedsale date/pricecounty extracts received 2026-04-21El Paso, Summit and Washington publish 0% owners and ~20 counties are absent → not_covered
Minnesota (34 opt-in counties)MnGeo plan_parcels_open2,710,20178.0%yesest. market valueyear built, saleper countyincl. Hennepin, Ramsey, Dakota, Anoka, St. Louis; counties publishing <80% owners → not_covered
Massachusetts (statewide)MassGIS property tax parcels2,559,319yesyestotal assessedyear built, saleFY2025–2027 on 2.27M parcels; Boston FY2023layer edited 2026-09-17
Arkansas (statewide)Arkansas GIS Office CAMA parcels2,117,780~100%noCAMA totalnoCAMA extract 2026-03mailing address not published
Connecticut (statewide)CT CAMA and Parcel Layer1,320,686yesyesassessed (70%)year built, saleCAMA collected 2026; layer edited 2026-09-03uses the CAMA location when the parcel location is blank (all of Hartford)
Vermont (statewide)VCGI standardized parcels + grand list343,940yesyeslisted valuenogrand list 2025; layer edited 2026-09-23
Maricopa County, AZ (Phoenix)Maricopa County Assessor parcels1,760,478yesyesfull cash valueyear built, salevaluation year 2027
Harris County, TX (Houston)HCAD parcels1,550,492yesyesmarket valueowner-change datetax year 2026
Cuyahoga County, OH (Cleveland)Cuyahoga Fiscal Officer tax parcels613,980yesyesmarket valuetransfer date/pricetax year 2025
Nashville / Davidson County, TNMetro Nashville parcels287,114yesyesappraisedsale date/pricelayer edited 2026-09-25
Washington, DCDC OTR owner polygons137,400yesyesassessmentsale date/priceOTR extract 2026-08-03
Everywhere elseUS Census geocoder——————match_confidence: "geocoded", lookup_status: "not_covered"

Not covered, and why (checked live 2026-09-25): Florida's statewide FDOR cadastral layer times out (~55 s, "Invalid query parameters") on every address or spatial query — only parcel-ID lookups answer; New Jersey's MOD-IV composite publishes the owner name blank on all 3,077,980 parcels; the Ohio, Indiana and Washington statewide layers carry no owner name; King County WA carries no taxpayer name; the Texas StratMap statewide layer has query disabled; Maryland's service was in maintenance; Montana's refused the request. They are listed so a missing state is a known gap, not a silent one.

Each covered roll is one config entry in registry.js, so adding a county is a config block plus a live-captured fixture.

Example input

{
"addresses": [
"1060 W Addison St, Chicago, IL",
"1234 Market St, Philadelphia, PA",
"350 5th Ave, New York, NY"
],
"maxResults": 10
}

Example output row

{
"input_address": "1234 Market St, Philadelphia, PA",
"matched_source": "philadelphia-opa",
"match_confidence": "exact",
"parcel_id": "453337700",
"owner_name": "SEPTA",
"owner_mailing_address": "1234 MARKET ST, PHILADELPHIA PA, 19107",
"assessed_value": 38400000,
"property_class": "4",
"property_class_desc": "COMMERCIAL",
"situs_address": "1234 MARKET ST, PHILADELPHIA, PA, 19107",
"lat": 39.9522,
"lon": -75.1605,
"source_url": "https://phl.carto.com/api/v2/sql?q=..."
}

Output fields

  • input_address — your address string, echoed for joining.
  • matched_source — cook-county-parcel-universe | philadelphia-opa | nyc-pluto | one of the v1.1 registry ids (maricopa-county-assessor, harris-county-hcad, cuyahoga-county-fiscal-officer, nashville-davidson-parcels, dc-otr-owner-polygons, nc-onemap-statewide-parcels, nys-tax-parcels-public, wisconsin-statewide-parcels, colorado-public-parcels, minnesota-open-parcels, arkansas-statewide-parcels, massgis-property-tax-parcels, connecticut-cama-parcels, vermont-vcgi-parcels) | census-geocoder | null.
  • match_confidence — exact (house + street matched the roll verbatim, or only the position of a directional differs, e.g. "S 6th St" vs "6TH STREET SOUTH"), fuzzy (same street with a drifted suffix or directional — e.g. Wrigley Field is "W ADDISON AVE" on the Cook roll — or nearest house number on the right street), geocoded (coordinates only), none (no match), source_unavailable (v1.1: the roll or geocoder did not answer — nothing was checked; this is not a negative). A row is always emitted; this actor never fails on a bad address.
  • parcel_id — Cook 14-digit PIN / Philadelphia OPA number / NYC 10-digit BBL.
  • owner_name, owner_mailing_address — owner or taxpayer of record + mailing address (mailing is null for NYC; PLUTO doesn't publish it).
  • assessed_value — NYC total assessed value; Philadelphia OPA certified market value; null for Cook County v1 (its parcel-universe roll carries no value column).
  • property_class, property_class_desc — jurisdiction class code + readable description.
  • situs_address, lat, lon — the roll's own address for the parcel and WGS84 coordinates.
  • source_url — direct API link to the underlying official record for citation/re-fetch.

Added in v1.1 (all nullable, present on every row):

  • lookup_status — matched | no_match_in_source (a covered roll answered, nothing matched) | not_covered (outside every covered jurisdiction) | geocode_no_match | source_unavailable (the source did not answer — re-run later).
  • source_jurisdiction, source_dataset — which roll answered or was searched.
  • data_vintage — roll year / extract date carried by the record (plus the layer's last-edit date where published). Statewide composites mix county vintages — read it.
  • fields_not_available — on matched rows, which of owner name, mailing address, value, year built, last sale date/price this roll does not publish for the parcel (null, never guessed).
  • assessed_value_basis — what assessed_value measures in that jurisdiction.
  • year_built, last_sale_date, last_sale_price — where the roll publishes them.
  • coordinate_basis — source_point | parcel_centroid | geocoder_point.
  • county_fips — 5-digit FIPS of the geocoded point used for routing.
  • source_error — on source_unavailable rows, what failed.
  • lookup_cut_by_deadline — true when the run time budget cut a request for this address (v1.1.6); the row is then source_unavailable or keeps the answer the house-number query already gave.
  • run_budget_seconds — the runBudgetSeconds this run used; null when no budget was set.

Run time budget (v1.1.6). Every request now has a timeout, and the optional runBudgetSeconds input (prefilled at 240) bounds the whole run. The Cook County street scan is skipped when it provably cannot change the answer (the house-number query already found the same house on a named street and was not truncated) - that is the slow query, an unindexed full-roll scan that has taken from 34 s to ~300 s.

How matching works

Addresses are normalized (case, punctuation, St↔Street, Ave↔Avenue, W↔West, 5th↔5↔Fifth). Chicago/Philadelphia/NYC addresses are routed by city/ZIP; everything else is geocoded and routed by the point's county. Each registry roll is queried twice at most, always inside a small envelope around the geocoded point (so "100 Main St" in one town never answers for another): first for parcels carrying the input house number within 1.5 km, then for every parcel within ~120 m. The matcher then tries, in order: exact house + street; nearest house number on the same street (within 100); same house with a drifted street suffix; and, for registry rolls, the same house and street with the directional moved, added or omitted (answered only when exactly one parcel fits). Anything still unmatched falls back to the Census point with an honest lookup_status.

Fail loudly, never a silent negative. If a roll (or the geocoder used for routing) does not answer, the row says source_unavailable — it is never sold as "no owner found". If every lookup in a run is unavailable, the run fails and nothing is billed. Each registry roll is also checked at the start of every run: if a field the actor reads has been renamed upstream, or the service stops honouring the house-number filter, that roll's rows report source_unavailable with the reason instead of returning blank owners.

Use from an AI agent: quickstart

The smallest input that returns a real answer. Verified live on 2026-10-06: the run SUCCEEDED in about 5 seconds and returned the owner of record.

{
"addresses": [
"1060 W Addison St, Chicago, IL"
]
}

Call it through the hosted MCP server (https://mcp.apify.com?tools=malonestar/parcel-owner-lookup) or straight over HTTP:

POST https://api.apify.com/v2/acts/malonestar~parcel-owner-lookup/run-sync-get-dataset-items
Authorization: Bearer YOUR_APIFY_TOKEN
Content-Type: application/json

with the JSON above as the body. The response is a JSON array of dataset rows.

What comes back: one row per input address. Abbreviated row from a live run (the full row has 27 fields, all described in the output schema):

{
"input_address": "1060 W Addison St, Chicago, IL",
"lookup_status": "matched",
"match_confidence": "fuzzy",
"owner_name": "WRIGLEY FIELD HOLDINGS",
"owner_mailing_address": "1060 W ADDISON ST, CHICAGO, IL, 60613",
"parcel_id": "14202270020000",
"source_jurisdiction": "Cook County, IL",
"data_vintage": "assessor year 2023"
}

Read before you conclude anything: lookup_status (matched / not_covered / no_match_in_source / source_unavailable) and match_confidence.

Input notes for agents

  • addresses must be an array of strings, even for one address.
  • An address outside the covered jurisdictions returns one not_covered row (still billed as one result) rather than a guess.
  • Include city and state in each address; a ZIP helps the geocoder.

Cost: $0.0200 per row at the Free-tier list price (paid plans get a discount), so the example above costs about $0.020. A run that cannot answer fails and bills no rows.

Use as an MCP tool

This Actor is callable directly by any MCP-compatible AI agent through Apify's hosted MCP server. There is no server to run and no integration code to write - the tool schema an agent sees is generated from this Actor's own input and dataset schemas.

Endpoint

https://mcp.apify.com?tools=malonestar/parcel-owner-lookup

Claude Desktop, Claude Code or Cursor - add to claude_desktop_config.json, .mcp.json or .cursor/mcp.json respectively:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=malonestar/parcel-owner-lookup",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

Get a token at https://console.apify.com/settings/integrations. Claude Desktop can also authenticate interactively via OAuth against https://mcp.apify.com with no headers block. Full reference: https://docs.apify.com/platform/integrations/mcp

Try asking your agent

Who owns 1060 W Addison St, Chicago IL, and what is the mailing address on the assessor roll?

Chains well with - expose these alongside it by comma-separating the tools parameter, and the agent can carry results from one into the next:

  • malonestar/distressed-property-signal-stacker
  • malonestar/epa-contaminated-site-screener
  • malonestar/site-due-diligence-bundle
https://mcp.apify.com?tools=malonestar/parcel-owner-lookup,malonestar/distressed-property-signal-stacker,malonestar/epa-contaminated-site-screener,malonestar/site-due-diligence-bundle

Billing is unchanged when called as an MCP tool: this Actor is Pay-Per-Event and an agent pays the same per-result price a human does. A run that cannot answer fails without billing rather than returning an unverified negative.

Was this useful?

If a run answered your question, a short review on this Store page helps other buyers find the Actor; every published review is read. If a run gave a wrong or confusing answer, open an Issue on this page with the run ID and it will be treated as a defect, not feedback.

FAQ

How do I find out who owns a property by address? Run this actor with the address; it returns the owner of record and their mailing address from the official assessor roll (Chicago, Philadelphia, NYC, nine statewide rolls and five more counties/cities — see Coverage).

Is this legal / where does the data come from? All sources are public, official government open-data APIs (Cook County Socrata, Philadelphia OPA via Carto, NYC Open Data, US Census). No scraping of private sites.

What happens with an address outside the covered jurisdictions? You still get a row: the Census geocoder supplies normalized address + coordinates with match_confidence: "geocoded", lookup_status: "not_covered" and no parcel/owner.

Why did my lookup come back fuzzy? Assessor rolls often disagree with common usage (suffix drift, canonical lot addresses). fuzzy means the right street was found but not a verbatim match — check situs_address to verify.

Can I look up thousands of addresses? Yes — pass up to 5,000 per run (maxResults). Each address = one result = $0.02.

How current is the data? Live API calls at run time against each official roll. Every row carries data_vintage (roll year / extract date). The Cook County parcel-universe vintage trails the assessor's cycle, and statewide composites mix county vintages (e.g. Boston is FY2023 inside a mostly FY2025–2027 Massachusetts layer).

The rest of the property-owner and investor shelf, plus the new-business feeds whose addresses this actor resolves to an owner. The Where both cover column lists only the places both actors actually serve (see each actor's own Coverage table).

ActorWhat it adds for youExample workflowWhere both cover
Absentee Owner Lead List BuilderBulk lists instead of one address at a time: every parcel whose owner mails the tax bill to a different address, tiered out-of-state / out-of-cityUse this actor to check one property; switch to the list builder to pull every out-of-state owner of residential parcels in the countyChicago (Cook County), Philadelphia; NYC (names only, no mailing address)
Distressed Property LeadsA distress score per property from code violations, tax-lien notices, evictions and vacancyScore a metro for motivated sellers first, then look up the owner record, value and last sale of the parcels you shortlistChicago, Philadelphia, NYC (its Detroit metro is not covered here)
NYC Landlord Registry Lead ListHPD-registered owner and managing-agent contacts with business addressesAn NYC lookup returns an owner name but no mailing address (PLUTO publishes none): pull the building's HPD registration contacts insteadNew York City
NYC ACRIS Deed Transfer IntelThe recorded deed: sale price, buyer and seller mailing addresses, LLC-buyer and cash-sale flagsConfirm when the current NYC owner bought, for how much, and whether it was an all-cash LLC purchaseNew York City
Liquor License New Openings TrackerNew bar, restaurant and liquor-store licences and applications, with the premises addressFind new hospitality tenants, then look up who owns each premises (landlord outreach, property insurance)Colorado (incl. Denver), Connecticut, New York, Chicago (Cook County), Houston (Harris County, TX)
Childcare Provider LeadsLicensed childcare programs with physical address, phone and named directorFranchise or M&A scouting: check whether a centre's operator owns its building or leases itCT, MA, VT, NY, Philadelphia (PA), Houston (Harris County, TX)

Telemetry

This actor can send one usage record per run to the publisher: the channel the run was started from (Console, API, MCP, scheduler, ...), a timestamp, the build number, a salted one-way hash of the account id (so repeat use can be counted without storing the id itself), and the NAMES of the input fields used. It never records input values, results or the account id, and it is used only to see how buyers reach the actor. It cannot slow the run by more than 3 seconds and can never affect your results or your bill.