# Zillow Scraper - Property Listings, Prices & Leads (`scrapesage/zillow-scraper`) Actor

Scrape Zillow homes for sale, for rent & recently sold by city, ZIP or URL: price, Zestimate, beds/baths, sqft, lot, photos, price & tax history, schools and listing-agent contacts (name, phone, email). Lead scoring + monitor mode. No API key, no browser.

- **URL**: https://apify.com/scrapesage/zillow-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Real estate, Lead generation, Agents
- **Features:** Limited permissions
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.94 / 1,000 property scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Zillow Scraper - Listings, Prices, History & Agent Leads

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Zillow Group, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Zillow" is referenced only to describe the publicly available website this Actor collects data from.

Extract **complete Zillow property data** - for sale, for rent, and recently sold - by **city, ZIP, neighborhood, or URL**. Get price, **Zestimate & rent Zestimate**, beds/baths, square footage, lot size, home type, status, days on Zillow, price-change flags, photos and full geo. Switch on **full details** to add description, year built, HOA, parcel/county, **price history, tax history, schools, interior facts** - and the **listing agent + broker contacts (name, phone, email, license, MLS)** that turn every listing into a real-estate lead.

No login, no cookies, no browser - fast JSON extraction straight from Zillow's own data, over residential proxies for reliability.

### Why this Zillow scraper?

This actor ships **a complete dataset**:

| Data | This actor |
| --- | --- |
| Price, beds/baths, sqft, lot, status | ✅ |
| Zestimate + rent Zestimate + tax-assessed value | ✅ |
| FSBO / new-construction / foreclosure / coming-soon flags | ✅ |
| Price-change & days-on-Zillow (price-drop signals) | ✅ |
| Price history + tax history | ✅ opt-in |
| Schools (name, rating, grades, distance) | ✅ opt-in |
| Interior facts (heating, cooling, appliances, parking…) | ✅ opt-in |
| **Listing agent + broker contacts** (name, phone, email, license, MLS) | ✅ opt-in |
| Deduplicated **agent-lead** records | ✅ opt-in |
| Lead score (0–100) per property & per agent | ✅ |
| Monitor mode - only **new / price-changed** listings | ✅ |

### Use cases

