Zillow Agents Scraper avatar

Zillow Agents Scraper

Pricing

from $1.20 / 1,000 dataset items

Go to Apify Store
Zillow Agents Scraper

Zillow Agents Scraper

Extract Zillow real estate agent data by zip code, city, or state. Optionally enrich records with full agent profiles including listings, reviews, licenses, and contact details.

Pricing

from $1.20 / 1,000 dataset items

Rating

0.0

(0)

Developer

Data Scrapers

Data Scrapers

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Categories

Share

Zillow Agents Scraper creates a structured dataset of real estate agent contact records sourced from Zillow. Each dataset item is one agent and can include the agent name, brokerage, profile URL, rating, and sales summary. When detailed profiles are enabled, the same record can also include phone numbers, email, website, social links, brokerage address, licenses, and service areas. Query by US zip code, city, or state, control the result limit with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.

Zillow Agents Scraper — input to structured data

Dataset at a glance

PropertyValue
SourceZillow agent index and public Zillow profile pages
Record unitOne real estate agent
Input methodszipCodes, cities, or states
Main identifiersencodedZuid, cardActionLink
Contact fieldsPhone, email, website, and brokerage address on a successful detailed profile
DeliveryApify Dataset and Dataset API
Export formatsJSON, CSV, Excel, XML, and other Apify dataset formats
Update modelDirectory rows from the location index; profile contact fields fetched during the run
Pricingdataset-item $1.50 / 1,000; detailed-data $2.00 / 1,000 before plan discounts

Coverage and available records

Use this dataset to build a territory contact list. A run needs at least one location. zipCodes accepts five-digit US zip codes that exist in the location index. cities accepts an exact State, City key, such as Alaska, Anchorage, or a city name matched at 98% similarity. states accepts a full state name from the input list. A location that is not in the index fails the run.

The location index shipped with this Actor lists 33,403 zip codes, 26,285 cities, and 49 states. Alabama is in the input list and is not in that index, so selecting Alabama fails the run. The index does not claim every agent currently published on Zillow.

Directory records are loaded from that index. They include the agent name, brokerage, profile URL, photo, top-agent flag, rating summary, sales summary, tags, and the state, city, and zip used for the lookup. They do not include phone or email.

Set includeDetailedProfile to true to open each agent's public profile URL and attach detailedProfile. That object is where lead fields live: displayUser.phoneNumbers, displayUser.email, displayUser.businessAddress, professionalInformation (cell phone, broker phone, websites, and licenses), and getToKnowMe website and social URLs. In observed enriched profiles those phone and email fields were present. They remain source fields and are absent when the profile page omits them or the fetch fails.

maxItems of 0 means no Actor-side cap, except on the Apify free plan. A free-plan run is limited to 2 directory records, detailed profiles are turned off, and each saved agent is marked _trial. The run also appends one upgrade message that is not an agent.

Agents are deduplicated inside the run by cardActionLink. A profile URL that fails to load is still saved as a directory record with hasDetailedProfile set to false. Listings, reviews, and past sales are included on a successful detailed profile and are not separate dataset items.

Data dictionary

Directory fields are present on every agent record. The best field for deduplication is cardActionLink. encodedZuid is the Zillow user id and is the other stable identifier.

FieldTypeNullableDescriptionExample
cardTitlestringYesAgent or team name from the directory card.Roy Briley Real Estate Group
secondaryCardTitlestringYesBrokerage name on the directory card.Real Estate Brokers of Alaska
cardActionLinkstringNoPublic Zillow profile URL. Deduplication key.https://www.zillow.com/profile/Roy%20Briley%20RE%20Group
encodedZuidstringYesZillow encoded user id.X1-ZUzl3bfxwglz49_47pep
imageUrlstringYesProfile photo URL.https://photos.zillowstatic.com/fp/f1ca7d45cacd64fa44e69e15450b6d11-h_l.jpg
logoUrlstringYesBrokerage logo URL when the card includes one.null
isTopAgentbooleanYesSource top-agent flag.true
statestringYesState name stored with the directory row.Alaska
citystringYesCity stored with the directory row.Anchorage
zip_codestringYesZip code stored with the directory row.99501
pageintegerYesDirectory page number stored with the row.1
reviewInformationobjectYesRating summary. See nested fields.
profileDataarrayYesSales and price-range lines from the card.
tagsarrayYesCard tags such as TEAM.
hasDetailedProfilebooleanConditionalPresent when detailed profiles are requested. true only after a profile page loads.true
detailedProfileobjectConditionalFull profile payload, including contact fields. Present only when the profile page loads.

