Zillow Market Data Scraper | $0.10/1K | ZHVI & ZORI avatar

Zillow Market Data Scraper | $0.10/1K | ZHVI & ZORI

Pricing

from $0.10 / 1,000 paid plans: saved monthly observations

Go to Apify Store
Zillow Market Data Scraper | $0.10/1K | ZHVI & ZORI

Zillow Market Data Scraper | $0.10/1K | ZHVI & ZORI

Export official Zillow Research home value (ZHVI) and rent (ZORI) time series by metro region and date. Get monthly observations as flat CSV or JSON rows.

Pricing

from $0.10 / 1,000 paid plans: saved monthly observations

Rating

0.0

(0)

Developer

Hundevmode Labs

Hundevmode Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 days ago

Last modified

Categories

Share

Zillow Market Data Scraper

Export official Zillow Research home value and rent index time series by region and date. Get monthly ZHVI and ZORI observations in a flat table for housing-market analysis, charts and data pipelines.

Result pricing: $0.10/1,000 monthly observation rows on paid Apify plans; $0.30/1,000 on Free. Automatic source access recovery is included. No Zillow login or additional service is required.

What you can collect

  • Collect the supported official metropolitan-area CSV series, including a national row where supplied.
  • Choose the Zillow Home Value Index (ZHVI), Zillow Observed Rent Index (ZORI), or both.
  • Select numeric RegionIDs and an inclusive monthly date range.
  • Export one region × metric × monthly period per row; blank source observations remain null.

How to use Zillow Market Data Scraper

  1. Choose ZHVI, ZORI or both, then select RegionIDs and a monthly date range.
  2. Set Maximum results this run and optional filters.
  3. Set a spending limit in Apify run options, then click Start.
  4. Open the results, review the coverage summary, and download CSV, Excel or JSON.

Quick-start input

{
"metrics": [
"zhvi",
"zori"
],
"regionIds": [
"394514"
],
"startDate": "2026-06-01",
"maxResults": 20
}

This example is a starting point; replace its sources with your own. Region IDs must be numeric strings; start with a recent date range to keep the export small.

Input options

InputPurposeDefault
metrics["zhvi"], ["zori"] or both.["zhvi"]
geographySupported official metro-series files; national row included where supplied.metro
regionIdsOptional numeric Zillow RegionID strings; 394514 is Dallas, TX. Empty selects all rows in the selected files.Empty
startDate / endDateInclusive YYYY-MM-DD range applied to each monthly period date.Entire available history
maxResultsMaximum new monthly observation rows this run.100
resumeFromRunIdContinue the latest finished batch with the same query.Unset
advancedOptional request, time, download and retry ceilings.300 requests, 600 seconds, 50 MB on paid plans

Manually supplied source lists accept up to 100 entries. You may combine supported input methods; earlier sources can consume the shared result limit before later ones are reached.

Output: CSV and JSON fields

Each result is one monthly observation record. Missing source fields are null. The default table uses readable column labels while exports keep stable field names.

DataColumns
RegionregionId, regionName, regionType, state
Observationmetric, period, value, unit
DefinitionseasonallyAdjusted, seriesVariant
ProvenancerecordId, source (official CSV URL)

Nested attributes, where present, are serialized as JSON strings so CSV remains flat. Errors are not mixed into paid dataset rows. Coverage and limits (RUN_SUMMARY), Source issues (ERRORS) and Continue collection (PAGINATION) are separate run output links. REQUEST_METRICS and CHECKPOINT are available in key-value storage.

The actor selects observations from the supported official CSV files; it does not paginate Zillow listing pages. Regions, dates and revisions depend on the current source file.

The source definitions and downloadable files are available on the official Zillow Research data page.

💳 Pricing and spending limits

Apify accountPrice per 1,000 monthly observation rowsCollection allowance
Paid plan$0.10Requested count, source availability and run limits
Free$0.30500 rows across one collection and its continuation chain

Each region × metric × month is one billable observation, including a blank source value stored as null. The full official CSV is downloaded even for a small selection.

The platform actor-start event is $0.00250 per GB of allocated memory, with a minimum of one event. A 256 MB run therefore pays $0.00250 to start. Each new continuation run and each Resurrect may incur another start event. This start fee covers loading the official files and can apply even when the run produces no observations. There are no separate enrichment or access-recovery add-ons. Platform usage is included in the PPE policy; no extra dataset-item event is configured.