- **Real-estate lead generation** - pull listing **agent and broker contacts** (phone, email, license, brokerage) from every property; or flip on **FSBO-only** to find for-sale-by-owner sellers who need an agent, a cash offer, or a wholesaler. Score leads by `leadScore`.
- **Investor & wholesaler deal flow** - monitor a market for **new listings and price cuts** (`priceChange`, `daysOnZillow`, `monitorStatus`), compare to `zestimate`, and filter by price band, beds, home type, and days on Zillow.
- **Comps, CMAs & market analytics** - price, sqft, `pricePerSquareFoot`, **price history** and **tax history** for any city or ZIP feed comparative market analysis and valuation models.
- **Rental market intelligence** - scrape `forRent` listings with rent Zestimates and per-unit pricing across a metro.
- **Property data enrichment** - paste a list of property URLs to hydrate your CRM/database with full Zillow details, schools and agent attribution.
- **Brokerage & PropTech pipelines** - feed MLS-linked listing data into CRMs, dashboards and AI agents on a schedule.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) - the free plan is enough to try this actor.
2. Open the **Zillow Scraper**, enter one or more **locations** (e.g. `Austin, TX`) or ZIP codes, pick a **Listing type**, and click **Start**.
3. Watch property records stream into the dataset table. Turn on **Include full property details** to add history, schools and agent contacts.
4. **Export** as JSON, CSV, Excel, XML, or RSS - or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "locations": ["Austin, TX"],
    "listingType": "forSale",
    "minPrice": 300000,
    "maxPrice": 700000,
    "minBeds": 3,
    "homeTypes": ["houses"],
    "daysOnZillow": "7",
    "includePropertyDetails": true,
    "extractAgentLeads": true,
    "maxResults": 100,
    "monitorMode": false
}
```

- **locations** - `City, ST` (`Austin, TX`), `City, State name`, a neighborhood, or a 5-digit ZIP.
- **zipCodes** - ZIP codes (alternative to locations).
- **searchUrls** - paste Zillow search/results URLs (their own filters are respected).
- **propertyUrls** - paste individual `…/homedetails/…_zpid/` URLs to scrape full property details directly.
- **startUrls** - any mix of search/property URLs (auto-detected).
- **listingType** - `forSale` *(default)*, `forRent`, or `sold`.
- **forSaleByOwnerOnly** - return only FSBO listings (investor/wholesaler seller leads).
- **minPrice / maxPrice / minBeds / maxBeds / minBaths / minSqft / maxSqft / minYearBuilt / maxYearBuilt** - numeric filters.
- **homeTypes** - `houses`, `condos`, `townhomes`, `multi-family`, `apartments`, `manufactured`, `lots-land`.
- **daysOnZillow** - `1`, `7`, `14`, `30`, `90` (newly listed).
- **sort** - `relevant`, `newest`, `price_asc`, `price_desc`, `beds`, `lot_size`.
- **includePropertyDetails** *(default false)* - full per-property data + price/tax history + schools + **agent & broker contacts**.
- **extractAgentLeads** *(default false)* - also emit one deduplicated agent-lead record per listing agent.
- **maxResults / maxResultsPerSearch** - overall and per-search caps.
- **maxRunSeconds** *(default 240)* - soft time budget so scheduled runs never hit the platform timeout. Raise it for big pulls.
- **monitorMode** *(default false)* - only new / price-changed listings (see below).

### Output

One record per property (`type: "property"`), plus optional agent-lead records (`type: "agent"`):

```json
{
    "type": "property",
    "zpid": "29508552",
    "url": "https://www.zillow.com/homedetails/123-Main-St-Austin-TX-78701/29508552_zpid/",
    "statusType": "FOR_SALE",
    "statusText": "House for sale",
    "price": 450000,
    "zestimate": 462300,
    "rentZestimate": 2650,
    "taxAssessedValue": 401200,
    "priceChange": -15000,
    "address": "123 Main St, Austin, TX 78701",
    "city": "Austin",
    "state": "TX",
    "zipcode": "78701",
    "latitude": 30.2649,
    "longitude": -97.7426,
    "bedrooms": 3,
    "bathrooms": 2,
    "livingArea": 1820,
    "homeType": "Single Family",
    "daysOnZillow": 5,
    "isFsbo": false,
    "brokerName": "Realty ABC",
    "yearBuilt": 1998,
    "hoaFee": "$45/mo",
    "county": "Travis County",
    "priceHistory": [{ "date": "2026-06-15", "event": "Price change", "price": 450000 }],
    "taxHistory": [{ "year": 2024, "taxPaid": 8120, "value": 401200 }],
    "schools": [{ "name": "Austin High", "rating": 8, "level": "High", "distance": 1.2 }],
    "agentName": "Jane Broker",
    "agentPhone": "(512) 555-0100",
    "agentEmail": "jane@realtyabc.com",
    "agentLicenseNumber": "TX-998877",
    "mlsId": "1234567",
    "leadScore": 78,
    "leadSignals": ["agentEmail", "agentPhone", "priceCut", "fresh"],
    "source": "zillow",
    "scrapedAt": "2026-06-23T12:00:00.000Z"
}
```

Empty fields are omitted (no always-blank columns in CSV/Excel). A field is missing only when Zillow doesn't publish it.

### Monitor mode - only new & changed listings

Turn on **monitorMode** and the actor remembers every listing it has seen (by `zpid`, plus a price/status fingerprint). On the next run it returns **only new listings or ones whose price or status changed**, each tagged `monitorStatus: "new" | "changed"`. This works **independently of [Apify Schedules](https://docs.apify.com/platform/schedules)** - schedule the actor hourly/daily and every run delivers a clean diff, perfect for **new-listing and price-drop alerts**. Use distinct `monitorStoreName` values to track several markets separately.

### How much does it cost to scrape Zillow?

This Actor uses Apify's **pay-per-event** pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

- **Property scraped** - One Zillow property with all standard listing fields – price, Zestimate & rent Zestimate, tax-assessed value, beds, baths, living area, lot, home type, status, days on Zillow, price-change, full address, coordinates, photos, FSBO/new-construction/foreclosure flags and a 0–100 lead score. No start fee, no add-on for filters or pagination.
- **Property details add-on** - Charged once per property only when 'Include full property details' is on and the detail page is parsed successfully: full description, year built, lot size, HOA, parcel/county, price history, tax history, schools, interior facts (heating/cooling/appliances/flooring/parking) AND the listing agent + broker contacts (name, phone, email, license, MLS). Added on top of the property fee.
- **Agent lead** - One deduplicated real-estate agent lead built from a listing's attribution – agent name, phone, email, license number, brokerage, broker phone and MLS, with a 0–100 lead score. Only emitted when 'Extract agent leads' is on.

The current price of each event is shown on the **Pricing** tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** - start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** - official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** - run it daily with `monitorMode` to track new listings & price cuts in a city or ZIP.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** - trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/zillow-scraper').call({
    locations: ['Austin, TX'],
    listingType: 'forSale',
    minPrice: 300000,
    maxPrice: 700000,
    includePropertyDetails: true,
    extractAgentLeads: true,
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} Zillow properties & agent leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps - no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** - multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** - push new listings or agent leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** - get notified when a monitored market gets a new listing or price drop.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** - auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** - pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** - trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** - ask your assistant to "find 3-bed houses under $600k in Austin listed this week and list the agent contacts" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready**: AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)**: an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), with no account and no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)**: agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **real-estate & lead-gen stack**:

- **[Redfin Scraper](https://apify.com/scrapesage/redfin-scraper)** - listings, prices and home data from Redfin.
- **[Rent.com Scraper](https://apify.com/scrapesage/rent-com-scraper)** - apartment & rental listings with leasing-office contacts.
- **[Realtor.ca Scraper](https://apify.com/scrapesage/realtor-ca-scraper)** - Canadian property listings.
- **[Crexi Scraper](https://apify.com/scrapesage/crexi-scraper)** - commercial real-estate listings and brokers.
- **[US Property Records Scraper](https://apify.com/scrapesage/us-property-records-scraper)** - owner & assessor property records.
- **[FastExpert Agent Scraper](https://apify.com/scrapesage/fastexpert-agent-scraper)** - real-estate agent leads, reviews & production stats.
- **[Google Maps Scraper](https://apify.com/scrapesage/google-maps-scraper)** - local business leads with emails & socials.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** - emails, phones & socials from any website.

### Tips

- **Big cities**: Zillow caps a single search at ~500–800 results. To exhaust a large metro, split runs by **price band**, **home type**, or **ZIP code**.
- **Speed & cost**: leave `includePropertyDetails` off for fast, cheap bulk listing pulls; turn it on only when you need history, schools or agent contacts.
- **Large pulls**: raise `maxRunSeconds` (e.g. 1800) **and** the run's timeout together; the default 240s soft budget keeps scheduled/health runs well under 5 minutes.
- **Proxies**: keep the default **Residential** proxy - Zillow blocks datacenter IPs.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` to track only what's new.

