๐ ๐๏ธ Zillow Agents Finder & Listings Scraper
Pricing
from $3.99 / 1,000 results
๐ ๐๏ธ Zillow Agents Finder & Listings Scraper
๐ ๐๏ธ Zillow Agents Finder & Listings Scraper Extract real estate agents and mortgage lenders from Zillow at scale โ by URL, screen name, or location-based directory search.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScrapeFlow
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Zillow Agent Scraper โ Profiles, Listings and Sold History
Zillow Agent Scraper extracts real estate agent and mortgage lender profiles โ name, business, rating, and review count โ plus each agent's active for-sale/rental listings and itemized sold-listing history, linked as child records at zero extra requests. Every result ships as structured, typed JSON ready for a spreadsheet, CRM, or pipeline. No Zillow account or login is required. Start a run from the Actor's Apify Store page to see agent, listing, and sales data fill your dataset.
What is Zillow Agent Scraper?
Zillow Agent Scraper is an Apify Actor that pulls real estate agent and mortgage lender profiles from Zillow.com โ by direct profile URL, @screenName, agent name, or a location-based directory search โ and returns each agent's active listings and sold-sale history as linked JSON records. It runs against Zillow's public profile/directory pages and the public mortgage-lender API; no Zillow account, login, or API key is required. It's built for real estate lead-generation teams, PropTech and CRM developers, and market analysts who need agent, lender, and listing data without manually browsing Zillow.
What data can I extract with Zillow Agent Scraper?
Zillow Agent Scraper returns agent and lender identity/contact fields, plus (for agents) linked active-listing, for-rent, and sold-sale child records with a derived price tier. Fields below are pulled directly from the row-building functions in src/profile_extract.py, src/lender_api.py, and src/main.py โ compact (card-only) agent records return a smaller subset than full-detail records, noted where it applies.
Agent & lender profile fields
| Field Name | Description |
|---|---|
id | Unique Zillow agent/lender ID (encodedZuid) |
name | Agent or lender display name |
screenName | Zillow profile slug used to rebuild the profile URL |
url | Full Zillow profile URL |
avatar | Profile photo URL |
business | Brokerage or lending company name |
location | City, state (compact/card-mode agent records only) |
phone | Primary phone (agents: cell/business/brokerage; lenders: cell/office) |
phones | Full phone breakdown {cell, brokerage, business} (full-detail agent records only) |
email | Agent or lender email address |
address | Business address object {line1, line2, city, state, postalCode, full} |
serviceAreas | Array of {name, url} areas the agent serves (full-detail agent records only) |
licenses | Object: {"Real estate licenses": [...], "otherLicenses": [...]} (full-detail agent records only) |
aboutMe | Agent or lender bio text |
languagesSpoken / languages | Languages the agent or lender speaks |
specialties | Specialty tags (e.g. luxury homes, relocation) |
title | Professional title (e.g. REALTORยฎ) |
nmlsLicense / nmlsType / stateLicenses / stateSponsorships | Lender licensing fields (lenders only) |
rating | Average review rating (parsed live from page HTML when present) |
reviews | {count} object โ total review count |
confirmedReviews / recentReviews / totalReviews | Lender review-count breakdown (lenders only) |
scrapedAt | ISO timestamp of when the record was scraped |
Listings, sold-sales and analytics fields
| Field Name | Description |
|---|---|
forSaleListingsSummary / forRentListingsSummary | {total, previewCount} attached to the agent's own record |
soldListingsSummary | {total, previewCount} attached to the agent's own record |
priceTier | Derived entry / mid / upper / luxury classification |
salesStats | Object: countAllTime, countLastYear, priceRangeThreeYearMin/Max, averageValueThreeYear, statsIncludeTeam, pastSalesTotal |
type / isChild / parentId / parentScreenName | Linkage fields present only on listing/sold-listing child rows |
zpid | Zillow property ID |
listingCategory | forSale or forRent (active listing child rows) |
homeType / homeMarketingStatus / homeMarketingType | Property type/status (active listing child rows) |
bedrooms / bathrooms | Bed/bath counts |
price / priceCurrency | Active listing price and currency |
status | Listing status (e.g. FOR_SALE) |
brokerageName | Brokerage marketing the active listing |
photo | Primary photo URL |
hasOpenHouse / hasVrModel | Boolean flags (active listing child rows) |
listingUrl | Full URL to the listing or sold-sale detail page |
soldDate / soldDateRaw | Parsed ISO date / raw Zillow date string (sold-listing child rows) |
soldPrice / soldPriceRaw | Parsed numeric price / raw formatted price (sold-listing child rows) |
livingAreaValue / livingAreaUnits | Square footage and unit (sold-listing child rows) |
representedRole / representedList | Buyer/Seller side the agent represented (sold-listing child rows) |
๐ค Add-on: Need additional real estate data?
Need the properties themselves, not just the agents selling them? Scraper-Engine's Zillow Search Scraper: Price History Tracking (zillow-search-scraper-price-history-tracking) searches Zillow listings by URL, ZIP, or city and can pull each property's full price-history and tax-assessment timeline โ a natural pairing when you want both the agent roster for a market and the listings themselves.
Why not build this yourself?
Zillow does not publish a general-purpose public API for agent, lender, or listing data โ its old Search/GetDeepSearchResults API was retired from public use around 2021, and today's profile and directory pages are protected by PerimeterX bot-detection that fingerprints TLS handshakes, headers, and browsing behavior. Building this yourself means reverse-engineering Zillow's __NEXT_DATA__ payloads and the mortgage-lender JSON API, keeping a TLS-impersonation layer in sync every time Zillow updates its anti-bot stack, and paying for a residential proxy pool to survive the resulting IP bans. Zillow Agent Scraper already does this: it ships a 3-tier proxy ladder (direct โ Apify Datacenter โ Apify Residential), TLS fingerprint matching, and block detection tuned to Zillow's current PerimeterX behavior, so a single Actor run replaces that ongoing maintenance work. Build your own scraper only if you need custom parsing logic Zillow's page structure doesn't already expose; use this Actor when you want agent, lender, and listing data today without maintaining scraping infrastructure yourself.
How to use Zillow Agent Scraper
Zillow Agent Scraper runs entirely inside Apify โ there's no separate signup, API key, or Zillow account to configure.
- Open the Actor's page in the Apify Store and click Run, or clone it into your own Apify account.
- Provide input: add one or more targets to
agentTargets(a profile URL,@screenName, or agent/lender name), or setmarketto a city/state to run a directory crawl instead. - Set
dataModetoagentsorlenders, and toggleincludeActiveListings/includeSoldListingsif you want listing data alongside each agent record. - Click Start and watch results push to the dataset live, one agent or lender at a time.
- Download results as JSON, CSV, Excel, or another supported format from the run's dataset tab, or pull them via the Apify API.
How to scale to bulk Zillow agent extraction
agentTargets accepts a stringList array, so pasting hundreds of profile URLs, @screenNames, or agent names into one run works without writing any code. For pure directory crawling, raise maxRecords (up to 10,000) with market set and no listed targets โ the Actor paginates the directory itself until that cap is hit or results run out. There's no separate bulk-upload file format; the array input is the bulk mechanism.
What can you do with Zillow agent data?
- A real-estate lead-gen manager building a market roster uses
name,business,phone, andemailfrom full-detail agent records to build a cold-outreach list of every agent active in a target city. - A brokerage recruiter evaluating agents uses
salesStats.pastSalesTotal,rating, andreviews.countalongside the itemizedsoldListingsSummarychild rows to see which agents are actually closing deals, not just holding a license. - A PropTech developer building an agent-directory app uses
serviceAreas,specialties, andlanguagesSpokento power a filterable agent-matching feature for homebuyers. - A mortgage marketing team targeting loan officers uses
nmlsLicense,companyName, andstateLicensesfrom lender records to verify licensing before partnership outreach. - An AI agent or RAG pipeline ingests
aboutMe,specialties, andsoldListingsSummaryas structured context to auto-draft a personalized outreach email or answer "which agents in Austin specialize in luxury homes" โ no HTML parsing required.
How does Zillow Agent Scraper handle rate limits and blocking?
The Actor starts direct (no proxy) and escalates only when Zillow pushes back, moving through direct โ Apify Datacenter โ Apify Residential proxy tiers, with 3 retry attempts on Residential. Each tier mints one sticky-session exit IP for the whole run, because Zillow's PerimeterX cookies are bound to the IP that received them โ rotating per request would invalidate them. Requests use curl_cffi's chrome131 TLS impersonation profile with matching Chrome headers, so the TLS handshake and User-Agent stay consistent.
A response counts as blocked on HTTP 403/429, any 5xx, a PerimeterX/CAPTCHA fingerprint, or a profile/directory page missing its expected __NEXT_DATA__ payload. On block, the Actor mints a fresh exit IP, backs off exponentially with jitter, retries, then escalates to the next proxy tier once that tier's retries are exhausted. Successful requests are also spaced with a randomized 1.2โ2.8s delay. The Actor does not solve CAPTCHAs โ once the residential tier is exhausted, that one target is skipped and logged, and the run continues with the rest.
โฌ๏ธ Input
All 17 input parameters are optional โ the Actor needs either at least one agentTargets entry or a market value to know what to scrape, but nothing is schema-required.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
agentTargets | No | array | Bulk list โ profile URLs, @screenName tokens, or free-text agent/lender names. Leave empty for a pure location crawl. | ["@REMAX EDGE", "Jordan Ramirez"] |
dataMode | No | string | agents (real estate agents + listings) or lenders (mortgage lenders). Default agents. | "agents" |
market | No | string | City/state geo seed for directory search. Required unless every target is a direct URL/@name. | "Austin, TX" |
maxRecords | No | integer | Max agent/lender records returned across all queries (0 = unlimited, max 10,000). | 25 |
includeFullAgentProfile | No | boolean | Return the full agent profile instead of the compact card shape. Default false. | true |
specialtyFocus | No | string | Single specialty filter for the agents directory (12 options, e.g. luxury homes, foreclosure). | "luxury-homes" |
languageSpoken | No | string | Single language filter (24 options). | "spanish" |
topAgentsOnly | No | boolean | Filter to Zillow-flagged top agents (agents only). Default false. | true |
buyerSpecialist | No | boolean | Filter to agents who focus on buyers (agents only). Default false. | false |
sellerSpecialist | No | boolean | Filter to agents who focus on sellers (agents only). Default false. | true |
includeActiveListings | No | boolean | Emit each agent's active for-sale/rental listings as linked child rows. Default true. | true |
includeSoldListings | No | boolean | Emit each agent's itemized sold/closed listings as linked child rows. Default true. | true |
maxListingsPerAgent | No | integer | Cap on listing/sold-listing child rows per agent per category (0 = keep every item Zillow embeds, in practice up to 5). | 10 |
computeSalesAnalytics | No | boolean | Add a derived priceTier field to full-detail agent records. Default true. | true |
lenderSortOrder | No | string | Sort order for the lender directory (lenders only): relevance, location, or rating. | "rating" |
lenderFieldsToInclude | No | array | Field allowlist for lender records. Leave empty to return every field. | ["companyName", "nmlsType", "rating"] |
proxySettings | No | object | Apify proxy configuration. Defaults to no proxy, auto-escalating to Datacenter โ Residential on block. | {"useApifyProxy": true} |
Example input
{"agentTargets": ["https://www.zillow.com/profile/REMAX EDGE", "@century21-realty-experts"],"dataMode": "agents","market": "Austin, TX","maxRecords": 25,"includeFullAgentProfile": true,"specialtyFocus": "luxury-homes","languageSpoken": "spanish","topAgentsOnly": true,"buyerSpecialist": false,"sellerSpecialist": true,"includeActiveListings": true,"includeSoldListings": true,"maxListingsPerAgent": 10,"computeSalesAnalytics": true,"lenderSortOrder": "rating","lenderFieldsToInclude": ["companyName", "nmlsType", "rating", "totalReviews"],"proxySettings": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
โฌ๏ธ Output
Every record is typed, normalized JSON with a stable field set across runs. Agent/lender parent records are billed under the row_result event; the linked active-listing and sold-listing child rows ride along in the same dataset uncharged. Export the dataset as JSON, CSV, Excel, HTML table, or RSS from the run's dataset tab, or fetch it via the Apify API/SDK. Child rows carry isChild: true โ filter them out client-side (e.g. [r for r in items if not r.get("isChild")]) if you only want the billed agent/lender rows.
Example output
Full-detail agent record:
{"id": "X1-ZUzc9pf5qjqjqj_8xxxx","name": "Jordan Ramirez","screenName": "Jordan Ramirez","url": "https://www.zillow.com/profile/Jordan%20Ramirez","avatar": "https://photos.zillowstatic.com/fp/abc123-p_e.jpg","business": "RE/MAX Capital City","rating": 4.9,"yearsOfExperience": 12,"reviews": { "count": 187 },"serviceAreas": [{ "name": "Austin, TX", "url": "https://www.zillow.com/austin-tx/" }],"email": "jordan.ramirez@remax-example.com","phone": "(512) 555-0142","phones": { "cell": "(512) 555-0142", "brokerage": "(512) 555-0100", "business": null },"address": {"line1": "500 Congress Ave","line2": "Suite 200","city": "Austin","state": "TX","postalCode": "78701","full": "RE/MAX Capital City, 500 Congress Ave, Austin, TX 78701"},"licenses": {"Real estate licenses": [{ "License No.": "678910", "issued by": "TX", "status": "Active", "expiration": "2027-05-01" }],"otherLicenses": []},"salesStats": {"countAllTime": null,"countLastYear": null,"priceRangeThreeYearMin": null,"priceRangeThreeYearMax": null,"averageValueThreeYear": null,"statsIncludeTeam": false,"pastSalesTotal": 96},"aboutMe": "Helping Austin buyers and sellers find their next home for over a decade.","languagesSpoken": ["English", "Spanish"],"specialties": ["Luxury homes", "Relocation"],"title": "REALTORยฎ","forSaleListingsSummary": { "total": 14, "previewCount": 5 },"forRentListingsSummary": { "total": 2, "previewCount": 2 },"soldListingsSummary": { "total": 96, "previewCount": 5 },"priceTier": "upper","scrapedAt": "2026-07-25T14:02:11Z"}
Linked active-listing child row:
{"type": "forSaleListing","isChild": true,"parentId": "X1-ZUzc9pf5qjqjqj_8xxxx","parentScreenName": "Jordan Ramirez","listingCategory": "forSale","zpid": "29384756","homeType": "SINGLE_FAMILY","address": { "line1": "1204 Oak Bend Dr", "line2": null, "city": "Austin", "state": "TX", "postalCode": "78745" },"bedrooms": 4,"bathrooms": 3,"price": 685000,"priceCurrency": "USD","status": "FOR_SALE","homeMarketingStatus": "ForSale","homeMarketingType": "ForSale","brokerageName": "RE/MAX Capital City","photo": "https://photos.zillowstatic.com/fp/def456-p_e.jpg","hasOpenHouse": false,"hasVrModel": false,"listingUrl": "https://www.zillow.com/homedetails/1204-Oak-Bend-Dr-Austin-TX-78745/29384756_zpid/","scrapedAt": "2026-07-25T14:02:11Z"}
Linked sold-listing child row:
{"type": "soldListing","isChild": true,"parentId": "X1-ZUzc9pf5qjqjqj_8xxxx","parentScreenName": "Jordan Ramirez","zpid": "18827364","address": { "street": "889 Riverside Dr", "cityStateZip": "Austin, TX 78704", "city": "Austin", "state": "TX" },"soldDate": "2026-03-14T00:00:00Z","soldDateRaw": "03/14/2026","soldPrice": 542000,"soldPriceRaw": "$542,000","bedrooms": 3,"bathrooms": 2,"livingAreaValue": 1840,"livingAreaUnits": "sqft","representedRole": "Seller","representedList": ["Seller"],"photo": "https://photos.zillowstatic.com/fp/ghi789-p_e.jpg","listingUrl": "https://www.zillow.com/homedetails/889-Riverside-Dr-Austin-TX-78704/18827364_zpid/","scrapedAt": "2026-07-25T14:02:11Z"}
Lender record:
{"id": "L9-ZUabc123","name": "Morgan Blake","screenName": "Morgan Blake","url": "https://www.zillow.com/lender-profile/Morgan%20Blake","avatar": "https://mortgageapi.zillow.com/getLenderProfileImage?lenderId=L9-ZUabc123&imageId=img1","business": "Capital City Home Loans","nmlsLicense": "1122334","phone": "(512) 555-0199","email": "morgan.blake@cchl-example.com","address": { "line1": "700 Brazos St", "city": "Austin", "state": "TX", "postalCode": "78701" },"rating": 4.8,"reviews": { "count": 63 },"languages": ["English"],"specialties": [],"nmlsType": "Individual","confirmedReviews": 61,"recentReviews": 12,"totalReviews": 63,"scrapedAt": "2026-07-25T14:02:11Z"}
How does it work?
Zillow Agent Scraper sends requests through curl_cffi with a Chrome TLS fingerprint (chrome131) so its handshake matches a real browser, routed through a sticky proxy session that starts direct and escalates to Apify Datacenter or Residential proxies only if Zillow's PerimeterX protection pushes back. For agents, it loads the public profile or directory page and parses the embedded __NEXT_DATA__ JSON that Zillow's own front-end already renders from; for lenders, it calls the public mortgageapi.zillow.com JSON endpoints the lender-directory page itself uses. Only data already visible on Zillow's public pages is returned โ nothing behind a login. The output schema (field names and shapes) is fixed in the Actor's own code, so it stays stable even when Zillow changes its page layout or styling, as long as the underlying data is still exposed.
Integrations
Zillow Agent Scraper works with the tools you're already using to move data โ call it directly over HTTP, wire it into an AI agent via MCP, or drop it into a no-code automation.
Calling Zillow Agent Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("<your-username>/zillow-agents-finder-listings-scraper").call(run_input={"market": "Austin, TX", "dataMode": "agents", "maxRecords": 25})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Works in Go, Ruby, Node.js, cURL โ any language that can make an HTTP request.
MCP integration for AI agents
Apify's Actors MCP Server exposes any Apify Actor, including this one, as a callable tool for MCP-compatible clients such as Claude and other agent frameworks. Point an MCP client at Apify's MCP server and reference this Actor by its Store ID to let an agent request agent/lender data as part of its own tool loop.
No-code tools (n8n, Make, LangChain)
In n8n, use the Apify node, or an HTTP Request node against the Actor's run-sync API endpoint, to trigger a run and pull the dataset into your workflow. In Make, the Apify app's "Run Actor and get dataset items" module does the same without code. In LangChain, load results with ApifyDatasetLoader pointed at this Actor's dataset ID to feed agent and listing records straight into a retriever or chain.
Is it legal to scrape Zillow agent data?
Scraping publicly available data โ the kind any visitor can see without logging in โ is generally lawful in most jurisdictions, and Zillow Agent Scraper only returns data already published on Zillow's public profile, directory, and lender pages. Most fields it collects (agent/lender name, business name, license number, business phone, business email) are public business-contact information tied to a licensed professional acting in a business capacity, not the kind of private personal data GDPR/CCPA were built around โ though a personal cell number or a review author's name can still carry personal-data obligations if you store and reuse it in bulk. Zillow's own Terms of Service govern how you may use data pulled from its site, separately from any data-protection law. This is general information, not legal advice โ consult legal counsel before bulk storing or reusing agent/lender contact data for outreach.
Frequently asked questions
What Zillow agent fields does Zillow Agent Scraper return?
The core fields are name, business, rating, reviews.count, and phone, plus (on full-detail records) serviceAreas, licenses, salesStats, and linked listing/sold-listing child rows. See What data can I extract above for the complete field list.
Does Zillow Agent Scraper require a Zillow account or login?
No. It reads Zillow's public agent/lender profile pages, public directory search pages, and the public mortgage-lender JSON API โ none of which require a Zillow account, login, or API key.
How many agents can I extract in one run?
Up to the maxRecords value you set, capped at 10,000 per run; set it to 0 for unlimited (the Actor keeps paginating the directory or working through your target list until results run out).
What happens if an agent profile doesn't exist, or a search returns zero results?
A missing or unfetchable profile is logged as a warning and skipped โ the run continues with the remaining targets rather than failing outright. If a directory search or name filter matches no agents/lenders at all, the Actor logs "No agents/lenders matched your search" and returns 0 records for that query instead of erroring.
Can I scrape multiple Zillow agents or lenders at once?
Yes. agentTargets accepts an array of profile URLs, @screenName tokens, or agent/lender names in a single run, and a location-based directory crawl (via market) returns as many records as maxRecords allows without any extra input.
Does Zillow Agent Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes. It's callable as an HTTP endpoint by any agent framework via the Apify API, and it's also reachable through Apify's Actors MCP Server for MCP-compatible clients like Claude.
How does Zillow Agent Scraper differ from a basic Zillow agent directory scraper?
A basic directory scraper typically returns only the card-level fields visible on a search results page (name, business, rating). This Actor additionally fetches each agent's full profile (licenses, service areas, sales stats), links each agent's real active-listing and itemized sold-sale history as child rows from the same profile fetch, computes a priceTier, and covers the mortgage-lender directory as a second data mode โ all in one run.
Does Zillow Agent Scraper return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with consistent field names across runs โ no HTML parsing or CSS selectors required. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when Zillow changes its layout or anti-bot system?
The Actor is maintained and its output schema is designed to stay stable across Zillow layout changes, since it parses Zillow's own structured __NEXT_DATA__/API payloads rather than visual page markup. No specific update turnaround time is guaranteed.
Can I use Zillow Agent Scraper without managing proxies or browser infrastructure?
Yes. By default it runs with no proxy and only escalates to Apify Datacenter, then Apify Residential, proxies automatically when Zillow blocks a request โ you don't need to supply, rotate, or configure your own proxy pool.
Which fields work best for AI training data and RAG indexing?
For RAG, index the free-text fields โ aboutMe, specialties, and languagesSpoken โ since they carry the most descriptive context per agent. For structured training data, rating, reviews.count, salesStats.pastSalesTotal, and priceTier are the most consistently populated typed fields across full-detail agent records.
Related scrapers
| Scraper | What it extracts |
|---|---|
Zillow Search Scraper: Price History Tracking (zillow-search-scraper-price-history-tracking) | Zillow property search results plus each listing's full price-history and tax-assessment timeline |
Alibaba Email Scraper: Top Supplier Leads (alibaba-email-scraper-top-supplier-leads) | Supplier contact emails and business leads from Alibaba |
LinkedIn B2B Emails Scraper: Verified Email Finder (linkedin-b2b-emails-scraper-verified-email-finder) | Verified company-domain B2B emails from LinkedIn |
Facebook Group Lead & Contact Scraper (facebook-groups-scraper-with-lead-contact-finder) | Leads and contact info mined from Facebook Group posts |
Your feedback
Found a bug, or need a field this Actor doesn't return yet? Let us know through the Issues tab on this Actor's Apify Store listing, or by messaging Scraper-Engine directly on Apify โ reports like these directly shape what gets fixed and added next.