How-to
How to run US Property Records Export & Owner Lookup (County Assessor)
Step-by-step: the exact input, what each field does, and the rows that come back from County & state assessor rolls (28 feeds).
Investors building an absentee-owner mailing list, property managers looking for landlords, and data teams that need official owner and value fields all hit the same wall: the assessor roll is public, but every county publishes it its own way. Maricopa serves an ArcGIS layer, Cook a Socrata catalogue split across four datasets you have to join on the PIN, Philadelphia a Carto SQL endpoint, Harris a 212 MB zip, and Florida 67 county files on a SharePoint site. For one address, the county’s own search page is the right tool. For one ZIP code of 15,926 parcels (85323 in Avondale, Arizona) it is a spreadsheet job measured in days, and the next county starts from zero.
What you’ll need
Nothing but an Apify account. The actor talks to County & state assessor rolls (28 feeds) directly.
No API key, no county account, and no proxy: all 28 feeds are published by the assessor or the
state for machine use, and the proxy setting ships off. To see what is covered before you spend
anything, tick listCoverage and run it: one free row per feed, 525 counties in 22 states as of
28 October 2026 (Massachusetts was added that day), each row listing the fields that feed publishes.
Step 1 — Open the actor
Open US Property Records Export & Owner Lookup (County Assessor) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.
Step 2 — Fill in the input
| Field | Type | Required | What it does |
|---|---|---|---|
areas | array | no | One per line. A state (‘FL’ or ‘Florida’), a county (‘Miami-Dade, FL’, ‘Cook County, Illinois’, ‘IL/Cook’) or a 5-digit ZIP code (‘85323’). A ZIP becomes its county plus a ZIP… (default []) |
area | string | no | Same as one line of ‘Areas to export’; kept for saved tasks and API callers that send one value. |
preset | string | no | A ready-made filter for common lead lists. Any filter you set below overrides the preset’s value for that filter. Absentee presets leave out government owners. (default none) |
countOnly | boolean | no | Don’t export: return, per area, how many properties match and the estimated cost of exporting them. Free. Counts are exact for ZIP/city/value filters; owner-side filters… |
maxResultsPerArea | integer | no | Cap on rows returned for EACH area line (not per run), so adding areas never cuts off the later ones. 0 = no cap: the whole filtered area, bounded only by your run’s max charge… (default 1000) |
zipCodes | array | no | Only properties in these ZIP codes. (default []) |
cities | array | no | Only properties whose situs (property) city is one of these, e.g. ‘OAK LAWN’. Case does not matter. (default []) |
propertyUse | array | no | Words to match in the county’s property-use description (‘single family’, ‘condo’, ‘vacant’, ‘commercial’, ‘multi’) or a class-code prefix. Matches if ANY entry matches. (default []) |
ownerTypes | array | no | Keep only these owner types, one per line: individual, company (LLC, Inc, LP, …), trust, government. Classified from the owner name. (default []) |
absentee | array | no | Keep only these occupancy tiers, one per line: out_of_state, out_of_city, same_city_diff_address, owner_occupied, unknown. Compares the owner’s mailing address with the… (default []) |
minValue | integer | no | Market value, or assessed value where the county publishes no market value. |
maxValue | integer | no | Market value, or assessed value where the county publishes no market value. |
soldAfter | string | no | YYYY-MM-DD. Keeps properties whose last recorded sale is on or after this date (month precision where the county records only the month). |
soldBefore | string | no | YYYY-MM-DD. Keeps properties whose last recorded sale is before this date. |
minYearBuilt | integer | no | Year built, where the county publishes it. |
maxYearBuilt | integer | no | Year built, where the county publishes it. |
lookups | array | no | E.g. ‘1001 Preston St, Houston, TX 77002’, ‘IL/Cook/17-09-100-001-0000’, ‘FL/Miami-Dade/ACME HOLDINGS LLC’. No limit on how many per run. (default []) |
addresses | array | no | Street addresses with city, state and preferably ZIP. Same as ‘Lookups’, but always read as addresses. (default []) |
parcelLookups | array | no | STATE/County/ParcelID, e.g. ‘IL/Cook/17-09-100-001-0000’. A bare ID works with the State and County hints below. (default []) |
ownerLookups | array | no | STATE/Owner Name or STATE/County/Owner Name. Matches names that START with what you type. Returns every parcel found plus a free portfolio summary row. (default []) |
address | string | no | One address; kept for API callers that send one value. |
parcelLookup | string | no | One parcel lookup. |
ownerLookup | string | no | One owner lookup. |
stateHint | string | no | Two-letter state for bare parcel IDs or owner names, e.g. ‘IL’. |
countyHint | string | no | County for bare parcel IDs or addresses, e.g. ‘Cook’ (use with State hint). |
maxResultsPerOwner | integer | no | Cap on properties returned for EACH owner lookup. (default 50) |
includeHistory | boolean | no | Add every recorded sale (with buyer and seller where published) and prior-year values to each row. Turn off for a smaller, flatter dataset. (default True) |
listCoverage | boolean | no | Return one free row per county/state source this actor reads, with the fields each one publishes. Nothing else runs. |
Most of that table is filters and lookups you will not touch on a first run. Two fields decide what you get.
areas takes a state, a county or a ZIP, one per line, and a ZIP turns into its county plus a ZIP
filter, so 85323 quietly means “Maricopa County, ZIP 85323”. A state reads the whole statewide
roll where one exists (Florida’s is 67 county files), which is why the cap below matters.
maxResultsPerArea is a cap per line, not per run, and it defaults to 1,000. At $0.02 a row that
default is $20 per area, so set it to what you want, or run with countOnly first: it answers
“how many, and what would it cost” for free. For 85323 it says 15,926 parcels before any filter.
A working input:
{
"areas": [
"85323"
],
"preset": "absentee_owners",
"maxResultsPerArea": 100
}
Step 3 — Run it
Press Start. Rows are pushed to the dataset as they’re found, so the run log fills in as it works.
An ArcGIS or Socrata county is quick: the smoke run for this listing pulled 60 rows from four counties (Maricopa, Philadelphia, Cook and Liberty County, Florida) in 73 seconds on the Apify platform. Harris is the slow one, because its roll is a 212 MB file: the download alone took 60 seconds on Apify, and an address lookup there finished in 86 seconds.
An empty result is never silent. An area outside coverage comes back as a free not_covered
row, a feed that does not answer as a free blocked row, and a filter a county cannot answer
(property type where the county publishes no description, say) skips that county with a free row
naming the filter, rather than handing you unfiltered rows.
Step 4 — Read the output
Each run returns a labelled table, not raw JSON:
Every row looks like this — a real row from a real run:
{
"query": "85323",
"query_type": "export",
"state": "AZ",
"county": "Maricopa",
"county_fips": "04013",
"parcel_id": "101-01-026",
"situs_address": "810 S 114TH DR",
"situs_city": "AVONDALE",
"situs_zip": "85323",
"owner_name": "J AND L AZ PROPERTIES LLC",
"owner_type": "company",
"mailing_address": "5001 142ND LN NW",
"mailing_city": "RAMSEY",
"mailing_state": "MN",
"mailing_zip": "55303",
"absentee_tier": "out_of_state",
"absentee_owner": true,
"market_value": 331000,
"assessed_value": 169254,
"tax_year": 2027,
"year_built": 2008,
"building_sqft": 1804,
"lot_sqft": 6722,
"last_sale_date": "2013-03-01",
"last_sale_price": 128000,
"source": "Maricopa County Assessor"
}
| Field | Example value | Meaning |
|---|---|---|
parcel_id | 101-01-026 | The county’s own parcel / account / PIN number |
situs_address, situs_city, situs_zip | — | The property’s address |
owner_name | J AND L AZ PROPERTIES LLC | Owner of record as the roll prints it (null where state law withholds names: California, New Jersey, and a few counties) |
owner_type | company | individual, company, trust or government — classified from the name |
mailing_address, mailing_city, mailing_state, mailing_zip | — | Where the owner’s tax mail goes |
absentee_tier / absentee_owner | — | out_of_state, out_of_city, same_city_diff_address, owner_occupied or unknown, with absentee_basis saying why; absentee_owner is the yes/no version |
market_value, assessed_value, land_value, improvement_value, taxable_value | — | The county’s values; field_notes says what each one means for that county |
property_class, property_class_desc | — | The county’s use code and its description |
absentee_tier is the column most people came for, and it is deliberately conservative. It
compares the owner’s mailing address with the property: another state is out_of_state, another
city out_of_city, the same street address owner_occupied. When the roll has no mailing
address, or a county writes the township instead of the postal city (Wisconsin does), it says
unknown and absentee_basis says why, rather than guessing. In a 300-row Maricopa sample, 34
owners were out of state and 24 out of city.
Expect nulls that are the county’s, not the actor’s. California and New Jersey withhold owner
names, Texas and Montana publish no sale prices, and Cook publishes assessed but not market
value. Every row carries field_notes saying which gaps are structural for its county.
Step 5 — Export it
Open the Dataset tab and export to CSV, JSON, or Excel — or pull the same rows from the API, which is what you want if this is going to run on a schedule.
What it costs
Two prices. An exported property row is $0.02, so the 100-row input above costs $2.00. A
lookup that finds a property is $0.045. Coverage lists, countOnly previews, uncovered areas,
lookups that miss and the owner-portfolio summary row are free. Apify platform usage is billed
separately. A sensible first run is a countOnly pass, which is free, followed by an export
capped at the number of letters you can actually send.
Where the data comes from
This reads County & state assessor rolls (28 feeds) directly. The target is 28 official county and state assessor feeds behind four readers: ArcGIS FeatureServer/MapServer query endpoints, a Socrata SODA catalogue (Cook), a Carto SQL endpoint (Philadelphia), and zipped bulk rolls (Florida DOR NAL files listed via SharePoint REST; HCAD’s 212 MB Harris file). Every night a canary runs this actor against that live source and diffs the result against a frozen fixture — what “verified” means.
The feeds are easy to reach and hard to trust. Cook County’s own dataset has a column called owner that matched the buyer of a sale since 2023 on 3 of 250 parcels, while its taxpayer column matched on 201, so this actor reads the taxpayer name. North Carolina writes 2001-01-01 as a sale date on 103,929 parcels that never sold that day, and the actor drops it rather than passing it on as a real sale.
See it used
Build an absentee owner mailing list for a ZIP code takes one Chicago ZIP from 25,087 parcels to a mailing list. Look up who owns a list of property addresses resolves four addresses in four states in one run.
For the listing side of an address rather than the county roll (the Redfin Estimate, listing history, photos), reach for Zillow & Redfin Property Data Scraper.
Last updated 2026-10-28