Zillow Tax History Scraper (Cheap) avatar

Zillow Tax History Scraper (Cheap)

Pricing

from $1.99 / 1,000 results

Go to Apify Store
Zillow Tax History Scraper (Cheap)

Zillow Tax History Scraper (Cheap)

Property price and tax history scraper that outputs one flat row per event. Every sale, price change, and tax year becomes its own dataset record, ready to load into a spreadsheet or database without any post-processing.

Pricing

from $1.99 / 1,000 results

Rating

0.0

(0)

Developer

Data API

Data API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Zillow Tax History Scraper

Zillow Tax History Scraper

Zillow shows a property's tax bills and past sales in a tidy little widget, but try pulling that into a model and you are stuck copying numbers cell by cell. This actor does the lifting. Hand it a Zillow property ID, a listing link, or a plain street address, and it gives you the full tax and price history for that home as one flat row. Every assessed value, every annual tax bill, and every sale lands in numbered columns you can drop straight into a spreadsheet.

What you get

One row per property, with two kinds of history laid out side by side so nothing needs reshaping after export:

  • Sale and price events — for each of up to 10 events: sale1Date, sale1Price, sale1PricePerSqft, sale1ChangePct, sale1EventType, sale1ListingSource, sale1BuyerAgent, sale1SellerAgent, running through sale10*.
  • Tax records — for each of up to 10 years: levy1Year, levy1TaxPaid, levy1TaxChangePct, levy1AssessedValue, levy1AssessedChangePct, running through levy10*.
  • Lookup contextqueryInput, zillowPropertyId, collectedAt, and errorMessage so you can trace every row back to what you asked for.

Every rate from Zillow arrives as a plain percentage, so there are no decimal fractions to convert on your end.

Quick start

  1. Click Try for free and open the input form.
  2. Fill in at least one of Zillow property IDs, Listing page URLs, or Property addresses — mix all three in a single run if you like.
  3. Set Run timeout (seconds) to fit the size of your list (about 30 seconds per property).
  4. Press Start, then export the dataset as JSON, CSV, Excel, or XML when the run finishes.

How it works

Use cases

  • Deal screening — pull tax and price history for a shortlist of homes and rank them on tax burden or recent price moves
  • Housing market research — build a dataset of assessed values and tax trends across a neighborhood or ZIP
  • Comparative market analysis — line up past sale prices and price-per-square-foot for nearby properties
  • Property tax appeals — gather year-over-year assessed value and tax changes to support a case
  • Investment underwriting — feed historical tax bills into cash-flow models without manual entry
  • Data enrichment — turn a list of addresses or Zillow links you already have into a clean history table

Input

Provide at least one of the three lookup fields. You can combine IDs, URLs, and addresses freely in one run.

FieldTypeRequiredDescription
propertyIdsarray of stringsOne of propertyIds, listingPageUrls, or propertyAddressesZillow ZPIDs to look up, one per line. Prefilled with 29489015, 32345923.
listingPageUrlsarray of stringsOne of propertyIds, listingPageUrls, or propertyAddressesZillow home detail links, one per line. Works whether or not the ID sits in the path.
propertyAddressesarray of stringsOne of propertyIds, listingPageUrls, or propertyAddressesFull street addresses, one per line. The actor resolves the matching ID first.
timeoutSecondsintegerNoTotal run budget in seconds. Raise it for longer lists, around 30 seconds per property. Default 360.

Example input

{
"propertyIds": ["29489015", "32345923"],
"listingPageUrls": [
"https://www.zillow.com/homedetails/1234-Maple-Grove-Denver-CO-80205/29489015_zpid/"
],
"propertyAddresses": ["1234 Maple Grove Dr, Denver, CO 80205"],
"timeoutSeconds": 360
}

Output

Each property becomes a single wide row. Up to 10 sale events sit in sale1* through sale10* columns and up to 10 tax years in levy1* through levy10*. Columns for events a property does not have are simply left out, so a run of 50 properties gives you 50 rows.

Example output