reviewInformation

FieldTypeNullableDescriptionExample
reviewAveragenumberYesNumeric average rating.5
reviewAverageTextstringYesRating as display text.5.0
reviewCountFormattedTextstringYesReview count as display text, including parentheses when the source sends them.(219)
noReviewsTextstringYesSource empty-state text. Can still be present when reviews exist.No reviews

profileData[] and tags[]

FieldTypeNullableDescriptionExample
profileData[].labelstringYesMetric label from the card.team sales last 12 months
profileData[].formattedDatastringYesMetric value as display text, not a parsed number.206
tags[].textstringYesTag label.TEAM
tags[].tagTypestringYesSource tag type.WARNING

Contact fields inside detailedProfile

These fields are the lead-generation portion of the record. They are absent unless includeDetailedProfile is true and the profile page loads.

detailedProfile.displayUser

FieldTypeNullableDescriptionExample
namestringYesProfile display name.Roy Briley Real Estate Group
screenNamestringYesZillow screen name.Roy Briley RE Group
businessNamestringYesBrokerage name on the profile.Real Estate Brokers of Alaska
emailstringYesEmail published on the profile.rbreg@akreba.com
phoneNumbersobjectYesPublished phone numbers. See nested fields.
businessAddressobjectYesBrokerage street address. See nested fields.
ratings.averagenumberYesProfile rating average.5
ratings.countintegerYesProfile rating count.219
isTopAgentbooleanYesProfile top-agent flag.true
encodedZuidstringYesSame Zillow user id as the directory row when both are present.X1-ZUzl3bfxwglz49_47pep

phoneNumbers and businessAddress

FieldTypeNullableDescriptionExample
phoneNumbers.cellstringYesCell phone as published, including punctuation.(907) 343-8900
phoneNumbers.brokeragestringYesBrokerage phone as published.(907) 343-8900
phoneNumbers.businessstringYesBusiness phone as published.(907) 274-0000
businessAddress.address1stringYesStreet line.1557 C St., Suite 204
businessAddress.address2stringYesSecond address line.null
businessAddress.citystringYesCity.Anchorage
businessAddress.statestringYesState abbreviation on the profile.AK
businessAddress.postalCodestringYesPostal code.99501

professionalInformation[]

Each item is a labeled contact or credential block from the profile. The useful lead rows are cell phone, broker phone, websites, and licenses.

FieldTypeNullableDescriptionExample
termstringYesBlock label.Cell phone
descriptionstringYesSingle-line value, used for phone numbers.(907) 343-8900
linesarray of stringYesMulti-line value, used for the broker address and license numbers.500063 (AK)
linksarrayYesWebsite and social links when term is Websites.
links[].textstringYesLink label.Website
links[].urlstringYesLink URL.http://www.EveryAlaskaHome.com

getToKnowMe, licenses, and service areas

