# Zillow Agents Leads (`madeingermany/zillow-agents-leads-scraper-ppe`) Actor

Unlock the power of Zillow with automated agent profile scraping. Effortlessly gather key insights and contact data, including emails and phone numbers, from real estate agents.

- **URL**: https://apify.com/madeingermany/zillow-agents-leads-scraper-ppe.md
- **Developed by:** [Made In Germany](https://apify.com/madeingermany) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.90 / 1,000 results

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

## Zillow Agents Leads Scraper (Pay-Per-Event)

A high-performance, production-ready Apify Actor designed to extract verified **Real Estate Agent Leads** from Zillow at scale. Built with Crawlee HTTP-first architecture, it bypasses heavy browser overhead to deliver **maximum extraction speed, 95%+ contact rate coverage, direct phone numbers, verified emails, brokerage data, real estate license IDs, and 12-month transaction volumes**.

***

### 🚀 Key Advantages & Why It Beats Alternatives

| Feature | Zillow Agents Leads Scraper (PPE) | Traditional Browser Scrapers |
| :--- | :--- | :--- |
| **Engine Architecture** | **Pure HTTP Fast-Path** (Next.js state + API extraction) | Heavy Chromium/Puppeteer/Playwright |
| **Speed & Throughput** | **50–100+ agents/minute** | 5–10 agents/minute |
| **Resource Cost** | Minimal RAM (256MB–512MB) | High RAM (2GB–4GB) |
| **Contact Data Extraction** | **Direct Cell Phone, Business Phone & Email** | Often skips emails or phone numbers |
| **Verified Credentials** | Full State License Numbers & Status | Typically missing or partial |
| **Sales Analytics** | 12-Month Sales Volume + Total Lifetime Closings | Only ratings |
| **Monetization** | **Pay-Per-Event (PPE)**: Pay only for results produced | Hourly / per-GB compute bills |

***

### 🎯 Use Cases

- **B2B Lead Generation**: Build laser-targeted lists of high-performing realtors for SaaS tools, photography, transaction coordination, and marketing agencies.
- **Mortgage & Title Recruitment**: Source top-producing real estate teams and agents in any ZIP code or city.
- **Brokerage Expansion**: Identify active local agents with verified production numbers (12-month sales count) for talent acquisition.
- **CRM Enrichment**: Enrich existing real estate contacts with updated cell phones, direct emails, and active license identifiers.

***

### ⚙️ Input Parameters

| Parameter | Type | Required | Default | Description |
| :--- | :--- | :---: | :---: | :--- |
| `startUrls` | Array | No | `["https://www.zillow.com/professionals/real-estate-agent-reviews/90210/"]` | List of Zillow agent directory URLs or direct profile URLs. |
| `searchQuery` | String | No | `"Beverly Hills, CA 90210"` | Target city, ZIP code, or region to automatically generate search target. |
| `maxItems` | Integer | No | `50` | Maximum number of agent leads to collect (up to 50,000). |
| `hasCellOnly` | Boolean | No | `false` | If enabled, only exports agents with a direct cell phone number. |
| `hasEmailOnly` | Boolean | No | `false` | If enabled, only exports agents with an email address on file. |
| `minSalesLast12Months` | Integer | No | `null` | Filters for agents who closed at least this many transactions in the past 12 months. |
| `proxy` | Object | No | `{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }` | Proxy configuration. Residential proxies are recommended for cloud runs. |
| `maxConcurrency` | Integer | No | `10` | Maximum parallel worker threads. |

#### Sample Input JSON

```json
{
  "startUrls": [
    {
      "url": "https://www.zillow.com/professionals/real-estate-agent-reviews/90210/"
    }
  ],
  "searchQuery": "Beverly Hills, CA 90210",
  "maxItems": 50,
  "hasCellOnly": true,
  "hasEmailOnly": false,
  "minSalesLast12Months": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

***

### 📊 Extracted Output Fields

Each dataset record contains rich, clean, structured lead information:

| Field | Type | Description |
| :--- | :--- | :--- |
| `name` | String | Agent's full legal or professional name. |
| `cellPhone` | String | Direct mobile / cell phone number. |
| `businessPhone` | String | Direct office or brokerage phone number. |
| `email` | String | Agent's direct contact email address. |
| `businessName` | String | Real estate brokerage or agency affiliation (e.g. Compass, Keller Williams). |
| `licenseNumber` | String | Official state real estate license number. |
| `salesCountLast12Months` | Number/String | Number of properties sold/closed in the last 12 months. |
| `totalSales` | Number/String | Lifetime career total sales recorded on Zillow. |
| `screenName` | String | Zillow screen name / handle. |
| `profileUrl` | String | Canonical URL to the agent's Zillow profile. |
| `encodedZuid` | String | Zillow internal unique user identifier (ZUID). |
| `isTopAgent` | Boolean | Whether the agent has Premier / Top Agent status. |
| `rating` | Number | Average review rating (e.g. 5.0). |
| `reviewCount` | Number | Total verified client reviews count. |
| `address` | Object | Brokerage business address (`address1`, `city`, `state`, `postalCode`). |
| `serviceAreas` | Array | Geographic areas, cities, and neighborhoods serviced by the agent. |
| `websites` | Array | Links to agent website, Instagram, LinkedIn, Facebook, and YouTube. |
| `memberSince` | String | Date or year the agent joined Zillow. |
| `languages` | Array | Languages spoken by the agent (e.g. English, Spanish). |
| `specialties` | Array | Specialties (e.g. Buyer's Agent, Listing Agent, Relocation, Foreclosure). |
| `scrapedAt` | String | ISO 8601 timestamp of extraction. |

#### Sample Output Record

```json
{
  "name": "Sally Forster Jones",
  "cellPhone": "(310) 579-2200",
  "businessPhone": "(310) 691-7888",
  "email": "showings@sallyforsterjones.com",
  "businessName": "Compass - Beverly Hills",
  "licenseNumber": "00558939",
  "salesCountLast12Months": 66,
  "totalSales": "1,401",
  "screenName": "Sally Forster Jones",
  "profileUrl": "https://www.zillow.com/profile/Sally%20Forster%20Jones",
  "encodedZuid": "X1-ZUz00v1fdntjwp_9mygc",
  "isTopAgent": false,
  "rating": 5,
  "reviewCount": 541,
  "address": {
    "address1": "9454 Wilshire Blvd, 4th Floor",
    "address2": null,
    "city": "Beverly Hills",
    "state": "CA",
    "postalCode": "90212"
  },
  "serviceAreas": [
    "Westchester, Los Angeles, CA",
    "Beverly Hills, CA",
    "Los Angeles, CA",
    "Malibu, CA"
  ],
  "websites": [
    { "text": "Website", "url": "https://forsterjonesintl.com/" },
    { "text": "Facebook", "url": "https://www.facebook.com/sallyforsterjones" },
    { "text": "LinkedIn", "url": "http://www.linkedin.com/in/sallyforsterjones" }
  ],
  "memberSince": "04/20/2007",
  "languages": ["English", "Spanish", "French", "Arabic", "Italian", "Hebrew"],
  "specialties": ["Buyer's agent", "Listing agent", "Relocation", "Foreclosure"],
  "scrapedAt": "2026-09-28T00:41:55.123Z"
}
```

***

### 🏷️ SEO & Discovery Tags

`zillow`, `real-estate`, `agents`, `realtor-leads`, `lead-generation`, `contact-scraper`, `emails`, `phone-numbers`, `brokerage`, `crawlee`, `apify-actor`, `pay-per-event`

# Actor input Schema

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

Zillow agent directory URLs (e.g. by ZIP code or city) or direct agent profile URLs.

## `searchQuery` (type: `string`):

City, ZIP code, or state (e.g. 'Beverly Hills, CA 90210' or 'Miami, FL') if no Start URLs are provided.

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

Maximum number of agent lead records to scrape.

## `proxy` (type: `object`):

Apify Proxy or custom proxies. Recommended: Residential proxies for unblocked access.

## `hasCellOnly` (type: `boolean`):

Only export leads that include a direct cell phone number.

## `hasEmailOnly` (type: `boolean`):

Only export leads that include an email address.

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

Filter agents who have closed at least this many sales in the past 12 months.

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

Maximum concurrent requests. Keep moderate to avoid rate limits.

## `maxRequestRetries` (type: `integer`):

Number of retry attempts for failed requests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.zillow.com/professionals/real-estate-agent-reviews/90210/"
    }
  ],
  "searchQuery": "Beverly Hills, CA 90210",
  "maxItems": 50,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "hasCellOnly": false,
  "hasEmailOnly": false,
  "maxConcurrency": 10,
  "maxRequestRetries": 3
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.zillow.com/professionals/real-estate-agent-reviews/90210/"
        }
    ],
    "searchQuery": "Beverly Hills, CA 90210"
};

// Run the Actor and wait for it to finish
const run = await client.actor("madeingermany/zillow-agents-leads-scraper-ppe").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 = {
    "startUrls": [{ "url": "https://www.zillow.com/professionals/real-estate-agent-reviews/90210/" }],
    "searchQuery": "Beverly Hills, CA 90210",
}

# Run the Actor and wait for it to finish
run = client.actor("madeingermany/zillow-agents-leads-scraper-ppe").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 '{
  "startUrls": [
    {
      "url": "https://www.zillow.com/professionals/real-estate-agent-reviews/90210/"
    }
  ],
  "searchQuery": "Beverly Hills, CA 90210"
}' |
apify call madeingermany/zillow-agents-leads-scraper-ppe --silent --output-dataset

```

## MCP server setup

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

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/8Yn7hXFGah8HEv4jd/builds/vNIV6HrLeAahGfF5R/openapi.json
