US Property Owner & Parcel Records Scraper
Find who owns a US property from the public assessment roll. Search 7.6M parcels by address, owner name, city, postal code or parcel id.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
jurisdictions,address,ownerName(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0007 per parcel record = $0.7 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Parcel record | One property parcel with its owner of record. Jurisdictions that cannot answer a filter are skipped and never charged. | $0.0007 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
jurisdictions | The places this Actor covers. Pick one or more. Every extra place you tick is another lookup, and the row budget below is shared between them - so for a single address, tick only the place it is in. | array |
address | A street address, written the way you would write it: "2125 Bruckner Blvd". The house number has to start the address, and after that the words are matched however the local roll happens to spell them - Blvd finds BOULEVARD, Ave finds AV. Leave off apartment and unit numbers; most rolls keep those in a separate column. A street name on its own, with no number, returns the whole street. | string |
ownerName | Part of an owner name. Word order does not matter - "John Smith" finds a roll that writes "SMITH JOHN". Every word you type has to appear, so fewer words finds more. Useful for tracking one landlord or LLC across a whole city. | string |
city | A city or town name, for the places that cover more than one. In New York City this is the borough - Brooklyn, Queens, Manhattan, Bronx, Staten Island. A place that cannot honour it is skipped with a note rather than quietly handing you a different city's parcels. | string |
zipCode | A five-digit postal code of the PROPERTY, not of the owner's mailing address. Connecticut, Vermont and Cambridge publish no property postal code at all - only the owner's - so those three are skipped with a note when you use this rather than answering with the wrong one. | string |
parcelIds | Look up parcels directly by their identifier. Every place uses its own and calls it its own thing: a New York BBL, a Cook County PIN, a Philadelphia OPA account number, a Vermont SPAN, a Montana geocode, a Washington DC square-suffix-lot, a Texas property id. Up to 200 per run. Type a DC SSL with single spaces - "1077 0130" finds the record however the roll pads it. Ids that do not look like they belong to a place you ticked are skipped there with a note. | array |
maxItems | How many parcels to return in total, across every place you ticked. The budget is shared between them. Keep it low while you are trying things out - you pay per row. Hard ceiling 5,000. | integer |
proxyUrls | Optional. Leave it empty unless you want the requests to go through proxy servers of your own. Write each one as http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
jurisdictionNameownerNamepropertyAddresspropertyCitypropertyStatepropertyZipparcelIdpropertyUseyearBuiltassessedTotalUsdmarketValueUsdlastSaleDatelastSalePriceUsdrecordUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
US Property Owner & Parcel Records Scraper: who owns a property, from the public assessment roll
Pick one or more of thirteen US jurisdictions and search by street address, owner name, city, postal code or parcel id, and you get one row per parcel off the public assessment roll: the owner of record, the mailing address where the roll has one, the property address and use, areas, year built, assessed value, the last sale and a link back to the public record. That is about 7.6 million parcels, each read from the government host that publishes it, with nothing joined from anywhere else. It is not national coverage and it is not a deed search: thirteen places only, rolls that lag recent sales, and no chain of title, mortgage or lien.
| Input | Jurisdictions, plus an address, owner name, city, postal code or parcel ids |
| Output | One row per parcel |
| Ceiling | 5,000 parcels and 200 parcel ids per run |
| Account needed | None |
| Price | $0.70 per 1,000 parcels, flat on every plan |
🔍 What US Property Owner & Parcel Records Scraper does
Your filters go to each roll's own host, and every row that comes back is checked again against what you asked before it is charged. A record that does not match, or has no owner name on it, is dropped for free, and one ROWS_DROPPED row counts them.
Address search forgives the roll's spelling: "Blvd" finds BOULEVARD and "Ave" finds AV. The house number has to come first, and a street name with no number returns the whole street. Owner search ignores word order, so "John Smith" finds a roll that writes "SMITH JOHN", but every word you type has to appear.
A place that cannot answer one of your filters is skipped with a free FILTER_UNSUPPORTED row rather than answering a different question. Four of the rolls keep several years in one table, so each run asks them for their newest year instead of assuming it.
What is covered, counted on the live rolls in September 2026:
| Where | Parcels | Published by | The owner name is |
|---|---|---|---|
| New York City, NY | 858,284 | NYC Department of City Planning (PLUTO) | the assessment roll |
| Connecticut, statewide | 1,347,910 | State of Connecticut Office of Policy and Management | the assessment roll |
| Cook County, IL | 1,863,562 | Cook County Assessor | the taxpayer of record |
| Philadelphia, PA | 583,779 | City of Philadelphia Office of Property Assessment | the assessment roll |
| Collin County, TX | 479,364 | Collin Central Appraisal District | the appraisal roll |
| Williamson County, TX | 291,076 | Williamson Central Appraisal District | the appraisal roll |
| Norfolk, VA | 74,329 | City of Norfolk Office of the Real Estate Assessor | the assessment roll |
| Cambridge, MA | 30,156 | City of Cambridge Assessing Department | the assessment roll |
| Montana, statewide | 921,301 | Montana State Library, from Department of Revenue data | the appraisal roll |
| Wake County, NC | 438,403 | Wake County Department of Tax Administration | the assessment roll |
| Vermont, statewide | 344,019 | Vermont Center for Geographic Information | the grand list |
| Nashville and Davidson County, TN | 287,112 | Metro Nashville Assessor of Property | the assessment roll |
| Washington, DC | 137,400 | DC Office of Tax and Revenue, via DC GIS | the assessment roll |
That is the whole list. Most US counties publish nothing machine-readable, and plenty of those that do blank out the owner column: New Jersey publishes 3.5 million parcels that way.
Rolls differ, so a column one city publishes another simply does not have. Where a roll has no value, the field is null:
| Where | Owner mailing address | Assessed or market value | Year built | Last sale | Coordinates |
|---|---|---|---|---|---|
| New York City, NY | not published | assessed | yes | not published | yes |
| Connecticut | yes | both | yes | date and price | not published |
| Cook County, IL | yes | not published | not published | not published | not published |
| Philadelphia, PA | yes | both | yes | date and price | not published |
| Collin County, TX | yes | both | yes | date only | not published |
| Williamson County, TX | yes | assessed | yes | not published | not published |
| Norfolk, VA | not published | assessed | yes | date and price | not published |
| Cambridge, MA | not published | not published | yes | not published | yes |
| Montana | yes | assessed | not published | not published | not published |
| Wake County, NC | yes | assessed | yes | date and price | not published |
| Vermont | yes | assessed | not published | not published | not published |
| Nashville, TN | yes | both | not published | date and price | not published |
| Washington, DC | yes | assessed | not published | date and price | not published |
📥 What you give it
{
"jurisdictions": ["nyc"],
"address": "2125 Bruckner Blvd",
"maxItems": 25
}
| Field | If you leave it out | What it is |
|---|---|---|
jurisdictions | a free sample row | One or more of nyc, connecticut, cook-county-il, philadelphia, collin-county-tx, williamson-county-tx, norfolk-va, cambridge-ma, montana, wake-county-nc, vermont, nashville-tn and washington-dc. |
address | no address filter | A street address as you would write it, house number first, without the apartment or unit. |
ownerName | no owner filter | Part of an owner name. Every word has to appear, in any order, so fewer words find more. |
city | no city filter | A city or town, for the places that cover more than one. In New York City it is the borough. |
zipCode | no postal filter | The property's five-digit postal code, not the owner's. Connecticut, Vermont and Cambridge publish none, so they are skipped with a note. |
parcelIds | none | Up to 200 local ids: a New York BBL, a Cook County PIN, a Philadelphia OPA account, a Vermont SPAN, a Montana geocode, a DC square-suffix-lot or a Texas property id. Type a DC lot with single spaces, such as 1077 0130. |
maxItems | 25 | Rows across every place you ticked, 1 to 5,000, shared evenly: thirteen places and 25 rows is about two each. |
proxyUrls | empty | Optional, only if you want the requests to go through servers of your own, as http://user:pass@host:port. |
A run needs at least one place and something to search on. Without both, it returns the free sample row.
📤 What you get back
A real row from a real run:
{
"ok": true,
"charged": true,
"recordType": "parcel",
"jurisdiction": "nyc",
"jurisdictionName": "New York City, NY",
"state": "NY",
"ownerNameSource": "assessment roll",
"parcelId": "2038060070",
"parcelIdType": "BBL (borough-block-lot)",
"ownerName": "LAURA IRIS VALENTIN REVOCABLE TRUST",
"coOwnerName": null,
"ownerMailingAddress": null,
"ownerMailingCity": null,
"ownerMailingState": null,
"ownerMailingZip": null,
"propertyAddress": "2125 BRUCKNER BOULEVARD",
"propertyCity": "Bronx",
"propertyState": "NY",
"propertyZip": "10472",
"unit": null,
"propertyUse": "Mixed residential and commercial buildings",
"buildingDescription": "Building class S4",
"legalDescription": null,
"landAreaSqFt": 2627,
"buildingAreaSqFt": 5003,
"livingAreaSqFt": null,
"unitsTotal": 5,
"unitsResidential": 4,
"buildingCount": 1,
"bedrooms": null,
"bathrooms": null,
"stories": 2,
"yearBuilt": 1929,
"assessedLandUsd": 182700,
"assessedBuildingUsd": null,
"assessedTotalUsd": 359550,
"marketValueUsd": null,
"lastSaleDate": null,
"lastSalePriceUsd": null,
"zoning": "R5",
"latitude": 40.8275484,
"longitude": -73.8521013,
"rollLabel": "PLUTO 26v2",
"dataPublisher": "NYC Department of City Planning (PLUTO)",
"recordUrl": "https://data.cityofnewyork.us/resource/64uk-42ks.json?bbl=2038060070",
"scrapedAt": "2026-09-30T02:38:03.813Z"
}
| Field | What it is |
|---|---|
ownerName, coOwnerName | The name exactly as the roll writes it, so "SMITH JOHN A & MARY B" and "Smith, John" are both normal. |
ownerNameSource | assessment roll, appraisal roll, Vermont's grand list, or Cook County's taxpayer of record, which is not the same as a deeded owner. |
ownerMailingAddress, ownerMailingCity, ownerMailingState, ownerMailingZip | Where the roll sends the bill, next to the property address. |
parcelId, parcelIdType | The local id and what kind it is. It is stable, so it is the key to run against again. |
assessedTotalUsd, marketValueUsd | The assessed figure, which in most places is not the market price, and a market value where the roll has one. |
lastSaleDate, lastSalePriceUsd | The last transfer the roll records. |
rollLabel | Which roll the row came from, such as "PLUTO 26v2" or "Grand list 2025". |
propertyCity | In New York City, the borough. |
recordUrl | The public record the row was read from. Open it and you see the same parcel. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A parcel | charged: true, recordType: "parcel" | yes |
| The sample row | _sample: true, charged: false. Only when the run had no place or nothing to search on | no |
| A diagnostic row | _diagnostic: true, charged: false, and an errorCode | no |
The sample row carries recordType: "parcel" as well, so filter on charged, not on recordType.
errorCode | What happened |
|---|---|
NO_RESULTS | Nothing on that roll matched. |
FILTER_UNSUPPORTED | That place cannot answer one of your filters, so it was skipped. |
ROWS_DROPPED | Records came back that did not match, had no owner name or repeated a parcel. The row gives the counts. |
QUERY_REFUSED | That roll would not run the query. |
SERVER_ERROR, NETWORK | The government host did not answer. They go down for maintenance now and then. |
TIME_BUDGET | The run ran out of time before it reached that place. |
BAD_INPUT | A jurisdiction that is not on the list. |
▶️ How to run it
1. Open US Property Owner & Parcel Records Scraper and click Try for free. 2. Tick the places in Where to search. For one address, tick only the place it is in. 3. Fill in one of Street address, Owner name, City or town, Postal code or Parcel ids. 4. Set Maximum rows, remembering it is shared between the places you ticked. 5. Click Start, then export the dataset as CSV, JSON or Excel.
💰 How much does it cost?
$0.70 per 1,000 parcels, flat on every Apify plan.
Not charged: the sample row, every diagnostic row, records dropped for not matching, a parcel that turns up twice in one run, and a place skipped because it cannot answer your filter. The most one run returns, 5,000 parcels, comes to $3.50.
💡 What people use it for
- Finding out who actually owns a building when the listing, the letterbox and the management company all say something different.
- Following one landlord or LLC across a whole city by owner name.
- An absentee-owner list: search a city or postal code and set the property address against the owner's mailing address, which ten of the thirteen rolls publish.
- Checking a portfolio against the record: feed in the parcel ids and compare
ownerNameafter each new roll.
🚧 What it does not do
- Anywhere else. Thirteen places, and a parcel outside them is not in here.
- Deeds. No chain of title, no mortgage, no lien, no document image.
- Last month's sale. Rolls lag reality, and a few are a full cycle behind.
rollLabelsays which roll a row came from. - One year for Vermont. Each town is on the year it last filed, from 2026 down to 2018, and about one parcel in eight has no grand list entry matched yet, so it has no owner and is dropped.
- Montana addresses. Owner and value are on 99% of its parcels, but only about half carry a street address, so an address search misses land an owner search finds.
- Values in Cook County or Cambridge. Cook County publishes the owner and the two addresses only; Cambridge publishes building detail but no value.
- Tidy condominiums. Cambridge has a building record whose owner reads "Condominium Building - See Individual Unit Records", and other rolls repeat the address once per unit.
- One answer per address. A multi-tenant address returns every parcel at it: "2300 W Plano Pkwy" is five.
- Contact data. No emails, phones or dates of birth, and nothing is joined to anything. A phone or email that ever turned up in a roll column would read
[removed].
🧭 Which US property scraper do you need?
| If you want | Use |
|---|---|
| Who owns a parcel, off the public roll | This one |
| Homes on Zillow with price, tax and price history | Zillow Scraper |
| Listings on Realtor.com with the agent and broker | Realtor.com Scraper |
| Building permits from 14 US cities and counties | US Building Permits Scraper |
❓ Questions people ask
Does it cover the whole United States? No. Thirteen jurisdictions across eleven states and the District of Columbia, three of them whole states. The list is above.
Is this the deed or the tax roll? The tax roll. It tells you who to look up at the recorder's office and not much more.
How current is the data? As current as each roll. Read rollLabel, and in Vermont read the year on the row before acting on an owner.
What if I search a postal code in a place that has none? That place is skipped with a free FILTER_UNSUPPORTED row. It does not guess at parcels that might be in that postal code.
Can I use the owner names however I like? The government publishes them on purpose, but some places regulate what they may be used for, and that call is yours. Every row carries recordUrl so you can read the original.
Do I need an API key or an account? No.
🆘 If something breaks
Open the Issues tab on the actor page. Include the run ID, the places you ticked and what you searched for.