FieldTypeNullableDescriptionExample
getToKnowMe.websiteUrlstringYesWebsite URL.http://www.EveryAlaskaHome.com
getToKnowMe.facebookUrlstringYesFacebook URL.https://www.facebook.com/RoyBrileyRealEstate/
getToKnowMe.instagramUrlstringYesInstagram URL.https://www.instagram.com/roybrileyregroup/
getToKnowMe.linkedInUrlstringYesLinkedIn URL.https://www.linkedin.com/feed/
getToKnowMe.yearsInIndustryintegerYesYears in the industry reported by the source.36
getToKnowMe.specialtiesarray of stringYesSpecialty labels.Buyer's Agent
getToKnowMe.languagesarray of stringYesLanguages. An empty array has been observed.Spanish
getToKnowMe.descriptionstringYesProfile biography text.
agentLicenses[].textstringYesLicense number.500063
agentLicenses[].statestringYesLicense state abbreviation.AK
agentLicenses[].statusstringYesLicense status from the source.pending
agentLicenses[].license_typestringYesLicense type.agent
agentLicenses[].expirationstringYesExpiration date, YYYY-MM-DD.2028-01-31
otherLicenses[].licenseCodestringYesOther license code.15309
otherLicenses[].licenseDescstringYesOther license description.Real Estate license
serviceAreas[].textstringYesService-area label.Anchorage, AK
serviceAreas[].regionIdintegerYesSource region id.23482
serviceAreas[].urlstringYesSource path for the area./anchorage-ak/

A successful detailedProfile also includes forSaleListings, forRentListings, pastSales, reviewsData, teamDisplayInformation, mlsIDs, and page metadata such as breadcrumbs and currentUrl. Those objects are source payloads. Listing price is a number in USD on observed for-sale rows. Review text is source text.

Free-plan agent records add _trial (true) and _upgrade_url. The extra upgrade item has _type upgrade_cta, message, and recordsReturned.

Example dataset record

The record below is a real directory row for zip 99501 with the contact portion of its detailed profile. getToKnowMe.description and the listing, review, past-sale, team, and page-metadata objects are omitted here. They are present on the full enriched record.

{
"cardTitle": "Roy Briley Real Estate Group",
"cardActionLink": "https://www.zillow.com/profile/Roy%20Briley%20RE%20Group",
"encodedZuid": "X1-ZUzl3bfxwglz49_47pep",
"imageUrl": "https://photos.zillowstatic.com/fp/f1ca7d45cacd64fa44e69e15450b6d11-h_l.jpg",
"logoUrl": null,
"isTopAgent": true,
"secondaryCardTitle": "Real Estate Brokers of Alaska",
"reviewInformation": {
"noReviewsText": "No reviews",
"reviewAverage": 5,
"reviewAverageText": "5.0",
"reviewCountFormattedText": "(219)"
},
"profileData": [
{"formattedData": "$72K - $2M", "label": "team price range"},
{"formattedData": "206", "label": "team sales last 12 months"},
{"formattedData": "144", "label": "team sales in 99501"}
],
"tags": [{"tagType": "WARNING", "text": "TEAM"}],
"state": "Alaska",
"city": "Anchorage",
"zip_code": "99501",
"page": 1,
"hasDetailedProfile": true,
"detailedProfile": {
"displayUser": {
"name": "Roy Briley Real Estate Group",
"screenName": "Roy Briley RE Group",
"businessName": "Real Estate Brokers of Alaska",
"email": "rbreg@akreba.com",
"phoneNumbers": {
"cell": "(907) 343-8900",
"brokerage": "(907) 343-8900",
"business": "(907) 274-0000"
},
"businessAddress": {
"address1": "1557 C St., Suite 204",
"address2": null,
"city": "Anchorage",
"state": "AK",
"postalCode": "99501"
}
},
"professionalInformation": [
{
"term": "Cell phone",
"description": "(907) 343-8900"
},
{
"term": "Websites",
"links": [
{"text": "Website", "url": "http://www.EveryAlaskaHome.com"},
{"text": "Facebook", "url": "https://www.facebook.com/RoyBrileyRealEstate/"}
]
}
],
"agentLicenses": [
{
"text": "500063",
"state": "AK",
"status": "pending",
"license_type": "agent",
"expiration": "2028-01-31"
}
],
"serviceAreas": [
{"regionId": 23482, "text": "Anchorage, AK", "url": "/anchorage-ak/"},
{"regionId": 36906, "text": "Palmer, AK", "url": "/palmer-ak/"}
]
}
}