### FAQ

**How do I scrape Zillow listings for a city or ZIP?** Put the city in `locations` (`Austin, TX`) or the ZIP in `zipCodes`, choose a `listingType`, and run. Add filters (price, beds, home type, days on Zillow) to narrow results.

**Does it need a Zillow API key or login?** No. The actor reads Zillow's own publicly rendered data over residential proxies - no API key, no account, no browser.

**Can I get the listing agent's contact details?** Yes - turn on `includePropertyDetails` to add the agent and broker name, phone, email, license number and MLS to each property, and `extractAgentLeads` to also get one deduplicated agent record per agent.

**How do I get only new listings or price drops?** Turn on `monitorMode` and schedule the actor - each run returns only new or price/status-changed listings, tagged `monitorStatus`.

**Can I export to Google Sheets, CSV, or Excel?** Yes - one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Why is a field missing?** Empty fields are omitted to keep exports clean. A field is absent only when Zillow doesn't publish it for that listing. Known source-gated cases: **Zestimate** is missing on many active MLS listings; **agent email** is almost never public; the **listing agent's direct phone** depends on the MLS region (some, e.g. Dallas/NTREIS, expose only the **broker phone** - which the actor still returns); and **recently-sold prices** are login-walled by Zillow (see below).

**Why don't `sold` listings have a price?** Zillow gates the exact sale price and price history of sold homes behind a login for anonymous access. The actor still returns every sold home's address, beds/baths/sqft, home type, year built, schools and the **sale date** (`dateSold`) - just not the closing price. `forSale` and `forRent` listings are fully priced.