{
"queryInput": "1234 Maple Grove Dr, Denver, CO 80205",
"zillowPropertyId": "29489015",
"sale1Date": "2026-01-18",
"sale1Price": 845000,
"sale1PricePerSqft": 312,
"sale1ChangePct": -2.31,
"sale1EventType": "Listed for sale",
"sale1ListingSource": "REcolorado",
"sale1BuyerAgent": null,
"sale1SellerAgent": null,
"sale2Date": "2021-06-09",
"sale2Price": 612000,
"sale2PricePerSqft": 226,
"sale2ChangePct": 9.82,
"sale2EventType": "Sold",
"sale2ListingSource": "REcolorado",
"sale2BuyerAgent": "Maria Delgado",
"sale2SellerAgent": "Tom Hargrove",
"sale3Date": "2016-04-22",
"sale3Price": 478000,
"sale3PricePerSqft": 177,
"sale3ChangePct": 0,
"sale3EventType": "Sold",
"sale3ListingSource": "REcolorado",
"sale3BuyerAgent": null,
"sale3SellerAgent": "Tom Hargrove",
"levy1Year": 2025,
"levy1TaxPaid": 6480,
"levy1TaxChangePct": 4.12,
"levy1AssessedValue": 689000,
"levy1AssessedChangePct": 3.05,
"levy2Year": 2024,
"levy2TaxPaid": 6224,
"levy2TaxChangePct": 2.88,
"levy2AssessedValue": 668600,
"levy2AssessedChangePct": 6.41,
"levy3Year": 2023,
"levy3TaxPaid": 6050,
"levy3TaxChangePct": -1.07,
"levy3AssessedValue": 628300,
"levy3AssessedChangePct": 5.18,
"collectedAt": "2026-06-30T10:32:00+00:00",
"errorMessage": null
}

Output fields

FieldTypeDescription
queryInputstringThe exact value you submitted — ID, URL, or address
zillowPropertyIdstringThe Zillow property ID the row resolved to
sale{n}DatestringDate of sale event n
sale{n}PriceintegerSale amount in USD
sale{n}PricePerSqftintegerPrice per square foot
sale{n}ChangePctnumberPercent change from the previous event; negative means a drop
sale{n}EventTypestringEvent label such as Sold, Listed for sale, or Price change
sale{n}ListingSourcestringMLS or listing source name
sale{n}BuyerAgentstringBuyer agent name when shown
sale{n}SellerAgentstringSeller agent name when shown
levy{n}YearintegerTax year
levy{n}TaxPaidnumberAnnual tax billed in USD
levy{n}TaxChangePctnumberYear-over-year change in tax billed as a percent
levy{n}AssessedValueintegerAssessed value in USD
levy{n}AssessedChangePctnumberYear-over-year change in assessed value as a percent
collectedAtstringISO 8601 time the row was captured
errorMessagestringPresent only when the lookup failed after every retry

Tips for best results

  • Start with a handful. Run 5 to 10 properties first to confirm the columns line up with your pipeline before sending a big list.
  • Match the timeout to the batch. The 360-second default suits short runs. Budget about 30 seconds per property for longer lists, and set the same value under Timeout in your Apify run settings.
  • Mix input types freely. IDs, URLs, and addresses can all sit in the same run; the actor resolves each to a property ID before pulling history.
  • Skip the ID lookup when you can. Passing a property ID or a URL with the ID in the path goes straight to history, while a bare address or slug needs one extra resolve step.
  • Filter failed rows by errorMessage. When a lookup fails after all retries, the actor still writes a row with errorMessage filled in so you can re-run just those inputs.

How can I use Zillow tax history data?

How can I use the Zillow Tax History Scraper to pull property tax records in bulk? Paste a list of Zillow property IDs, listing URLs, or addresses, and each one comes back as a row holding up to 10 years of tax history — levy{n}Year, levy{n}TaxPaid, levy{n}AssessedValue, and the year-over-year change percentages. It is a quick way to assemble a tax dataset for a whole street or ZIP without copying numbers by hand.

How can I get Zillow price history for comparative market analysis? Each property row carries up to 10 sale and listing events in sale{n}Date, sale{n}Price, sale{n}PricePerSqft, and sale{n}EventType. Pull the same data for a set of nearby homes, line up the price-per-square-foot, and you have the backbone of a CMA ready for a spreadsheet or BI tool.

How can I track assessed value changes for a property tax appeal? Look up a single address and read the levy{n}AssessedValue and levy{n}AssessedChangePct columns across the years on record. Seeing how the assessment moved relative to the actual tax billed gives you the figures to build an appeal around.

How can I export Zillow property history to CSV or Excel? Run the actor, then use Apify's export options to download the dataset as CSV, Excel, JSON, or XML. Because every property is already a flat row of numbered columns, the file opens cleanly in any spreadsheet with no reshaping needed.

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the legality of web scraping.

Support

Questions, feature requests, or a field you'd like added? Reach out at data.apify@proton.me and we'll get back to you.