This row came from a zip query for 99501 with detailed profiles enabled. The same profile also published Instagram and LinkedIn under Websites, getToKnowMe.websiteUrl http://www.EveryAlaskaHome.com, and eight service areas. The example keeps two website links and two service areas.

Query and input reference

InputTypeRequiredDefaultAccepted valuesDescription
zipCodesarray of stringConditionalnoneFive-digit zip codes in the location indexAgents for those zip codes. One of zipCodes, cities, or states is required.
citiesarray of stringConditionalnoneState, City, or a city name at 98% similarityCity lookup. City-only names can match more than one index key.
statesarray of stringConditionalnoneFull state names in the input listEvery indexed city in the state. Alabama is listed and is not in the index.
maxItemsintegerNo0Integer 0 or greaterMaximum unique agents. 0 means no cap, except the free plan, which returns 2.
includeDetailedProfilebooleanNofalsetrue or falseFetch profile contact fields. Charged as detailed-data when the page loads. Forced off on the free plan.
maxConcurrencyintegerNo10Integer 1–50Concurrent profile fetches when detailed profiles are enabled. Values below 1 are raised to 1.
proxyConfigurationobjectNoApify Residential proxyApify proxy objectUsed for profile fetches when detailed profiles are enabled.

Minimal directory request:

{
"zipCodes": ["99501"],
"maxItems": 20
}

Contact-list request. Phone, email, website, and brokerage address are requested with includeDetailedProfile:

{
"zipCodes": ["99501"],
"includeDetailedProfile": true,
"maxItems": 20,
"maxConcurrency": 10
}

