Zillow Agents Finder: Lead Scoring & ZIP Search
Pricing
from $5.99 / 1,000 results
Zillow Agents Finder: Lead Scoring & ZIP Search
Zillow Agents Finder extracts real estate agent profiles from Zillow, including agent names, brokerages, phone numbers, ratings, reviews, service areas, profile URLs, and more. Ideal for lead generation, market research, recruitment, and competitive analysis.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
9 hours ago
Last modified
Categories
Share
Zillow Agents Scraper — ZIP Search with Contact-Completeness Score
Zillow Agents Scraper — ZIP Search with Contact-Completeness Score turns a list of cities and ZIP codes into a directory of Zillow real estate agents and mortgage lenders as structured JSON. Each run resolves raw ZIP codes to their Zillow city/state slug, crawls the agent or lender directory, and — for agents — applies a client-side lead-quality filter stack plus a deterministic contact-completeness score over each profile's contact fields. Every response is ready to pass to an LLM, load into a CRM, or feed a lead-generation pipeline.
What is Zillow Agents Finder: Lead Scoring & ZIP Search?
Zillow Agents Finder: Lead Scoring & ZIP Search queries Zillow's real estate agent directory and its mortgage lender directory across one or more cities and ZIP codes in a single run, returning one row per agent or lender as structured JSON. What sets it apart is the deterministic contactCompletenessScore (0-100) computed over each agent's fetched contact fields, plus a client-side lead-quality filter stack (minRating, minReviewCount, minYearsExperience, minSalesVolume, minAvgSaleValue) that drops agents who don't clear your bar before they're billed. No Zillow account or login is required — profile, directory, and mortgage-API pages are read the same way a logged-out visitor's browser would.
- Multi-area search — mix city names and raw 5-digit ZIP codes in the same
searchAreasarray; each ZIP auto-resolves to its Zillow city/state slug - Direct targeting via
agentTargets— full profile URLs,@screenNames, or free-text names, independent of any search area - Lead-quality filter stack —
minRating,minReviewCount,minYearsExperience,minSalesVolume,minAvgSaleValue - Deterministic contact-completeness score (
contactCompletenessScore+contactCompletenessBreakdown) over email/phone/address/business/license presence - Directory-side filters —
specialty(12 slugs),language(24 languages),is_top_agent,is_buying,is_selling - Cross-area dedupe — the same agent found under two search areas is merged into one row with
matchedSearchAreas
What data can you get with Zillow Agents Finder: Lead Scoring & ZIP Search?
The Actor pushes agent and lender rows into a dataset titled "Zillow Scored Profiles," shaped differently depending on leadOperation and fullProfileDetail.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Agent — Overview (default view) | avatar, name, business, location, phone, rating, reviews, searchArea, contactCompletenessScore, screenName, url, id | Quick directory sweep across many search areas |
Agent — Detail & Lead Score (fullProfileDetail: true) | avatar, name, business, screenName, url, rating, reviews, yearsOfExperience, email, phone, phones, address, serviceAreas, licenses, salesStats, searchArea, matchedSearchAreas, contactCompletenessScore, contactCompletenessBreakdown, scrapedAt, id | Lead qualification, CRM enrichment, agent/broker research |
| Mortgage Lender | avatar, name, business, nmlsLicense, phone, email, rating, reviews, languages, specialties, address, screenName, url, scrapedAt, id | Mortgage-lender directory research per city |
Contact-completeness lead score
contactCompletenessScore is a deterministic, weighted-presence score (0-100) — not a sales-activity or review-based quality score. It sums fixed weights for which contact fields are actually present on the fetched profile: 25 points each for email and phone, 20 for address, 15 each for business and a real-estate license. It is computed only in Full Profile Detail mode; compact directory cards never fetch email, address, or license data, so the score stays null there instead of a misleadingly low number for a field that was never requested. It is deliberately separate from the lead-quality filter stack (minRating, minReviewCount, minYearsExperience, minSalesVolume, minAvgSaleValue) — those filters drop agents on rating or sales history, while this score only measures how reachable the agents who survive that filter actually are. Read it alongside contactCompletenessBreakdown to see which fields were missing before you commit outreach time:
{"contactCompletenessScore": 75,"contactCompletenessBreakdown": {"email": true,"phone": true,"address": false,"business": true,"license": false}}
Use it to rank an already-filtered lead list by how reachable each agent actually is, separately from their rating or sales record.
Mortgage lender profiles
The lender pipeline runs unchanged alongside the agent pipeline — set leadOperation: "lenders" to query Zillow's mortgage lender directory instead. It talks directly to Zillow's public mortgageapi.zillow.com RPC endpoints (getLenderDirectoryListings, getRegisteredLender) using the public partner ID Zillow's own lender pages ship with, and returns NMLS license numbers, ratings, and contact fields. Use lender_fields to trim each record down to only the fields you need. Lender records never carry contactCompletenessScore — the scoring layer applies to agents only.
Why not build this yourself?
Zillow retired public third-party access to its Search and GetDeepSearchResults API for most public use around 2021, so there's no supported official endpoint left to query its agent or lender directories programmatically. Building your own scraper means reverse-engineering Zillow's __NEXT_DATA__ payload shape (which changes without notice and varies between the agent-profile and lender-directory pages), handling the mortgage API's RPC-style POST endpoints separately from the HTML-rendered agent pages, resolving raw ZIP codes into the city/state slugs the directory crawl actually expects, and building a proxy-escalation ladder that survives a block mid-run — all before writing any lead-quality filtering or scoring logic on top. Zillow Agents Finder: Lead Scoring & ZIP Search already handles ZIP resolution, a direct → Apify datacenter → Apify residential proxy ladder that escalates automatically on a 403/429/captcha response, and the deterministic scoring layer, configured through input fields instead of maintained scraper code.
How to scrape Zillow with Zillow Agents Finder: Lead Scoring & ZIP Search?
No input field is required — every parameter in the schema is optional, and a default run (a single prefilled search area) returns results with no configuration at all.
- Open the Actor's Apify Store listing (
scrapier/zillow-agents-finder-lead-scoring-zip-search) and go to the Input tab. - Add one or more cities and/or raw 5-digit ZIP codes to
searchAreas(e.g.["New York, NY", "10001"]), or add directagentTargets(profile URLs,@screenNames, or names) instead. - Set the query controls that matter:
leadOperation(agents or lenders),specialty,language,is_top_agent/is_buying/is_selling, and the lead-quality filters (minRating,minReviewCount,minYearsExperience,minSalesVolume,minAvgSaleValue). - Start the run.
- Read results from the Dataset tab, or export as JSON, CSV, or Excel.
{"leadOperation": "agents","searchAreas": ["New York, NY", "10001", "Beverly Hills, CA", "90210"],"maxRecords": 25,"fullProfileDetail": true,"minRating": 4.5,"minReviewCount": 10}
How to search multiple cities and ZIP codes in one job
searchAreas accepts an array — mix full city names ("New York, NY") and raw 5-digit ZIP codes ("10001") freely in the same run. Each ZIP is resolved to its Zillow city/state slug before the directory crawl runs, and the resolution is cached for the run, so a repeated ZIP only costs one lookup. Every area is crawled in turn with a short randomized pause between requests. When dedupeAcrossAreas is on (default), an agent found under two nearby areas is pushed once with a matchedSearchAreas list instead of twice.
⬇️ Input
All 20 input fields are optional (required: [] in the schema); leave everything blank and the Actor still runs against its prefilled search area.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
agentTargets | No | array | Bulk profile URLs / @screenNames / free-text names. Leave empty for a pure area-based discovery crawl. Also accepts the base actor's urls key. | ["https://www.zillow.com/profile/REMAX EDGE"] |
leadOperation | No | string | Which Zillow directory to target: agents or lenders. Also accepts the base actor's operation key. | "agents" |
searchAreas | No | array | One or more cities and/or raw 5-digit ZIP codes, mixed freely. Also accepts the base actor's single location string. | ["New York, NY", "10001"] |
maxRecords | No | integer | Max profiles returned across ALL search areas combined. 0 = unlimited. Also accepts the base actor's limit key. | 20 |
fullProfileDetail | No | boolean | Fetch the full profile (sales stats, licenses, years of experience, email, phones, address) vs. the compact card. Also accepts the base actor's agent_detail_info key. | true |
specialty | No | string | Single specialty slug applied inside every search area (12 options, e.g. luxury-homes, foreclosure). | "luxury-homes" |
language | No | string | Single language filter applied inside every search area (24 options). | "spanish" |
is_top_agent | No | boolean | Filter to Zillow-flagged top agents (agents only). | false |
is_buying | No | boolean | Filter to agents who focus on buyers (agents only). | false |
is_selling | No | boolean | Filter to agents who focus on sellers (agents only). | false |
minRating | No | number | Drop agents with rating below this value (0-5). 0 = no filter. | 4.5 |
minReviewCount | No | integer | Drop agents with fewer than this many reviews (reviews.count). 0 = no filter. | 10 |
minYearsExperience | No | integer | Drop agents with fewer than this many years in the industry (yearsOfExperience). Auto-enables fullProfileDetail. | 5 |
minSalesVolume | No | integer | Drop agents with fewer than this many career sales (salesStats.countAllTime). Auto-enables fullProfileDetail. | 50 |
minAvgSaleValue | No | integer | Drop agents whose 3-year average sale value (salesStats.averageValueThreeYear) is below this dollar amount. Auto-enables fullProfileDetail. | 500000 |
computeLeadScore | No | boolean | Add contactCompletenessScore (0-100) + contactCompletenessBreakdown to every agent record. Stays null in compact mode. | true |
dedupeAcrossAreas | No | boolean | Merge the same agent found under 2+ search areas into one row with matchedSearchAreas. | true |
sort_lenders | No | string | Lender directory sort order: relevance, location, or rating (lenders only). | "relevance" |
lender_fields | No | array | Field allowlist for lender records. Leave empty to return every field. | ["companyName", "phone", "rating"] |
proxyConfiguration | No | object | Proxy override. Default sends no proxy and auto-escalates to Apify datacenter, then residential, on a block. | {"useApifyProxy": false} |
Example JSON input
{"leadOperation": "agents","searchAreas": ["New York, NY", "10001", "Beverly Hills, CA", "90210"],"agentTargets": [],"maxRecords": 25,"fullProfileDetail": true,"specialty": "luxury-homes","language": "","is_top_agent": true,"is_buying": false,"is_selling": true,"minRating": 4.5,"minReviewCount": 10,"minYearsExperience": 5,"minSalesVolume": 50,"minAvgSaleValue": 500000,"computeLeadScore": true,"dedupeAcrossAreas": true,"sort_lenders": "relevance","lender_fields": [],"proxyConfiguration": { "useApifyProxy": false }}
Common pitfall: specialty and language each accept only a single slug, not an array — pass one value per run rather than a comma-separated list. To cover multiple specialties or languages, run the Actor once per value.
⬆️ Output
Results are typed, normalized JSON pushed to a dataset titled "Zillow Scored Profiles," exportable as JSON, CSV, or Excel from the Dataset tab. Each pushed row is billed under the row_result charged event; agents dropped by a lead-quality filter, and profiles whose fetch failed or was blocked, are never pushed and never charged.
Scraped results
[{"id": "X1-ZUzxung5m0nhd9_7wooa","name": "Jordan Reyes","screenName": "Jordan Reyes","url": "https://www.zillow.com/profile/Jordan%20Reyes","avatar": "https://photos.zillowstatic.com/fp/agent-jordan-reyes.jpg","business": "Reyes Realty Group","rating": 4.9,"yearsOfExperience": 12,"reviews": { "count": 187 },"serviceAreas": [{ "name": "Beverly Hills, CA", "url": "/homes/Beverly-Hills-CA/" }],"email": "jordan@reyesrealty.example.com","phone": "(310) 555-0142","phones": { "cell": "(310) 555-0142", "brokerage": "(310) 555-0100", "business": null },"address": { "line1": "123 Rodeo Dr", "line2": null, "city": "Beverly Hills", "state": "CA", "postalCode": "90210", "full": "Reyes Realty Group, 123 Rodeo Dr, Beverly Hills, CA 90210" },"licenses": { "Real estate licenses": [{ "License No.": "01923847", "issued by": "CA", "status": "Active", "expiration": "2027-06-30" }], "otherLicenses": [] },"salesStats": { "countAllTime": 214, "countLastYear": 31, "priceRangeThreeYearMin": 620000, "priceRangeThreeYearMax": 8900000, "averageValueThreeYear": 1750000, "statsIncludeTeam": false, "pastSalesTotal": 214 },"aboutMe": "Luxury and relocation specialist serving Beverly Hills and the Westside.","languagesSpoken": ["English", "Spanish"],"specialties": ["Luxury homes", "Relocation"],"title": "Broker Associate","forSaleListingsSummary": { "total": 6, "previewCount": 5, "items": [] },"forRentListingsSummary": { "total": 0, "previewCount": 0, "items": [] },"soldListingsSummary": { "total": 214, "previewCount": 5, "items": [] },"searchArea": "90210","matchedSearchAreas": ["90210", "Beverly Hills, CA"],"contactCompletenessScore": 100,"contactCompletenessBreakdown": { "email": true, "phone": true, "address": true, "business": true, "license": true },"scrapedAt": "2026-07-25T14:02:11Z"},{"avatar": "https://photos.zillowstatic.com/fp/agent-priya-chandra.jpg","business": "NY Metro Realty","id": "X1-ZUabcdefg123","location": null,"name": "Priya Chandra","phone": null,"rating": 4.8,"reviews": { "count": 63 },"screenName": "Priya Chandra","url": "https://www.zillow.com/profile/Priya%20Chandra","searchArea": "New York, NY","matchedSearchAreas": ["New York, NY"],"contactCompletenessScore": null,"contactCompletenessBreakdown": {},"scrapedAt": "2026-07-25T14:02:09Z"},{"id": "X1-ZUlender456","name": "Morgan Lee","screenName": "Morgan Lee","url": "https://www.zillow.com/lender-profile/Morgan%20Lee","avatar": "https://mortgageapi.zillow.com/getLenderProfileImage?lenderId=X1-ZUlender456&imageId=img001","business": "Lee Home Loans","nmlsLicense": "1234567","phone": "(212) 555-0199","email": "morgan@leehomeloans.example.com","address": { "line1": "500 5th Ave", "city": "New York", "state": "NY", "postalCode": "10110" },"rating": 4.95,"reviews": { "count": 342 },"languages": ["English"],"specialties": [],"nmlsType": "individual","confirmedReviews": 300,"recentReviews": 12,"totalReviews": 342,"scrapedAt": "2026-07-25T14:03:00Z"}]
How can I use the data extracted with Zillow Agents Finder: Lead Scoring & ZIP Search?
- Real estate lead generation teams: filter by
minRating,minReviewCount, andminSalesVolume, then rank the survivors bycontactCompletenessScoreto build a call list of established, reachable agents across a metro's ZIP footprint. - Agent and broker research / recruiting: crawl a metro's full agent directory across cities and ZIPs at once, comparing
salesStats.countAllTimeandsalesStats.averageValueThreeYearto identify recruiting targets. - AI engineers and LLM developers: an agent issues a
searchAreas+ filter query, receives this Actor's structured JSON back, and grounds a lead-qualification or CRM-enrichment answer in live data instead of stale training data. - Market analytics teams: aggregate
rating,reviews.count,specialties, andsalesStatsacross search areas to measure agent density, specialty coverage, and price-tier concentration market by market.
How do you monitor lead scores and agent quality over time?
Lead-quality monitoring means re-running the same search areas on a schedule and comparing the new rows to the previous run, rather than trusting a single snapshot to still hold true next month — a directory listing changes as agents update their profile, collect new reviews, or close more sales. Because each run returns rows keyed by screenName/id, repeated runs let you diff rating, reviews.count, contactCompletenessScore, yearsOfExperience, and salesStats.countAllTime/averageValueThreeYear for the same agent between runs. A meaningful change is an agent whose contactCompletenessScore rises (they've added contact info and become reachable), whose rating or reviews.count moves past a threshold you care about, whose salesStats.countAllTime jumps enough to signal a hot streak worth recruiting or partnering with, or whose matchedSearchAreas grows to cover a new ZIP code you're tracking.
A basic workflow: schedule this Actor against a fixed searchAreas list (one entry per ZIP or city you track), store each run's dataset rows keyed by id and scrapedAt in your own database or warehouse, then compare the newest run's rows against the previous run's rows for the same agents and alert whenever a diff crosses a threshold you define — a lead becoming reachable, a rating drop worth investigating, or a sales-volume jump worth a recruiting call. Apify's platform-level Schedule feature can trigger the Actor on a fixed interval without any code of your own, and the Apify API's dataset endpoints or run-finished webhooks can deliver each run's results straight into your own pipeline for the diffing step.
Integrate Zillow Agents Finder: Lead Scoring & ZIP Search and automate your workflow
Zillow Agents Finder: Lead Scoring & ZIP Search works with any language or tool that can send an HTTP request.
REST API with Python
import requestsTOKEN = "<YOUR_APIFY_TOKEN>"url = "https://api.apify.com/v2/acts/scrapier~zillow-agents-finder-lead-scoring-zip-search/run-sync-get-dataset-items"payload = {"leadOperation": "agents","searchAreas": ["New York, NY", "10001"],"minRating": 4.5,"fullProfileDetail": True,}resp = requests.post(url, params={"token": TOKEN}, json=payload, timeout=180)agents = resp.json() # list of agent rows, as shown abovefor a in agents:print(a["name"], a["rating"], a["contactCompletenessScore"])
MCP for query-grounded AI agents
The Actor is reachable through Apify's Actors MCP Server: run npx @apify/actors-mcp-server --tools scrapier/zillow-agents-finder-lead-scoring-zip-search locally with an APIFY_TOKEN set, or connect the hosted server at https://mcp.apify.com. Register it with an MCP-compatible client — Claude Desktop, Claude Code, or Cursor — and an agent can call it as a tool: a user asks for agents in a ZIP code, the agent runs the search, and grounds its answer in the returned rating and score fields.
Scheduled monitoring and delivery
There is no actor-specific webhook built into this Actor. Attach it to Apify's platform-level Schedule to trigger runs on an interval, and use the Apify API's run-finished webhooks or dataset export endpoints to deliver each run's rows into your own storage or pipeline.
Is it legal to scrape Zillow agent data?
Yes — scraping publicly accessible Zillow agent and lender directory pages is generally lawful when it targets data any visitor can already see without logging in or bypassing an access control. Courts have held that accessing data a site makes available to the public, without circumventing a technical barrier, does not violate the Computer Fraud and Abuse Act (hiQ Labs, Inc. v. LinkedIn Corp., 9th Cir., 2019). The names, phone numbers, and email addresses this Actor returns are the business contact information agents and loan officers publish specifically so buyers and sellers can reach them — not private personal data. That said, Zillow's own Terms of Service restrict automated collection, so recurring commercial use should be checked against those terms, and bulk storage of contact details may trigger CCPA/GDPR obligations depending on your jurisdiction. Consult your legal team for commercial use cases involving bulk data storage or resale.
Frequently asked questions
Which cities and ZIP codes can this Actor search?
Any US city Zillow recognizes (e.g. "New York, NY") plus any raw 5-digit ZIP code, mixed freely inside the same searchAreas array — ZIPs are auto-resolved to their Zillow city/state slug before the crawl runs.
Can I filter by specialty, language, or buyer/seller focus?
Yes. specialty accepts one of 12 slugs (e.g. luxury-homes, foreclosure), language accepts one of 24 languages, and is_top_agent/is_buying/is_selling are boolean directory flags — all applied inside every search area, agents pipeline only.
How does this Actor handle Zillow's anti-bot measures?
It detects Zillow's captcha/PerimeterX interstitials and blocked responses (HTTP 403/429/5xx, or a page missing its __NEXT_DATA__ payload) and escalates automatically through a direct → Apify datacenter → Apify residential proxy ladder, with 3 retries on the residential tier, sticking to whichever tier last worked for the rest of the run.
How is the contact-completeness lead score actually calculated?
It's a deterministic weighted-presence check, not an activity or sales-based quality score: 25 points each for a present email and phone, 20 for a business address, 15 each for a business name and a real-estate license, summed to 0-100. It only runs in Full Profile Detail mode — compact directory cards never carry email/address/license data, so the score stays null there rather than showing a misleadingly low number.
How many results does this Actor return per query?
maxRecords caps total profiles across all search areas combined (default 20, maximum 10000, 0 = unlimited). When lead-quality filters are active, the Actor over-fetches candidates internally so dropped agents don't starve the count — but hitting the exact requested number is best-effort, not guaranteed.
Do the lead-quality filters require Full Profile Detail?
minYearsExperience, minSalesVolume, and minAvgSaleValue need fields (yearsOfExperience, salesStats) that only exist in full-detail mode — the Actor auto-enables fullProfileDetail for you when any of these three is set, and logs that it did so.
How do I monitor an agent's rating or lead score over time?
Schedule this Actor against the same searchAreas list, store each run's rows keyed by id/screenName, and diff rating, reviews.count, contactCompletenessScore, and salesStats.countAllTime between runs to catch a rating change, a new review milestone, or a lead becoming reachable.
Does this Actor work with Claude, ChatGPT, and AI agent frameworks?
Yes — it's callable as a plain HTTP endpoint by any agent framework, and it's reachable through Apify's Actors MCP Server (npx @apify/actors-mcp-server --tools scrapier/zillow-agents-finder-lead-scoring-zip-search, or the hosted https://mcp.apify.com) for MCP-native clients like Claude Desktop and Claude Code.
Can I use this Actor without managing proxies or a Zillow account?
Yes. No Zillow account or login is required — profile, directory, and mortgage-API pages are read the same way a logged-out visitor's browser would. Proxy handling is automatic (no proxy → Apify datacenter → Apify residential on a block); you can also pin proxyConfiguration yourself.
Is the mortgage-lender search affected by the lead-scoring features?
No — leadOperation: "lenders" runs the same lender-directory pipeline regardless of the lead-quality filters or computeLeadScore. Those apply to the agents pipeline only, and lender records never carry a contactCompletenessScore.
Your feedback
Found a bug, a missing field, or a record that doesn't match what's documented here? Let Scrapier know through the Actor's Issues tab on Apify Store — reports like this go straight into fixing the extractor.