# Zillow Real Estate Agent Scraper (`mina_safwat/zillow-agent-scraper`) Actor

Scrapes Zillow real estate agent profiles by city, ZIP code, directory link or profile link: brokerage, business phone, rating, reviews, sales in the last 12 months, price range, active listings, service areas, specialties and languages.

- **URL**: https://apify.com/mina_safwat/zillow-agent-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (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

$2.00 / 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.

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

### What does Zillow Real Estate Agent Scraper do?

**Zillow Real Estate Agent Scraper** collects **real estate agent profiles from
[Zillow](https://www.zillow.com/professionals/real-estate-agent-reviews/)**:
name, **brokerage, business phone, office address, star rating, review count,
sales in the last 12 months, total sales, price range, average price, active
listings**, service areas, specialties, languages, licenses, website and photo.
You can also add each agent's **5 newest reviews**.

Type a city such as `Austin, TX` or a ZIP code such as `78704` and get one row
per agent, or paste Zillow profile links (`zillow.com/profile/<name>`) or agent
directory links. Try it with the prefilled input: click **Start** and the
first 11 agents arrive in about 20 seconds.

Because it runs on the Apify platform, you also get API access, scheduled runs,
integrations (Google Sheets, Make, Zapier, webhooks), proxy rotation and run
monitoring.

### Why scrape Zillow agents?

- **Lead lists for real estate services**: mortgage lenders, title companies,
  photographers, stagers, CRM and marketing vendors who sell to agents.
- **Recruiting for brokerages**: find productive agents and teams in a market
  by sales in the last 12 months, price range and reviews.
- **Market research**: compare brokerages and teams in a city or ZIP code,
  and see who leads in luxury, new construction or rentals.
- **Partner and referral search**: find agents who speak a language or serve a
  specialty, with their public business phone and office.
- **Reputation tracking**: follow ratings, review counts and new reviews of
  agents or teams over time with a scheduled run.

### How to scrape Zillow real estate agents

1. In **Places**, type one city per line as `City, ST` (for example
   `Austin, TX`) or a 5-digit ZIP code.
2. Or, in **Zillow agent links**, paste agent profiles such as
   `https://www.zillow.com/profile/ericbramlett`, or directory links.
3. Want filters? Open Zillow's
   [agent directory](https://www.zillow.com/professionals/real-estate-agent-reviews/),
   search a place, set **Specialty**, **Language** or **Top Agent**, and copy
   the address bar into **Zillow agent links**. Your filters are kept.
4. Set **Max agents per place or directory link**.
5. Click **Start**, then download the results when the run finishes.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "locations": ["Austin, TX", "78704"],
    "startUrls": [
        "https://www.zillow.com/profile/ericbramlett",
        "https://www.zillow.com/professionals/real-estate-agent-reviews/austin-tx/?languages=spanish&isTopAgent=true"
    ],
    "maxAgents": 50,
    "includeReviews": false
}
```

| Field | What it does |
|---|---|
| `locations` | Cities as `City, ST` or 5-digit ZIP codes. Each is searched in Zillow's agent directory, in Zillow's own order. |
| `startUrls` | Agent profile links (`zillow.com/profile/<name>`) or agent directory links (`zillow.com/professionals/real-estate-agent-reviews/<city-st>/`), with or without `https://`. Directory filters in the link (`languages=`, `specialties=`, `isTopAgent=true`) are kept. |
| `maxAgents` | Stops after this many agents for each place or directory link. Default: 50. Zillow shows at most 375 agents (25 pages of 15) for one search. |
| `includeReviews` | Adds the 5 newest reviews to each row. Default: off. It costs nothing extra. |
| `proxyConfiguration` | Optional. Leave it empty: the Actor picks the cheapest route that works by itself (see Tips). |

Give `locations`, `startUrls`, or both.

### Output

Each agent, team or brokerage profile becomes one row. Here is a real row,
with the bio, service areas and review shortened:

```json
{
    "name": "Sarah Schoenfelder",
    "screenName": "sjschoenfelder",
    "profileUrl": "https://www.zillow.com/profile/sjschoenfelder",
    "zuid": "X1-ZU10dsxypp55c09_60bkf",
    "brokerage": "Colorado Property Group by RE/MAX Pinnacle",
    "phone": "(512) 417-6500",
    "brokeragePhone": "(970) 259-2255",
    "officeAddress": "1221 Main Ave",
    "officeCity": "Durango",
    "officeState": "CO",
    "officeZip": "81301",
    "rating": 5,
    "reviewCount": 44,
    "salesLast12Months": 3,
    "totalSales": 103,
    "priceRange": "$210K-$1.8M",
    "priceRangeMin": 210000,
    "priceRangeMax": 1800000,
    "averagePrice": 842000,
    "salesAreTeamTotals": false,
    "activeListings": 1,
    "rentalListings": 0,
    "isTopAgent": true,
    "isTeam": false,
    "teamMembers": null,
    "teamLeadName": "Colorado Property Group",
    "teamLeadProfileUrl": "https://www.zillow.com/profile/ryan68323",
    "serviceAreas": ["Austin, TX", "Durango, CO", "Bayfield, CO", "Silverton, CO"],
    "specialties": ["Buyer's Agent", "Listing Agent", "Relocation", "Staging", "Investment Properties"],
    "languages": ["English", "Spanish"],
    "yearsOfExperience": 21,
    "memberSince": "2015-07-29",
    "licenses": [
        { "number": "100093196", "state": "CO", "type": "agent", "status": "active", "expires": "2027-12-31" },
        { "number": "541783", "state": "TX", "type": "agent", "status": "active", "expires": "2027-09-30" }
    ],
    "bio": "Sarah Schoenfelder was introduced to real estate through the more than 35 investment properties she has remodeled and sold or rented. …",
    "websiteUrl": "http://www.durangohomesforsale.com",
    "facebookUrl": "https://www.facebook.com/sschoenfelder",
    "linkedinUrl": "https://www.linkedin.com/in/sarahschoenfelder/",
    "instagramUrl": null,
    "photoUrl": "https://photos.zillowstatic.com/fp/04768bb94c1a75caec4a55e6d8a8f3dd-h_l.jpg",
    "recentReviews": [
        {
            "rating": 5,
            "date": "2026-01-25",
            "text": "Saying \"Sarah was great!\" is an understatement. …",
            "transaction": "Bought a home in 2026.",
            "subRatings": { "Local knowledge": 5, "Process expertise": 5, "Responsiveness": 5, "Negotiation skills": 5 }
        }
    ],
    "searchInput": "zillow.com/professionals/real-estate-agent-reviews/78704/",
    "scrapedAt": "2026-10-20T13:53:35.606351+00:00"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or
Excel.

### Data fields

| Field | Description |
|---|---|
| `name` | The name on the profile: an agent, a team or a brokerage. |
| `screenName`, `profileUrl`, `zuid` | Zillow's screen name, the profile link and Zillow's encoded user id. |
| `brokerage` | The business name shown on the profile. |
| `phone` | The agent's business number as listed on the profile (Zillow labels it "Cell phone"). |
| `brokeragePhone` | The brokerage's number, when the profile lists one. |
| `officeAddress`, `officeCity`, `officeState`, `officeZip` | The broker's office address. |
| `rating`, `reviewCount` | Average star rating (out of 5) and number of reviews. |
| `salesLast12Months`, `totalSales` | Sales Zillow counts for the profile. |
| `priceRange`, `priceRangeMin`, `priceRangeMax`, `averagePrice` | Price range of those sales, as shown and in US dollars; `null` without recent sales. |
| `salesAreTeamTotals` | `true` when Zillow says the sales numbers cover all team members. |
| `activeListings`, `rentalListings` | Homes currently for sale and for rent on the profile. |
| `isTopAgent` | Zillow's Top Agent badge. |
| `isTeam`, `teamMembers` | Whether the profile leads a team, and how many members it lists. |
| `teamLeadName`, `teamLeadProfileUrl` | For a team member: the team they belong to. |
| `serviceAreas`, `specialties`, `languages` | As listed on the profile. Languages are empty when only English is spoken and the profile lists none. |
| `yearsOfExperience`, `memberSince` | Years in the industry, and the date the profile joined Zillow (`YYYY-MM-DD`). |
| `licenses` | Real estate licenses: `number`, `state`, `type`, `status`, `expires`. |
| `bio` | The "Get to know me" text, as plain text. E-mail addresses typed into it are replaced with `[email removed]`. |
| `websiteUrl`, `facebookUrl`, `linkedinUrl`, `instagramUrl` | The links on the profile. |
| `photoUrl` | Profile photo. |
| `recentReviews` | Only with `includeReviews`: up to 5 newest reviews with `rating`, `date` (`YYYY-MM-DD`), `text`, `transaction` and `subRatings`. Reviewer names are not saved. |
| `searchInput` | The place or link this agent was found through. |
| `scrapedAt` | When the row was saved (UTC). |

A field is `null` when the profile doesn't show it.

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

Zillow Real Estate Agent Scraper uses **pay-per-event** pricing: you pay per
agent saved, plus a tiny fee per run start. See the **Pricing** tab for the
exact price. Places, links and profiles that return nothing are never saved as
rows, so you are not charged for them. If you set a maximum cost for a run,
the Actor stops as soon as it is reached.

The platform usage itself is small: about $0.02 per 100 agents, mostly proxy
traffic. Apify's free plan includes $5 of monthly credit.

### Tips for scraping Zillow agents

- **Leave the proxy empty.** The Actor tries a direct connection, then Apify's
  datacenter proxy, and uses residential proxy only for pages the cheaper
  routes can't load. That keeps cost low, at about 1.5–2 seconds per agent.
- **Need it faster?** Set the proxy to Apify **Residential** (US). Runs then
  take well under a second per agent, but use more proxy traffic.
- **More than 375 agents in a city?** Zillow stops at 25 pages per search.
  Search ZIP codes or add filters (language, specialty, Top Agent) to reach
  more agents. An agent found by several searches is saved only once per run.
- **Track reviews** with a scheduled run and `includeReviews` on your list of
  profile links.

### FAQ, disclaimers and support

**What contact details does it return?** Only the **business contact details
agents publish on their public Zillow profile**: the business phone numbers
listed under "Professional information", the brokerage name and office
address, and the website and social links they added. It does not collect
e-mail addresses, home addresses or anything behind a login, and it does not
save reviewers' names.

**Is it legal to scrape Zillow?** The Actor reads only public pages without
logging in. Agent profiles still contain personal data (names, photos, phone
numbers) protected by laws such as GDPR and the CCPA, and US rules on calls
and texts (TCPA, Do-Not-Call) apply to how you use the numbers. Use the data
for legitimate purposes, check Zillow's terms of use, and ask a lawyer if you
are unsure.

**Why is a place empty?** Zillow found no agents for it. Check the spelling
and use `City, ST` (`Saint Paul, MN`) or a ZIP code. Places and links that
gave nothing are listed with the reason in the **FAILED_INPUTS** record of the
run's key-value store.

**Some profiles are not agents?** Zillow's directory also lists teams and
brokerages. `isTeam`, `teamMembers` and `salesAreTeamTotals` tell them apart.

**Found a problem or need a custom solution?** Open an issue on the
**Issues** tab, and we'll take a look.

# Actor input Schema

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

Cities as "City, ST" (for example Austin, TX) or 5-digit ZIP codes, one per line. Each place is searched in Zillow's agent directory, best-matched agents first.

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

Agent profile links (zillow.com/profile/<name>) or agent directory links (zillow.com/professionals/real-estate-agent-reviews/<city-st>/). Filters you set on Zillow's directory page, such as specialty or language, are kept: set them there and copy the address bar.

## `maxAgents` (type: `integer`):

Stops after this many agents for each place or directory link. Zillow shows at most 25 pages of 15 agents (375) for one search; to go further, search ZIP codes or add filters. Profile links always give one agent each.

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

Adds the agent's 5 newest reviews (rating, date, text, transaction and sub-ratings) to each row. It costs nothing extra: they come from the same page. Reviewer names are not saved.

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

Leave this empty: the Actor connects directly and, if Zillow refuses, retries through Apify's datacenter and then residential proxies on its own. Set a proxy here only to force one.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "startUrls": [
    "https://www.zillow.com/profile/ericbramlett"
  ],
  "maxAgents": 10,
  "includeReviews": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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"
    ],
    "startUrls": [
        "https://www.zillow.com/profile/ericbramlett"
    ],
    "maxAgents": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/zillow-agent-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"],
    "startUrls": ["https://www.zillow.com/profile/ericbramlett"],
    "maxAgents": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/zillow-agent-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"
  ],
  "startUrls": [
    "https://www.zillow.com/profile/ericbramlett"
  ],
  "maxAgents": 10
}' |
apify call mina_safwat/zillow-agent-scraper --silent --output-dataset

```

## MCP server setup

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