Parcel Owner Lookup — Address to Owner & Assessor Record
Pricing
from $11.00 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
8
Total users
6
Monthly active users
13 hours ago
Last modified
Categories
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_addressfield 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 / county | Official source (keyless) | Parcels | Owner | Mailing addr | Value | Year built / sale | Freshness (measured) | Notes |
|---|---|---|---|---|---|---|---|---|
| Chicago / Cook County, IL | Cook County Assessor Parcel Universe (Socrata tx2p-k2g9) | — | yes | yes | no | no | archived 2023 vintage | unchanged from v1 |
| Philadelphia, PA | OPA property roll (Carto opa_properties_public) | — | yes | yes | market value | no | live roll | unchanged from v1 |
| New York City (5 boroughs) | MapPLUTO (Socrata 64uk-42ks) | — | yes | no | assessed | year built | live | unchanged from v1 (+ year_built) |
| North Carolina (statewide) | NC OneMap NC1Map_Parcels | 5,938,900 | 99.0% | yes | parcel value | year built, sale date | per-county refresh | Hoke County excluded (0% owners published) |
| New York State (outside NYC) | NYS ITS NYS_Tax_Parcels_Public | 3,827,530 | yes | yes | full market value | year built | roll year 2025 | NYC is still answered by PLUTO |
| Wisconsin (statewide) | WI V12 statewide parcel database | 3,574,646 | yes | yes (one line) | assessed | no | tax roll 2025; layer edited 2026-06-30 | |
| Colorado (41 counties) | Colorado OIT public parcel composite | 2,599,744 | 85.5% | yes | appraised | sale date/price | county extracts received 2026-04-21 | El Paso, Summit and Washington publish 0% owners and ~20 counties are absent → not_covered |
| Minnesota (34 opt-in counties) | MnGeo plan_parcels_open | 2,710,201 | 78.0% | yes | est. market value | year built, sale | per county | incl. Hennepin, Ramsey, Dakota, Anoka, St. Louis; counties publishing <80% owners → not_covered |
| Massachusetts (statewide) | MassGIS property tax parcels | 2,559,319 | yes | yes | total assessed | year built, sale | FY2025–2027 on 2.27M parcels; Boston FY2023 | layer edited 2026-09-17 |
| Arkansas (statewide) | Arkansas GIS Office CAMA parcels | 2,117,780 | ~100% | no | CAMA total | no | CAMA extract 2026-03 | mailing address not published |
| Connecticut (statewide) | CT CAMA and Parcel Layer | 1,320,686 | yes | yes | assessed (70%) | year built, sale | CAMA collected 2026; layer edited 2026-09-03 | uses the CAMA location when the parcel location is blank (all of Hartford) |
| Vermont (statewide) | VCGI standardized parcels + grand list | 343,940 | yes | yes | listed value | no | grand list 2025; layer edited 2026-09-23 | |
| Maricopa County, AZ (Phoenix) | Maricopa County Assessor parcels | 1,760,478 | yes | yes | full cash value | year built, sale | valuation year 2027 | |
| Harris County, TX (Houston) | HCAD parcels | 1,550,492 | yes | yes | market value | owner-change date | tax year 2026 | |
| Cuyahoga County, OH (Cleveland) | Cuyahoga Fiscal Officer tax parcels | 613,980 | yes | yes | market value | transfer date/price | tax year 2025 | |
| Nashville / Davidson County, TN | Metro Nashville parcels | 287,114 | yes | yes | appraised | sale date/price | layer edited 2026-09-25 | |
| Washington, DC | DC OTR owner polygons | 137,400 | yes | yes | assessment | sale date/price | OTR extract 2026-08-03 | |
| Everywhere else | US 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— whatassessed_valuemeasures 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— onsource_unavailablerows, what failed.lookup_cut_by_deadline— true when the run time budget cut a request for this address (v1.1.6); the row is thensource_unavailableor keeps the answer the house-number query already gave.run_budget_seconds— therunBudgetSecondsthis 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-itemsAuthorization: Bearer YOUR_APIFY_TOKENContent-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
addressesmust be an array of strings, even for one address.- An address outside the covered jurisdictions returns one
not_coveredrow (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-stackermalonestar/epa-contaminated-site-screenermalonestar/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).
Related actors
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).
| Actor | What it adds for you | Example workflow | Where both cover |
|---|---|---|---|
| Absentee Owner Lead List Builder | Bulk 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-city | Use this actor to check one property; switch to the list builder to pull every out-of-state owner of residential parcels in the county | Chicago (Cook County), Philadelphia; NYC (names only, no mailing address) |
| Distressed Property Leads | A distress score per property from code violations, tax-lien notices, evictions and vacancy | Score a metro for motivated sellers first, then look up the owner record, value and last sale of the parcels you shortlist | Chicago, Philadelphia, NYC (its Detroit metro is not covered here) |
| NYC Landlord Registry Lead List | HPD-registered owner and managing-agent contacts with business addresses | An NYC lookup returns an owner name but no mailing address (PLUTO publishes none): pull the building's HPD registration contacts instead | New York City |
| NYC ACRIS Deed Transfer Intel | The recorded deed: sale price, buyer and seller mailing addresses, LLC-buyer and cash-sale flags | Confirm when the current NYC owner bought, for how much, and whether it was an all-cash LLC purchase | New York City |
| Liquor License New Openings Tracker | New bar, restaurant and liquor-store licences and applications, with the premises address | Find 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 Leads | Licensed childcare programs with physical address, phone and named director | Franchise or M&A scouting: check whether a centre's operator owns its building or leases it | CT, 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.