Apify authenticates the account plan automatically; input cannot select the cheaper rate. Free is an Apify account plan, not zero-price output: results consume available account credits. Free runs also stop at 40 requests, 180 seconds or 10 MB of compressed downloaded responses. These ceilings cannot be raised in the input. Downloads are checked between responses, so one response can exceed the remaining traffic allowance. Independent fresh collections have independent allowances; this is not an account-wide monthly quota.

Minimum permitted Max total charge: $0.00280, covering the start event and at least one result at the highest Free rate. This is a minimum budget setting, not a minimum bill: only the start and saved result events are charged. The same result rates apply to all paid Apify plans.

Set Max total charge in Apify run options, or maxTotalChargeUsd through the API. The requested result count is not a dollar budget. The SDK checks remaining run budget before saving charged rows, and Apify can stop a run when its budget is reached. Paid-account credit balance and overage settings are separate from this run limit. Rates are configured for the current private release; the actor has not been published in Apify Store.

🔁 Continue after a limit or source error

  1. Keep the saved dataset and wait until the previous run has finished.
  2. Open Continue collection (PAGINATION) in the run output.
  3. If hasMore=true, copy the full nextInput into a new run of this same actor. It includes resumeFromRunId.
  4. Keep the query, filters and any monitor baseline unchanged. You may change maxResults and advanced collection limits; ZIP per-code quotas stay unchanged.
  5. Set a new spending budget. Download this batch’s dataset and combine it with your earlier batches.

The next batch contains newly saved rows only. Earlier rows are skipped and are not charged again along that continuation chain. Use the latest finished batch: branching twice from an older run can create overlapping datasets. The previous run must belong to your own account and this actor, and its storage must remain available.

Stop or issueNext step
Result, request, time or download ceilingUse PAGINATION.nextInput if hasMore=true; adjust the next batch’s limits.
Temporary restriction or HTTP 403Bounded automatic recovery has already been attempted. Retain progress and try the continuation later. A fresh run does not guarantee that access is restored.
Spending limitKeep saved rows and resume with a new per-run budget. The budget is not shared across the chain.
Free collection allowanceContinuation and Resurrect do not replenish it. Upgrade the account before collecting beyond the Free allowance.
Invalid input or changed queryCorrect the input; keep the original query for continuation or start a separate collection.
Missing checkpoint after a hard stopA usable continuation may be unavailable. Keep any saved rows; a fresh collection cannot guarantee deduplication against that dataset.

Apify Resurrect restarts the same run and storage. resumeFromRunId creates a separate batch and dataset. Do not use both methods simultaneously. A requested count is a ceiling, not a promise that Zillow has that many accessible records.

Run through the Apify API

The same JSON input works in Apify Console and through the Apify Actor API. Start a run, wait for it to finish, then export its dataset as JSON, CSV or Excel. Use the actor ID from its Console page and your own Apify API token; no Zillow API key is required. Pass maxTotalChargeUsd as a run option rather than an input field. Never put API tokens in the input.

Choose the right Zillow actor

Choose this actor for regional monthly housing indexes. Use Zillow Scraper for current property inventory, or Zillow Property Details Scraper for an individual home’s available Zestimate.

Frequently asked questions

How is an observation counted?

Each region, metric and monthly period is one result, including a blank source value stored as null. Two regions × two metrics × twelve available periods produce up to 48 rows, not two rows.

What is the difference between ZHVI and ZORI?

The supported ZHVI file is the mid-tier all-homes smoothed, seasonally adjusted home value series. The supported ZORI file is the smoothed all-homes rent index; this variant is not marked seasonally adjusted. The output identifies the variant and units.

Is this a Zestimate or live listing feed?

No. This actor returns regional monthly indexes. Use a property-details scraper for an individual property’s available Zestimate or a listing scraper for property inventory.

How do I find a RegionID?

Use the official CSV’s RegionID column or first export a small recent period with no RegionID filter and read regionId and regionName together. IDs must be numeric strings; city names are not accepted in this field.

Can historical values change between continuation runs?

Yes. Zillow can revise historical observations or add periods to the files. Continuation skips previously saved observation IDs and does not update their old values. For a consistent snapshot, export the selected history in one run within your plan and budget limits.

Is this an official Zillow API?

No. This is an independent actor callable through the Apify API. It is not affiliated with, sponsored or endorsed by Zillow. Source fields, layouts and access can change; complete extraction and uninterrupted access are not guaranteed.