# Zillow Agents Scraper: Agent Leads, Sales, Reviews (`automation_craft/zillow-agents-scraper`) Actor

Scrape Zillow real estate agents by city, ZIP code or whole state, or by profile link: name, brokerage, team, Top Agent badge, rating, reviews, sales and price range. Add the profile, licences, every review, past sale and listing. Zillow's filters are checked; misses are free. JSON, CSV, API.

- **URL**: https://apify.com/automation_craft/zillow-agents-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.14 / 1,000 agents

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 Agents Scraper: Agent Leads, Sales, Reviews

**Zillow agents scraper**: search Zillow's real estate agent directory by city, neighborhood, ZIP code or a whole state, or look agents up by
profile link, screen name or Zillow id, and get one row per agent or team: name, brokerage, team or individual, Top Agent badge,
rating, number of reviews, sales in the last 12 months, sales in the searched place, price range, photo and profile link. Add
**Agent details** for the agent's Zillow profile (brokerage address and phone, licences with expiry, bio, years in business,
specialties, languages, service areas, sales statistics, team members, recent sales, listings and reviews), and **Reviews**, **Past
sales** and **Listings** for every review, every home sold and every home listed today, each up to the number you set. Zillow's own
filters (specialties, languages, sale price, buyer's and listing agents, Top Agents, name) are sent and checked on every page. No
login, no Zillow API key, no browser. A place Zillow does not search, an agent it does not have, or an agent your filters leave out
is a free row, never a charge.

### Quick start

1. Put one or more places in **Locations**: a city with its state (`Austin, TX`), a neighborhood with its city and state
   (`Hyde Park, Austin, TX`), a ZIP code (`78704`) or a state (`TX`).
2. Set **Agents per search** (100 when left empty; Zillow shows at most 375 agents for one search, see "More than 375 agents" below).
3. Optional: turn on **Agent details**, **Reviews**, **Past sales** or **Listings**, and the filters you need.
4. Run. Each agent is one row; each search also gets a free coverage row saying how many of Zillow's agents were read.

To look agents up directly, put profile links (`https://www.zillow.com/profile/ericbramlett`), screen names (`ericbramlett`) or
Zillow agent ids (`X1-ZU...`) in **Agents to look up**: each comes with its profile (Agent details).

### What you get

One row per agent or team (`type: "agent"`), read from Zillow's agent finder. Fill measured on 507 agents of 78 directory pages
(Austin, Dayton, Twin Bridges MT, Boise, Miami, Seattle, Houston, Washington DC, ZIP 78704; 2026-10-29):

| Field | What it holds | Filled |
|---|---|---|
| `name`, `screenName`, `encodedZuid` (`id`), `profileUrl` | the agent or team as Zillow names it; its Zillow id and profile | 100 percent |
| `businessName` | the brokerage or team on the card | 100 percent |
| `photoUrl` | the profile photo | 100 percent |
| `isTeam`, `isTopAgent`, `tags` | Zillow's TEAM tag (30 percent of agents) and Top Agent badge (14 percent) | 100 percent |
| `reviewCount`, `rating` | reviews on Zillow, average rating 0 to 5 | 100, 98 percent |
| `salesLast12Months` | sales in the last 12 months as Zillow shows them (0 when Zillow says none; a team card shows the team's) | 94 percent (57 with sales) |
| `salesInSearchedPlace` | sales in the searched city, neighborhood or ZIP code | 87 percent |
| `priceRangeText`, `priceRangeLow`, `priceRangeHigh` | the sale price range Zillow shows ("$97K - $9.5M") and its numbers as shown | 72 percent |
| `search`, `rank`, `page` | the search that found the agent (your input's label, the place, the filters, the walk) and its place in Zillow's order | always |

#### Agent details (add-on)

The agent's profile page, in `details`. Fill measured on 37 profiles of 10 places (2026-10-29):

| Field | Filled |
|---|---|
| brokerage name and address (`details.brokerage`) | 37 of 37 |
| sales statistics: last 12 months, total, average price, price range (text and numbers) | 37 of 37 |
| specialties, service areas, member since | 37, 36, 37 of 37 |
| bio, title, years in business | 36, 30, 28 of 37 |
| licences with number, state, status and expiry (`details.licenses`) | 31 of 37 |
| other licences (with their descriptions), MLS ids | 22, 23 of 37 |
| website, Facebook, video | 33, 25, 9 of 37 |
| brokerage or office phone, where Zillow shows one | 29 of 37 (84 of 300 Chicago profiles) |
| team members with their ratings (team leads), the team lead (members) | 15 of 37 leads |
| AI summary of reviews and sales | 20 of 37 |
| languages besides English | 12 of 37 |
| listings for sale and for rent (counts, 5 each), past sales (total, 5), 10 recent reviews, review breakdown by kind, review keywords | 37 of 37 |
| nearby cities, neighborhoods and ZIP codes; the centre of the agent's sales map | 37 of 37 |
| the agent's own cell and business phone and e-mail, with `includePersonalData` | 37 of 37 (cell), 29 of 37 (business) |

#### Reviews, past sales and listings (add-ons)

- **Reviews** (`reviews`): every review of the agent, up to the number you set (50 when left empty, 5,000 at most): rating, date,
  author's display name, text, the deal it was about, the four sub ratings and the agent's reply. Sorted newest first or by rating,
  filtered by Zillow's own kinds (helped me buy, sell, both, did not work out, renting, never responded).
- **Past sales** (`pastSales`): every home the agent sold or helped buy, newest first, up to the number you set (100 when left empty,
  10,000 at most): address, Zillow link and zpid, date, side (buyer, seller), price where the state discloses it (Texas does not),
  beds, baths, living area.
- **Listings** (`listings`): the homes the agent lists today, for sale and/or for rent, up to the number you set per kind (50 when
  left empty): address, link, price, status, beds, baths, living area, and Zillow's card labels (`badges`: "Showcase", "3D Tour",
  open house times).

For a team lead, Zillow's lists include the team's reviews, sales and listings.

#### More than 375 agents in a city

Zillow's agent finder shows at most 375 agents for one search (25 pages of 15), whatever its count says (Austin: 17,228). The
coverage row says how many of the count were read. Turn on **Read past Zillow's 375 agents a search** (`splitPastCap`) to read on
through the city's ZIP codes (Census 2020) and/or Zillow's sale price bands, each again up to 375 agents; an agent found in several of
them is delivered and charged once. Measured on Austin: the city's own 375 agents, plus six of its ZIP codes, gave 989 different
agents; plus six price bands 912; all thirteen walks 1,280.

#### Whole states

A state (`TX` or `Texas`) is read as its cities, largest first (Census 2024 estimates of incorporated places), each a city search;
an agent found in several cities is delivered once; Agents per search counts the state as one search. Zillow's agent finder has no
state search of its own: given a state's name it answers its largest city, so this Actor never sends one. "New York" and
"Washington" are both a state and a large city: write `New York, NY` for the city and `NY` for the state.

#### Neighborhoods

Zillow's agent finder also searches a neighborhood (`Hyde Park, Austin, TX`, or its link
`https://www.zillow.com/professionals/real-estate-agent-reviews/hyde-park-austin-tx/`), up to 375 agents like a city, in Zillow's own
order for that neighborhood: of the first 15 agents of three Austin neighborhoods, 7 to 10 were among Austin's own first 15 (2026-10-29).
Each page is checked to be that neighborhood; one Zillow does not know is a free row.

#### Looking up agents

A profile link or a screen name reads the agent's profile. A Zillow agent id (`X1-ZU...`) has no page of its own: the Actor finds
the profile through the agent's reviews (and its team) and delivers it only when that profile carries the same id; otherwise the
id is a free row. A looked up agent always comes with Agent details. Search filters apply to searches only.

#### The coverage row

One free row per search (`type: "search"`): Zillow's count (`agentsFound`), the agents read (`agentsReached`) and delivered, those
already delivered by an earlier search of the run, those your filters left out, pages read and failed, and `complete` with the reason
when it is not (`max_agents_per_search`, `directory_reach_375`, `no_matches_in_five_pages`, `place_not_served` ...).

#### Market report (free)

With **Market report**, the run saves `REPORT` (HTML) in its key-value store: the brokerages with the most agents, licence states,
the median sales in the last 12 months, the Top Agent and Premier Agent shares, and the 25 agents with the most sales.

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

You pay per event, with Apify's store discounts by plan:

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Agent (one agent or team) | $1.59 per 1,000 | $1.45 per 1,000 | $1.32 per 1,000 | $1.14 per 1,000 |
| Agent details (add-on, per agent whose profile is in the row) | $1.30 per 1,000 | $1.28 per 1,000 | $1.16 per 1,000 | $1.00 per 1,000 |
| Review (add-on, per review delivered) | $0.42 per 1,000 | $0.38 per 1,000 | $0.35 per 1,000 | $0.30 per 1,000 |
| Past sale (add-on, per sale delivered) | $0.42 per 1,000 | $0.38 per 1,000 | $0.35 per 1,000 | $0.30 per 1,000 |
| Listing (add-on, per listing delivered) | $0.42 per 1,000 | $0.38 per 1,000 | $0.35 per 1,000 | $0.30 per 1,000 |
| Actor start (once per run, charged on every run) | $0.0075 | $0.0075 | $0.0075 | $0.0075 |

Platinum and Diamond plans pay the Gold price.

The Store pricing card shows these same prices per 1,000 events: "$1.14 / 1,000" on the Agent row means one agent costs USD 0.00114.

- Never billed: places Zillow does not search or does not know, agents it does not have, ids that cannot be tied to a profile, an
  agent met twice in one run (another search, a ZIP code, a price band, a city of a state, a lookup), agents your filters leave out,
  agents past your caps or the run's maximum cost, add-on lists that could not be read, coverage rows, status rows, the summary and
  the market report. The Actor start event is charged on every run, whatever it delivers: an input with nothing usable delivers
  nothing, and only the run's start fee is charged.
- The run obeys the maximum cost you set for it: an agent whose Agent event (and Agent details, when on) the limit cannot pay is not
  read or delivered, and neither is any agent after it; reviews, sales and listings that do not fit are cut from the row (its status
  says `cut_by_charge_limit`).
- Example on the Gold plan: 1,000 agents cost $0.0075 (start) + $1.14 = about $1.15; with Agent details add $1.00: about $2.15. One
  agent costs $0.0075 + $0.00114 = about $0.0086. 20 agents with details, 100 reviews, 100 sales and 50 listings each: $0.0075 + 20 x ($0.00114 + $0.001) + 5,000 items x $0.0003 = about $1.55.
- The same 1,000 agents on the Free plan: $0.0075 + $1.59 = about $1.60; with Agent details about $2.90.

### Input

| Setting | What it does |
|---|---|
| `locations` | Cities with their state, neighborhoods with their city and state, 5 digit ZIP codes, or states. Up to 1,000. |
| `searchUrls` | Zillow agent directory links (`https://www.zillow.com/professionals/real-estate-agent-reviews/austin-tx/?specialties=luxury-homes`), their filters and page kept. A filter you set replaces the link's own (`false`, or the whole price slider, clears it); one sale price bound keeps the link's other bound (a bound that meets or crosses it leaves the link unread, free). |
| `agents` | Profile links, screen names or Zillow agent ids. Up to 10,000. |
| `startUrls` | Directory links and profile links in one list. |
| `agentName`, `topAgentsOnly`, `helpsBuyers`, `helpsSellers`, `specialties`, `languages`, `minSalePrice`, `maxSalePrice` | Zillow's own filters, sent and checked on every page. Two specialties or two languages combine with AND (Zillow's rule). Sale prices are values of Zillow's slider (0, 50000 ... 1000000, 1250000 ... 5000000, 6000000 ... 18000000, 500000000). |
| `agentType`, `minRating`, `minReviews`, `minSalesLast12Months`, `maxSalesLast12Months`, `brokerageContains` | Checked on each agent's card. |
| `requirePhone` (the agent's own cell or business phone), `requireCellPhone`, `requireEmail`, `minYearsInBusiness`, `maxYearsInBusiness`, `minTotalSales`, `maxTotalSales` (the profile's total sales), `soldWithinDays`, `premierAgentsOnly`, `minAveragePrice`, `maxAveragePrice` | Checked on each agent's profile: they need Agent details. |
| `maxAgentsPerSearch`, `maxItems`, `splitPastCap`, `startPage`, `countOnly` | How much to read. `countOnly` reads page 1 of each search and returns its count only (free but for the start fee). A search started past page 1 is not split. |
| `includeDetails`, `includeReviews` (`maxReviewsPerAgent`, `reviewSort`, `reviewFilter`), `includePastSales` (`maxPastSalesPerAgent`), `includeListings` (`listingTypes`, `maxListingsPerAgent`) | The add-ons. |
| `includePersonalData` | See "Personal data". |
| `outputFormat`, `omitEmptyFields`, `buildReport` | Nested, flat (spreadsheet columns) or compact rows (core fields for AI agents; the add-on lists you asked for stay whole); leave out empty fields; the free market report. |
| `maxConcurrency`, `requestGapSeconds`, `proxyConfiguration` | Parallel requests (1 to 4, each on its own exit), the wait between two requests on one exit (5 to 60 s; 4.5 s when left empty), proxy. |