Retrieve the data through the API

  1. Start datascrapers/zillow-agents-scraper with a JSON input.
  2. Wait until the run finishes, or poll the run.
  3. Read items from the run’s default dataset.
  4. Use dataset offset and limit, or an Apify export format, for a larger contact list.
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("datascrapers/zillow-agents-scraper").call(run_input={
"zipCodes": ["99501"],
"includeDetailedProfile": True,
"maxItems": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
user = (item.get("detailedProfile") or {}).get("displayUser") or {}
phones = user.get("phoneNumbers") or {}
print(item.get("cardTitle"), phones.get("cell"), user.get("email"))

Other languages are listed on the Actor’s API tab. Do not put a real token in a URL or in the input. This is the Apify Actor API. It is not a Zillow API.

Data quality and record handling

The Actor deduplicates by cardActionLink inside a single run. Use that URL as the external unique key when you merge zip, city, and state runs. encodedZuid is the stable Zillow user id when you join this dataset to another Zillow record.

Directory text is stored as returned. Sales counts in profileData stay display strings. Phone numbers stay display strings. The Actor does not validate that a phone or email is current, and it does not add a phone or email that the profile page does not publish.

detailedProfile is the raw profile payload plus the directory fields. A failed profile fetch keeps the directory row, sets hasDetailedProfile to false, and charges dataset-item instead of detailed-data. A directory run never sets hasDetailedProfile.

An unknown zip, city, or state fails the run before records are useful as a complete territory. Overlapping locations in one run still collapse to one row per profile URL.

Run statistics are written to the key run-stats: recordsScraped, recordsDetailed, recordsBasicFallback, runStartedAt, runFinishedAt, maxItems, includeDetailedProfile, and userTier. Timestamps are UTC ISO 8601.

Export and pipeline examples

DestinationRecommended methodTypical use
CRM or outreach toolCSV or Excel export of cardTitle, phoneNumbers.cell, email, and businessNameA call and email list for one zip or city
Google SheetsApify integrationShare a territory contact sheet
PostgreSQL or SupabaseDataset API or a webhook consumerStore agents and update them by cardActionLink
JSON pipelineDataset API iterate_itemsKeep the nested phone, license, and service-area objects

Flatten detailedProfile.displayUser before a CSV import if the destination cannot store nested objects. Excel and CSV exports of nested objects are JSON text inside the cell.

Pricing and cost examples

Billing is pay per event, starting October 24, 2026. The user does not pay Apify platform usage costs.

A directory row charges dataset-item. A profile page that loads charges detailed-data instead of dataset-item. A profile fetch that fails charges dataset-item.

EventNo discountBronzeSilverGold
dataset-item$1.50 / 1,000$1.40 / 1,000$1.30 / 1,000$1.20 / 1,000
detailed-data$2.00 / 1,000$1.90 / 1,000$1.80 / 1,000$1.70 / 1,000
RecordsEventsEstimated cost, no discount
1,000 directory agentsdataset-item$1.50
10,000 directory agentsdataset-item$15.00
1,000 agents with a loaded profiledetailed-data$2.00
1,000 requested profiles, 900 loaded and 100 failed900 detailed-data and 100 dataset-item$1.95

Estimates use the no-discount price. Bronze, Silver, and Gold prices are in the table above. maxItems limits how many agents a run saves. A free-plan run saves at most 2 directory records and does not request detailed profiles.

Limitations and responsible data use

Directory rows come from the Actor’s Zillow agent index. They are not a live search of Zillow on every run. Phone, email, website, brokerage address, and license fields are read from the public profile page during the run, and only when detailed profiles are enabled.

The index covers 33,403 zip codes and 49 states. It does not include Alabama. A zip or city missing from the index fails the run. Contact fields can be missing when Zillow omits them. The Actor does not confirm that a number or email inbox is active.

Each run returns the index rows and, when requested, the profile pages available during that run. The Actor does not keep historical snapshots. Store the dataset yourself if you need a contact list as of a date.

You are responsible for complying with Zillow’s terms, privacy rules, and applicable law, including how you store agent contact details and how you use them for outreach.

Dataset questions

What does one dataset item represent?

One Zillow real estate agent. With includeDetailedProfile enabled and a successful page load, that same item also carries phone, email, brokerage address, website, licenses, and service areas.

Which field should I use as a unique identifier?

Use cardActionLink. Use encodedZuid when you need the Zillow user id. The Actor already removes duplicate profile URLs inside one run.

Where are the phone number and email?

On an enriched record, use detailedProfile.displayUser.phoneNumbers.cell, phoneNumbers.brokerage, phoneNumbers.business, and detailedProfile.displayUser.email. The same phone numbers are repeated under detailedProfile.professionalInformation with terms Cell phone and Broker phone. A directory-only run does not include these fields.

Are contact fields nullable or conditional?

Yes. They exist only after a successful detailed-profile fetch. Email, each phone field, website, and address lines can still be null when the profile omits them. languages can be an empty array. logoUrl and secondaryCardTitle are nullable on the directory card.

Can I retrieve the contact list as CSV or JSON?

Yes. Export the run dataset as JSON, CSV, Excel, XML, or another Apify dataset format. JSON keeps nested phone and license objects. Flatten displayUser before loading a spreadsheet into a CRM.

How do I paginate a large agent list?

Limit a run with maxItems. Read a saved dataset with the Dataset API offset and limit parameters, or download an export. State and city queries can return a large index, so set maxItems when you want a sample contact list.

Does the Actor return historical contact data?

No. Directory rows come from the current location index, and profile contact fields come from the profile page at request time.

What counts as a billable result?

Each saved directory agent charges dataset-item at $1.50 per 1,000 before plan discounts. Each loaded profile charges detailed-data at $2.00 per 1,000 instead. A failed profile fetch stays on dataset-item. The user does not pay Apify platform usage costs. The free plan returns at most 2 directory records.

  • Realtor.com Scraper — US home listing records you can place next to the agents who cover the same market.
  • Redfin Scraper — US listing records queried by zip code, aligned with zip_code on these agent rows.
  • Apartments.com Scraper — rental listing records, including property contact information, for the same city.
  • Crexi Scraper — commercial listing records for sale and lease when the outreach list includes commercial agents.
  • Yelp Scraper — local business records with phone numbers for the same city as the agent list.

Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.