**How are rental apartment buildings handled?** Large `forRent` results are often whole apartment buildings rather than single units. Those records include the **building name**, **rent range** (`minRent`/`maxRent`), **bedroom range**, **unit count**, and the building's **leasing phone** - a ready-made rental lead.

**It returned 0 results / said it was blocked - why?** Zillow runs PerimeterX anti-bot. The actor defends against it with US residential proxies, aggressive IP rotation, and an OpenStreetMap geocode fallback that drives Zillow's reliable internal search API when the public page is being challenged. In the rare event Zillow blocks every attempt in a run, the actor finishes cleanly (you are **not** billed) with a status message - just re-run.

**Is scraping Zillow legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and Zillow's terms.

### Data & lawful use

This Actor reads business and professional listings that the professionals themselves published to be found: names, roles, firms, ratings and the contact details shown on the public listing. Because those details belong to identifiable people, treat the output as personal data. If you are in the EU or UK you are the data controller for what you do with it: have a lawful basis (usually legitimate interest for B2B prospecting or market research), keep any outreach relevant to the professional's line of work, honour opt-outs and deletion requests, and do not use the output for spam.

Under [Apify's Standard Actor Contract](https://docs.apify.com/legal/standard-actor-contract), which governs your use of this Actor, you are the controller of any personal data in your input and output and scrapesage acts only as your processor: that data is processed solely to run your job, written only to your own Apify storage, never used for any other purpose and never shared onward. If you need help with a data-subject request that involves this Actor's output, open an issue on the Issues tab.

### Disclaimer

**This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Zillow Group, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.**

"Zillow" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official Zillow product, is not authorised or certified by Zillow Group, Inc., and does not distribute Zillow software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome - this actor is actively maintained.

# Actor input Schema

## `locations` (type: `array`):

Places to search. Use `City, ST` (e.g. `Austin, TX`), `City, State name`, a neighborhood, or a 5-digit ZIP. Each location is combined with the chosen Listing type.

## `zipCodes` (type: `array`):

5-digit ZIP codes to search (alternative to Locations).

## `searchUrls` (type: `array`):

Paste Zillow search/results page URLs (e.g. https://www.zillow.com/austin-tx/houses/). A pasted URL's own filters (searchQueryState) are respected.

## `propertyUrls` (type: `array`):

Paste individual Zillow property URLs (…/homedetails/…\_zpid/) to scrape full property details directly. These are always enriched with price/tax history, schools and listing-agent contacts.

## `startUrls` (type: `array`):

Any mix of Zillow search or property URLs - the actor auto-detects each.

## `listingType` (type: `string`):

Which listings to return for location/ZIP searches.

## `forSaleByOwnerOnly` (type: `boolean`):

When Listing type is For sale, return only FSBO listings (great for wholesaler / investor seller leads).

## `minPrice` (type: `integer`):

Minimum price (sale) or monthly rent.

## `maxPrice` (type: `integer`):

Maximum price (sale) or monthly rent.

## `minBeds` (type: `integer`):

Minimum number of bedrooms.

## `maxBeds` (type: `integer`):

Maximum number of bedrooms.

## `minBaths` (type: `integer`):

Minimum number of bathrooms.

## `minSqft` (type: `integer`):

Minimum living area in square feet.

## `maxSqft` (type: `integer`):

Maximum living area in square feet.

## `minYearBuilt` (type: `integer`):

Earliest year the home was built.

## `maxYearBuilt` (type: `integer`):

Latest year the home was built.

## `homeTypes` (type: `array`):

Restrict to specific home types. Allowed values: houses, condos, townhomes, multi-family, apartments, manufactured, lots-land. Leave empty for all.

## `daysOnZillow` (type: `string`):

Only listings published within this window.

## `sort` (type: `string`):

Ordering for location/ZIP/search-URL results.

## `includePropertyDetails` (type: `boolean`):

Visit each property page for the full dataset: description, year built, lot size, HOA, parcel/county, price history, tax history, schools, interior facts AND the listing agent + broker contacts (name, phone, email, license, MLS). One extra request per listing; charged as a 'Property details' add-on only when it succeeds.

## `extractAgentLeads` (type: `boolean`):

Also output one deduplicated agent-lead record per listing agent (name, phone, email, license, brokerage, MLS). Requires Include full property details. Charged as a separate 'Agent lead' record.

## `maxPhotosPerListing` (type: `integer`):

Cap the number of photo URLs stored per property (0 = none).

## `maxResults` (type: `integer`):

Maximum number of property records to return across the whole run.

## `maxResultsPerSearch` (type: `integer`):

Cap results per individual location/ZIP/search URL (0 = no per-search cap). Zillow caps a single search at ~500–800 results; split by price band or ZIP to exceed that.

## `maxRunSeconds` (type: `integer`):

The run stops gracefully after this many seconds so scheduled/automated runs never hit the platform timeout. Default 240s keeps health-check runs under 5 minutes; raise it (e.g. 1800) for big pulls and set a matching run timeout.

## `detailConcurrency` (type: `integer`):

Parallel property-detail requests when Include full property details is on. Lower values are gentler on Zillow's anti-bot and improve per-page success.

## `deduplicateResults` (type: `boolean`):

Skip duplicate properties (by zpid) within a run.

## `monitorMode` (type: `boolean`):

Remember listings across runs and emit only NEW listings or ones whose price/status CHANGED (tagged monitorStatus = new|changed). Works independently of Apify Schedules - schedule this actor and each run returns only what's new. Great for new-listing & price-drop alerts.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers seen listings between runs. Use distinct names to track different markets separately. Lowercase letters, digits and hyphens only.

## `proxyConfiguration` (type: `object`):

Zillow blocks datacenter IPs (PerimeterX). Keep the default Apify Residential proxy for reliable results.

## `urlsFromFile` (type: `string`):

Paste a list of URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many Start URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "listingType": "forSale",
  "forSaleByOwnerOnly": false,
  "homeTypes": [],
  "daysOnZillow": "",
  "sort": "relevant",
  "includePropertyDetails": false,
  "extractAgentLeads": false,
  "maxPhotosPerListing": 10,
  "maxResults": 100,
  "maxResultsPerSearch": 0,
  "maxRunSeconds": 240,
  "detailConcurrency": 3,
  "deduplicateResults": true,
  "monitorMode": false,
  "monitorStoreName": "zillow-scraper-monitor",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "urlsFromFile": ""
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped records in the default dataset - properties with prices, Zestimates, beds/baths, history, schools and listing-agent contacts, plus any agent-lead records.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Austin, TX"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "urlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/zillow-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Austin, TX"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "urlsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/zillow-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Austin, TX"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "urlsFromFile": ""
}' |
apify call scrapesage/zillow-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/zillow-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/XLaUymkZXM0vaeSE4/builds/ZF7q6C6EqZWWGbAFL/openapi.json