A filter nobody passes ends its search after five pages in a row without a match, so it costs at most five pages.

#### Speed

Measured on the platform (256 MB, 3 parallel requests): 375 agents of one search in 74 s; 100 agents with Agent details in 347 s
(about 17 profiles a minute); 20 agents with details, 1,957 reviews, 2,000 past sales and 260 listings in 224 s. Each exit waits 4.5 s
between two requests: the pace Zillow accepts.

#### Personal data

`includePersonalData` is off by default. Off, the agent's own cell and business phone numbers and e-mail address, and reviewers'
Zillow screen names and ids, are empty. The brokerage's name, address and phone, the agent's name, photo, licences and profile link,
and review texts with their authors' display names are always delivered. Texts are delivered exactly as Zillow serves them (HTML
entities such as `&amp;` included). Turn the switch on only for a lawful use: you are responsible for how you use personal data
(GDPR, CAN-SPAM, the TCPA and the like).

#### When Zillow fails

A page Zillow refuses or does not answer after retries is not read and not charged; the search's coverage row says it is not
complete, and the run's status message names Zillow as the failing side, with how many calls failed and what could not be read.
Run it again later.

### API examples

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~zillow-agents-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locations":["Austin, TX"],"maxAgentsPerSearch":50,"includeDetails":true}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/zillow-agents-scraper').call({ locations: ['78704'], specialties: ['luxury-homes'], includeReviews: true });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((r) => r.type === 'agent').length);
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/zillow-agents-scraper").call(run_input={"agents": ["https://www.zillow.com/profile/ericbramlett"], "includePastSales": True})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row["type"] == "agent":
        print(row["name"], row["businessName"], len(row.get("pastSales") or []))
