- A long run no longer ends as failed with "Run failed. Please try again later." when one connection could not be opened securely. The request is retried on a fresh connection and the run finishes normally. Results and pricing are unchanged.
- A run that does fail now shows its reason in the run's status message instead of leaving it empty.
- Runs that come across many agents with incomplete profile pages finish slightly faster. Results and pricing are unchanged.
- Long runs recover on their own after a temporary disruption while loading agent profiles, instead of staying affected for the rest of the run. Results and pricing are unchanged.
- A long run no longer ends as failed with "Run failed. Please try again later." after a brief connection error while searching. The search retries and the run finishes normally.
- Runs with complete history lists finish faster and more reliably on long location lists. The agents and fields you get are the same as before.
- Runs with complete history lists and a rating, sales, review, phone, email or brokerage filter finish faster: agents that miss the filter are dropped before their full lists are loaded. The agents you get are the same as before.
- Runs stay fast after a brief connection error instead of slowing down for part of the location list. Results are unchanged.
- Repeated and overlapping searches over several days finish faster: an agent profile read in the last 7 days may be reused, where this used to be 24 hours. Counts such as sales, listings and reviews can then be up to 7 days old, and
scrapedAt shows when each record was read. Incremental runs keep the 24-hour limit.
- Incremental runs load less data when they reuse a recent agent profile. Results are unchanged.
- Repeated searches finish faster when many of the agents have no reviews yet: those agents' profiles can now be reused like any other agent's, where they used to be read again on every run. Results are unchanged, and such agents still show
reviewCount 0.
- A run that the platform restarts midway no longer reads again the agents it had already checked and left out by your filters. Results are unchanged.
- Searching agents by location works again. Since this afternoon Zillow refused our searches, so runs with Agent Locations ended blocked with no agents. The search now finds agents again and, if Zillow refuses one attempt, retries in a different way.
- A long run no longer ends as failed with "Run failed. Please try again later." when Apify's dataset service is slow to confirm one batch of results. The batch is stored, and the run goes on and finishes normally.
- Looking up an agent name across a whole state (Agent name + a state such as "GA" in Agent Locations) searches every town in the state. From 2026-11-19 each town searched in such a lookup is charged $0.0002, and the lookup stops when your maximum cost per run is reached. Until then this combination is not available: the run stops at once with a message and searches nothing. Enter the agent's city or ZIP code instead. Searches of a city, a ZIP code, a profile URL or a whole state without a name are unchanged and not charged per town.
- Searching a location, and above all a whole state, now finishes faster and recovers more quickly from a temporary block. The agents you get are the same as before.
- A whole-state search (e.g. "GA") now searches several of the state's towns at once instead of one after another. Every town is still searched, largest first; a name lookup with few matches in a big state finishes in a few minutes instead of running for half an hour or more. A small "Max results" still reads only as many agent profiles as it can deliver.
- A profile URL that points to no agent on Zillow (Zillow sends it to its agent search instead) is now reported as such, naming the URL, instead of ending the run with "Could not read agent details. Please try again." The other profiles in the same run are delivered as before. A profile that exists is never reported as missing because of a temporary block while its full review, sales or listing history is read.
- A run that ends with no agents because nobody matches the name you searched for, or because no location was given, now records that reason instead of a plain "complete", so it is no longer tracked as a fault on our side.
- An incremental run no longer renews its hold on the saved state after that hold has expired.
- An agent could show an empty rating and review count for up to a day after one incomplete read of their profile. The numbers from the search results now fill that gap, and the incomplete read is no longer reused.
- A location Zillow does not recognise now stops the run before any location is searched, with a message naming it. Nothing is scraped or charged. Before, the other locations were searched and the run ended green.
- Lower resource use per run. Output is unchanged.
- The Buyer's agents and Listing agents filters work again. Since 2026-10-19 a search with either filter on returned no agents.
- A rare case where a run could stop making progress or leave out an agent is fixed.
- A rare case where a run could fail on a single agent's details is fixed; that agent is now read again instead. This also covers details with an unexpected format in any field.
- Reviews on every agent.
reviews holds the newest reviews from the profile: rating, date, reviewer, text, sub-ratings and the agent's reply. reviewsSummary holds the review summary, the highlights, the keyword counts and the rating breakdown.
- Listings, rentals, recent sales, team and video on every agent. These come as
activeListings, rentalListings, pastSales (with the side the agent represented), teamMembers and videoUrl. They are read from the same profile page, so a run does not take longer.
- New options under Extra detail per agent, all off by default:
- Include all reviews, Include full sales history and Include all active listings return the complete lists instead of the newest ones. Max items per list sets the limit for each list, and the default is 100.
- Include contacts from agent website adds
websiteEmails, websitePhones and websiteSocialLinks, taken from the agent's own website.
- American Sign Language in the Languages filter.
- Whole-state search. Enter a US state ("NJ", "New Jersey") in Agent Locations to cover every city and town in it, largest first. An agent found in several towns is delivered once.
- Lower resource use per agent, also when the complete-list options are on. Output is unchanged.
- A state entered on its own ("Texas") no longer returns only the agents of its largest city.
profileUrl is now a valid link for agents whose Zillow screen name contains a space.
- Large locations are no longer cut short. A search now reaches every agent Zillow lists for the location (Austin, TX: over 17,000 agents), where it used to stop at 375. If a location still cannot be read to the end, the final status says so, and incremental runs do not mark the unreached agents as expired.
- Incremental runs no longer mark agents as expired for a location that could not be searched (an unrecognised location, or a filter Zillow did not apply).
- An error while saving one agent no longer ends the run before the agents already found are saved.
- Incremental runs with a timeout longer than about 24 days now keep their
stateKey locked for the whole run. Before, the lock was released right after the run started, so a second run with the same stateKey could start alongside it.
- New optional search filters, applied by Zillow's own agent search: Top agents only, Buyer's agents, Listing agents, Specialties, Languages, Min / Max sale price and Agent name.
- New optional output filters: Require a phone number, Require an email address and Brokerage name contains. An agent whose profile does not show the value is left out.
- More fields on every agent, from the same profile page:
businessPhone, officeAddress (+ city, state, postal code), isTopAgent, isPremierAgent, title, description, yearsInIndustry, memberSince, specialties, languages, websiteUrl, socialLinks, salesPriceRange, salesPriceMin, salesPriceMax, averageSalePrice, activeRentalListingsCount, teamMemberCount, licenses, otherLicenses, mlsIds. Existing fields are unchanged.
- A pasted agent-search URL now keeps the filters it was built with (language, specialty, price range...). Before, it was searched without them.
- A location Zillow does not recognise (for example a typo) now ends with a status message naming it, instead of an empty run with no explanation.
- A location whose scan was interrupted part-way is no longer dropped with every agent after that point. The run now finishes the other locations first, then picks the interrupted location up again where it stopped. If it still cannot be finished, the run's final status names that location so you know to run it again.
- Agents whose profile could not be read on the first try are now tried once more at the end of the run instead of being left out. Any that still cannot be read are counted in the run's final status.
- A run that is about to reach its timeout now stops cleanly: it saves every agent already found and ends with a status that says how many were saved and how to get the rest (raise the timeout or split the locations). Before, such a run was cut off and ended as timed out.
- A run that found agents but could not read any of their details now says so in its final status, instead of ending as an ordinary run with no results.
- Each run now starts on its own fresh connections, so a new run of the same location is no longer slowed down by the previous run's.
- A run that is restarted by the platform part-way through no longer stores, and bills, the same agents twice. After a restart the run continues from the agents it has already saved: they are not fetched or stored again, and
maxResults counts them, so a restarted run never returns more than you asked for. Incremental runs behave the same way: agents and EXPIRED rows already saved are not repeated and are still remembered for the next run.
- An incremental run that you abort (with the default graceful abort), or that reaches its run timeout, now releases its
stateKey before it stops. The next run with the same stateKey can start right away instead of exiting with "State locked by another run".
- Runs with a maximum cost limit now use the full budget. With a limit set, a run stopped early and returned fewer agents than the limit pays for. The run now stops cleanly at the limit instead of fetching profiles it cannot return; in incremental mode, new or changed agents beyond the limit are delivered by your next run. Prices are unchanged.
- Fixed: some agents came back with an empty
displayName although their profile shows a name. The name is now read from the profile's other name field when the first one is empty, also for agents already returned by an earlier run today.
- Lower price: $0.0012 per agent record (was $0.00145), the same as our Zillow property scraper.
- A brief connection drop while scanning a location no longer fails the whole run. The
affected page is retried, so runs that had already collected agents now finish normally.
- A partially-served agent page is now retried instead of being delivered as a record with
empty fields. Previously such a page could reach the dataset as an all-but-empty row —
most visibly a missing agent name — and was counted as a successful fetch.
- A run that returns nothing now says why: whether the location genuinely has no agents,
whether your own rating/sales/review filters removed every match (with the number found),
or whether the agents' details could not be read. Previously all three printed the same
"check the location or filters" line, which pointed at your query even when the query
was fine.
- Internal diagnostics only; no change to output.
- Fixed a fault that caused most agent detail pages to be rejected, so runs were delivering
only a small fraction of the agents they had already found. A location that returned a
couple of records now returns the full requested set.
- Large locations now continue past the point where a scan was previously interrupted,
instead of starting the location over and stopping at the same place. A single location
can now return substantially more agents, and a run no longer re-reads pages it has
already processed.
- Runs no longer fetch more agent profiles than they can return. A run asking for a small
number of results previously kept a full window of fetches in flight and threw the surplus
away, which made small runs slower and more expensive than they needed to be. Same records
out, less work done.
- Incremental runs now stop collecting as soon as
maxResults is reached. Previously an
incremental run kept scanning the whole location even when only a handful of records were
requested, so a small maxResults could take minutes instead of seconds. Output is
unchanged — the same records are delivered, just far faster.
- Full-coverage scanning is still performed when
emitExpired is on, since detecting removed
agents requires seeing the complete set.
- A response that stalls midway is now retried on a fresh connection instead of ending the run.
Previously a single stalled read could fail an otherwise healthy run and discard its results.
Initial release. Scrape US real estate agent & team leads from zillow.com — name,
business/team, phone, email, rating, review count, sales history, and active listings per
agent.
- Search by location (
agentLocations) or paste zillow.com agent profile URLs / an
agent-directory URL (startUrls) directly.
- Lead-quality filters:
minRating, minSales, minReviews.
- Incremental mode tracks new/changed/expired agents across runs, keyed on rating, total
sales, active listings, and review count.
- Notifications (Telegram, Slack, Discord, WhatsApp Cloud API, generic webhook) and MCP
connector export.