```

### What this Actor does not do

- No stored copy of the directory: every row is read from Zillow at run time.
- No mortgage lenders and no property managers (agents only).
- No e-mails, phones or social links from the agent's own website (Zillow's profile only).
- No monitoring, no "new agents only" mode, no alerts: run it on a schedule and compare in your own sheet.
- No Notion or other app export of its own: the dataset goes anywhere through Apify's integrations (Make, Zapier, n8n, webhooks).
- No market trends or mortgage rates.
- No "commercial" specialty: Zillow's agent finder has none and ignores it.
- No brokerage licence field of its own: the licences the profile shows are delivered in `licenses` and `otherLicenses`.
- No more than 4 parallel requests: Zillow refuses faster reading.
- No counties or boroughs as places: Zillow's agent finder searches cities, neighborhoods and ZIP codes (a whole state is read
  through its cities).

### FAQ

#### How do I get a list of real estate agents in a ZIP code from Zillow?

Put the ZIP code in Locations (`78704`). Zillow's agent finder lists the agents serving it, up to 375 for one search; turn on the
price band split to read further.

#### How do I get Zillow agents' phone numbers and e-mails?

Turn on Agent details and `includePersonalData`: each agent's profile gives the cell phone (37 of 37 profiles read), the business
phone and the e-mail address. The brokerage's address, and its phone where Zillow shows one, come with Agent details whatever the
switch.

#### Does Zillow have a public API for agent data?

No public agent API is open for this today. This Actor reads Zillow's own agent finder and profile pages, with no login and no key.

#### How many agents can I get for one city?

Zillow shows 375 agents for one search. With `splitPastCap` the Actor reads on through the city's ZIP codes and price bands (Austin:
1,280 different agents from 13 walks); with a whole state, through its cities. The coverage row says how many of Zillow's count were
reached.

#### Can I get only individual agents, or only teams?

Yes: set **Teams or individual agents** (`agentType`) to `individuals` or `teams` (Zillow's TEAM tag; a team row is the team lead's
profile).

#### Why does this Actor run with limited permissions?

It needs nothing beyond its own run storage (its dataset and key-value store), so it asks for nothing more: least privilege keeps
your account safe.

### Changelog

- 0.1 (2026-10-30): first version.

### More data tools by Automation Craft

- [Zillow Scraper: Homes for Sale, Rent and Sold](https://apify.com/automation_craft/zillow-scraper)
- [Zillow Property Details Scraper: Price History](https://apify.com/automation_craft/zillow-property-details-scraper)
- [Realtor.com Scraper: Homes for Sale, Rent & Sold](https://apify.com/automation_craft/realtor-com-scraper)
- [Idealista Scraper: Spain, Italy, Portugal Homes](https://apify.com/automation_craft/idealista-scraper)
- [Airbnb Scraper: Airbnb Data, Prices, Calendar](https://apify.com/automation_craft/airbnb-scraper)
- [US Building Permits Scraper - 38 City Sources](https://apify.com/automation_craft/us-building-permits-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/zillow-agents-scraper/changelog.md

# Actor input Schema

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

Places to search Zillow's agent directory: a city with its state ("Austin, TX"), a neighborhood with its city and state ("Hyde Park, Austin, TX"), a 5 digit ZIP code ("78704"), or a state ("TX" or "Texas") for every city of that state, largest first. Zillow's directory lists agents by city, neighborhood and ZIP code: a county or a borough is not a place it searches. Up to 1,000.

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

Links copied from Zillow's agent finder, such as https://www.zillow.com/professionals/real-estate-agent-reviews/austin-tx/?specialties=luxury-homes . The link's own filters and page are kept; a filter you set below replaces the link's. Up to 1,000.

## `agents` (type: `array`):

Agents to look up directly: a Zillow profile link (https://www.zillow.com/profile/ericbramlett), a screen name (ericbramlett) or Zillow's encoded agent id (X1-ZU...). Each is read from its profile page and delivered with Agent details. An id is matched through the agent's reviews and delivered only when the profile found carries that same id. Not found: a free row. Up to 10,000.

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

The same as the two lists above in one list: agent directory links and profile links. Up to 10,000.

## `agentName` (type: `string`):

Find agents by name. Zillow's name search is loose ("eric bramlett" also lists other Erics), so only agents whose name holds every word you give are delivered; the others are free.

## `topAgentsOnly` (type: `boolean`):

Only agents with Zillow's Top Agent badge.

## `helpsBuyers` (type: `boolean`):

Only agents Zillow lists for buying (its "Buying" filter).

## `helpsSellers` (type: `boolean`):

Only agents Zillow lists for selling (its "Selling" filter).

## `specialties` (type: `array`):

Zillow's specialty filter. Several values combine with AND: an agent must list all of them (Zillow's own rule).

## `languages` (type: `array`):

Zillow's language filter (English is spoken by every agent and is no filter). Several values combine with AND.

## `minSalePrice` (type: `integer`):

The lower bound of Zillow's sale price slider: 0, 50000, 100000 ... 1000000 (steps of 50,000), 1250000 ... 5000000 (steps of 250,000), 6000000 ... 18000000 (steps of 1,000,000). Zillow keeps agents whose sales fall in the range. Other values are refused because Zillow ignores them.

## `maxSalePrice` (type: `integer`):

The upper bound of Zillow's sale price slider, one of its values (see above), or 500000000 for no top.

## `agentType` (type: `string`):

Teams (Zillow marks them TEAM) or individual agents.

## `minRating` (type: `number`):

The lowest average review rating (0 to 5). Agents without a rating are left out.

## `minReviews` (type: `integer`):

The fewest reviews on Zillow.

## `minSalesLast12Months` (type: `integer`):

The fewest sales in the last 12 months as Zillow shows them (team cards show the team's sales).

## `maxSalesLast12Months` (type: `integer`):

The most sales in the last 12 months.

## `brokerageContains` (type: `string`):

Only agents whose brokerage or team name holds every word you give (whole words, any case), such as "Keller Williams".

## `requirePhone` (type: `boolean`):

Only agents whose profile lists their own phone number, cell or business (the brokerage's phone does not count; the number itself is delivered only with includePersonalData).

## `requireCellPhone` (type: `boolean`):

Only agents whose profile lists a cell phone (delivered only with includePersonalData).

## `requireEmail` (type: `boolean`):

Only agents whose profile lists an e-mail address (delivered only with includePersonalData).

## `minYearsInBusiness` (type: `integer`):

The fewest years in business the profile states. Profiles that state none are left out.

## `maxYearsInBusiness` (type: `integer`):

The most years in business the profile states.

## `minTotalSales` (type: `integer`):

The fewest total sales the profile states (its sales statistics; a team lead's profile states the team's). Profiles that state none are left out. Needs Agent details.

## `maxTotalSales` (type: `integer`):

The most total sales the profile states. Profiles that state none are left out. Needs Agent details.

## `soldWithinDays` (type: `integer`):

Only agents whose profile lists a sale within this many days of the run's start.

## `premierAgentsOnly` (type: `boolean`):

Only agents whose profile shows Zillow's Premier Agent mark.

## `minAveragePrice` (type: `integer`):

Only agents whose profile's average sale price is at least this. Zillow rounds it ("$588K"), so an agent passes only when every price the rounded figure can mean is inside the bounds.

## `maxAveragePrice` (type: `integer`):

Only agents whose profile's average sale price is at most this (judged the same way).

## `maxAgentsPerSearch` (type: `integer`):

The most agents delivered for each location or directory link (a whole state counts as one search). When left empty: 100. Zillow shows at most 375 agents for one search (25 pages of 15); "splitPastCap" reads further.

## `maxItems` (type: `integer`):

The most agents delivered in the whole run.

## `splitPastCap` (type: `string`):

When a city's count passes the 375 agents Zillow shows for one search, read on through its ZIP codes (Census 2020) and/or sale price bands, each again up to 375 agents; every agent is delivered once. Coverage rows say how many of Zillow's count were reached.

## `startPage` (type: `integer`):

Start each search at this page of Zillow's directory (1 to 25, 15 agents a page).

## `countOnly` (type: `boolean`):

Read the first page of each city or ZIP search and deliver its agent count and nothing else: only the run's start fee is charged.

## `includeDetails` (type: `boolean`):

Read each agent's Zillow profile into the row: brokerage address and phone, licences with expiry, bio, years in business, specialties, languages, service areas, sales statistics, recent sales and listings, recent reviews with the breakdown, team members, websites. One Agent details event per agent.

## `includeReviews` (type: `boolean`):

Every review of the agent, up to the number below: rating, date, author, text, deal, sub ratings, the agent's reply. One Review event per review delivered.

## `maxReviewsPerAgent` (type: `integer`):

The most reviews read for each agent. When left empty: 50.

## `reviewSort` (type: `string`):

The order Zillow gives the reviews in (newest first when left empty).

## `reviewFilter` (type: `string`):

Zillow's own review filter (all reviews when left empty).

## `includePastSales` (type: `boolean`):

Every home the agent sold or helped buy, newest first, up to the number below: address, link, date, side, price where the state discloses it, beds, baths, size. One Past sale event per sale delivered.

## `maxPastSalesPerAgent` (type: `integer`):

The most past sales read for each agent. When left empty: 100.

## `includeListings` (type: `boolean`):

The homes the agent lists today, up to the number below per kind: address, link, price, status, beds, baths, size, photo. One Listing event per listing delivered.

## `listingTypes` (type: `array`):

For sale, for rent or both (both when left empty).

## `maxListingsPerAgent` (type: `integer`):

The most listings read for each agent and kind. When left empty: 50.

## `includePersonalData` (type: `boolean`):

Adds the agent's own cell and business phone numbers and e-mail address (from the profile, with Agent details or a lookup) and reviewers' Zillow screen names and ids. Off: those fields are empty. The brokerage's name, address and phone are always delivered. You are responsible for using personal data lawfully (GDPR, CAN-SPAM, TCPA and the like).

## `outputFormat` (type: `string`):

Flat turns nested objects into dotted column names for CSV and Excel; lists stay lists. Compact keeps the core fields of the row and of the profile (contact, brokerage, licences, sales statistics) and the add-on lists you asked for.

## `omitEmptyFields` (type: `boolean`):

Leave fields without a value out of each row.

## `buildReport` (type: `boolean`):

Save an HTML report of the agents delivered in the run's key-value store as REPORT: brokerages with the most agents, licence states, median sales in the last 12 months, Top Agent and Premier Agent shares, the 25 agents with the most sales. Free.

## `maxConcurrency` (type: `integer`):

How many Zillow pages are read at once (each on its own exit, 4.5 s apart per exit). When left empty: 3.

## `requestGapSeconds` (type: `integer`):

Wait at least this long between two Zillow requests on one exit (5 to 60). When left empty: 4.5 s, the pace Zillow accepts. A longer gap makes the run slower and its compute longer.

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

Apify Proxy (datacenter exits Zillow accepts, chosen by the Actor) is used by default. Your own proxy links are used as given.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "agentType": "all",
  "maxAgentsPerSearch": 20,
  "splitPastCap": "none",
  "includeDetails": false,
  "includeReviews": false,
  "includePastSales": false,
  "includeListings": false,
  "includePersonalData": false,
  "outputFormat": "nested",
  "omitEmptyFields": false,
  "buildReport": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# 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"
    ],
    "maxAgentsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/zillow-agents-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"],
    "maxAgentsPerSearch": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/zillow-agents-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"
  ],
  "maxAgentsPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/zillow-agents-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/zillow-agents-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/KkwEb1PNXXmpdonas/builds/sFExHb7HZUo7bA4t3/openapi.json
