Realtor.com Agents by Zip Code Scraper With Market Analytics
Pricing
from $2.99 / 1,000 results
Realtor.com Agents by Zip Code Scraper With Market Analytics
Realtor.com Agents by Zip Code Scraper — Find real estate agents by ZIP code and extract profiles, agencies, ratings, reviews, specialties, locations, and contact details. Analyze agent density, ratings, market activity, and local competition for real estate insights.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Realtor.com Agent Scraper — Contacts, Ratings and Sales by Zip
The Realtor.com Agent Scraper pulls real estate agent directory records from Realtor.com by zip code, returning each agent's name, website, office and mobile phone numbers, brokerage, listing and sold counts, ratings, price-range sales volume, and a computed data-completeness score — plus optional cross-run growth deltas for review and sold counts since the agent's last run. Real estate lead-generation teams, recruiters, and brokerage market analysts use this data to target and track agents by zip code at scale. Every record lands in a structured, filterable dataset the moment it's collected.
⬇️ What is the Realtor.com Agent Scraper?
The Realtor.com Agent Scraper is an Apify Actor that queries Realtor.com's public agent-search and agent-branding-profile endpoints for a list of zip codes and returns one structured JSON record per agent. It does not require a Realtor.com account, login, or API key — the Actor calls Realtor.com's own GraphQL endpoint directly with a standard browser-style request.
Key features:
- 📍 Bulk zip code discovery — feed it any list of US zip codes; it walks Realtor.com's own pagination (24 agents per page) until it hits your per-zip limit or runs out of agents
- 👤 Core identifying and contact fields — name, agent type, website, office/mobile phone, brokerage name and website, service areas
- ⭐ Secondary performance data — average rating, recommendation count, review count, listing and sold counts, annual sales-volume range
- 📈 Market analytics layer — price-range midpoint, days since last sale, a 24-field data-completeness score, and a human-readable agent-type label, computed on top of the raw response
- 📊 Cross-run growth tracking — review-count and sold-count deltas against the same agent's previous run, with a genuine
null(not a faked0) on an agent's first-ever run - 🔀 Real filters — sort order, minimum data-completeness threshold, per-zip result cap, and an optional monitoring-scope label for running the same agents under separate client baselines
- ⬆️ Standard Apify dataset output — export to JSON, CSV, Excel, XML, or RSS directly from the Apify Console or API, no extra formatting step
📦 What data can I extract with the Realtor.com Agent Scraper?
Every agent record covers four data groups: identity/contact, sales & reputation performance, market analytics, and cross-run growth. The exact fields returned depend on whether Market Analytics and Growth Tracking are left on (both default on).
| Field | Example value | Use case |
|---|---|---|
zip_code | "07101" | The zip code this agent was found under |
agentId | "1234567890" | Realtor.com's internal agent/profile ID |
agent_name | "Jane Smith, agent" | Display name plus REALTOR®/non-REALTOR® flag |
agentTypeLabel | "REALTOR® · Paid Member · Buyer & Seller Agent" | Human-readable summary of status and service focus |
website | "https://www.realtor.com/realestateagents/abc123" | Direct link to the agent's public profile |
email | null | Always null — see the constraint note below |
listing_count | 12 | Active for-sale listings |
sold_count | 34 | Recently-sold count (annual) |
review_count | 27 | Total reviews on the profile |
averageRating | 4.8 | Average review rating |
recommendationsCount | 19 | Recommendation count separate from star reviews |
isRealtor | true | REALTOR® designation flag |
isPaid | true | Paid/featured placement flag |
servicesBuyer | true | Offers buyer-side representation |
servicesSeller | true | Offers seller-side representation |
combinedAnnualMin | 500000 | Lower bound of annual combined sales volume |
combinedAnnualMax | 2500000 | Upper bound of annual combined sales volume |
priceRangeMidpoint | 1500000 | Computed midpoint of the annual volume range |
forSaleMinPrice | 250000 | Lowest active listing price |
forSaleMaxPrice | 950000 | Highest active listing price |
lastListingDate | "2026-06-18T00:00:00Z" | Date of the agent's most recent listing |
daysSinceLastSale | 42 | Computed from lastListingDate to today |
dataCompletenessScore | 87.5 | % of 24 tracked fields that are non-null for this agent |
isFirstRunForAgent | false | Whether this is the first time this agent was seen under this monitoring scope |
previousReviewCount | 24 | review_count recorded on the agent's previous run |
reviewCountDelta | 3 | Change in review count since the previous run |
previousSoldCount | 31 | sold_count recorded on the agent's previous run |
soldCountDelta | 3 | Change in sold count since the previous run |
office_phone | "973-555-0142" | Office phone number |
mobile_phones | "973-555-0199" | Comma-separated mobile numbers |
areas_serviced | "Newark, NJ, Irvington, NJ" | Comma-separated service areas |
office_company_name | "Prime Realty Group" | Brokerage/office name |
company_website | "https://www.primerealtygroup.com" | Brokerage website |
sortingWeight | 142.3 | Realtor.com's own prominence/ranking score |
avatarInitials | "JS" | Initials shown when no photo is set |
brokerFulfillmentId | "9988776" | Broker's Realtor.com fulfillment ID |
agent_photo | "https://ap.rdcpix.com/..." | Profile photo URL |
recentlySoldSample | [{"beds":3,"baths":2,"city":"Newark","stateCode":"NJ","photo":"https://..."}] | Small sample of recently-sold properties |
hasAdditionalSoldListings | true | Whether more sold listings exist beyond the sample |
scrapedAt | "2026-07-30T14:02:11.123Z" | UTC timestamp the row was extracted |
⭐ Performance and reputation data
The performance fields — averageRating, recommendationsCount, review_count, listing_count, sold_count, combinedAnnualMin/combinedAnnualMax, priceRangeMidpoint, and forSaleMinPrice/forSaleMaxPrice — are the fields that drive most buying decisions on this dataset. They come straight from Realtor.com's own agent-search response (the base actor discards them; this variant harvests them). priceRangeMidpoint and dataCompletenessScore are computed by the Actor, not returned by Realtor.com directly. A recruiter comparing two agents in the same zip code can rank by sold_count and averageRating together instead of opening each profile individually.
📍 Targeting and scope data
zip_code and areas_serviced are the geographic fields you filter and group on. dataCompletenessScore lets you drop thin profiles below a chosen threshold via minDataCompletenessScore. agentSortOrder controls which agents Realtor.com surfaces first per zip code, and monitoringScopeId lets you keep two monitoring campaigns (e.g. two different clients) from sharing the same growth-tracking baseline for the same agent.
🆚 Why not build this yourself?
Realtor.com does not publish a public API for its agent directory — there is no official endpoint for bulk agent search or agent-branding-profile data. To build this yourself you'd need to reverse-engineer Realtor.com's internal GraphQL schema (SearchAgents and AgentBrandingProfile operations), replicate its pagination (24 agents per response), and handle blocking.
In practice, requests that don't rotate proxies get blocked with 403/429/503 responses or dropped connections once you scrape more than a handful of zip codes. This Actor retries each request (maxRetries, default 3, configurable 1–10) and escalates proxy tiers automatically — starting with no proxy, falling back to Apify's datacenter proxy, then to residential proxy in sticky mode once residential is needed — instead of failing the whole run on the first block.
Building this in-house also means you'd have to write your own data-completeness scoring, price-midpoint math, and cross-run diffing logic yourself; this Actor computes all three from the raw response on every run.
Build it yourself if you need to scrape only your own market's zip codes occasionally and already have proxy infrastructure. Use this Actor if you need agent directory data across many zip codes on a repeatable schedule without maintaining scraping infrastructure.
🎯 How to use Realtor.com agent data
🏢 Lead generation and recruiting teams
Feed a list of target zip codes into targetZipCodes, set agentSortOrder to MOST_SALES or RATINGS_REVIEWS, and filter the resulting dataset on sold_count, averageRating, and office_phone/mobile_phones to build a call list of the highest-performing agents in each territory. dataCompletenessScore lets you drop agents whose profile is too thin to be worth contacting.
📊 Brokerage and agency market audits
Agencies running audits for multiple clients set a distinct monitoringScopeId per client so growth deltas (reviewCountDelta, soldCountDelta) never mix baselines between engagements. Re-running the same zip codes monthly turns this into a recurring competitive-monitoring feed rather than a one-off pull.
🔬 Market research and intelligence
Analysts aggregate combinedAnnualMin/combinedAnnualMax and priceRangeMidpoint across all agents in a zip code to estimate local sales-volume distribution, or compare isRealtor/isPaid/servicesBuyer/servicesSeller ratios across zip codes to map how brokerage composition and service focus shift by territory.
🤖 AI agents and automated pipelines
Because output is typed, structured JSON on a stable schema, agent frameworks can call this Actor as a tool to answer questions like "who are the top-rated buyer's agents in zip code 07101?" and feed the result straight into a lead-scoring or CRM-enrichment pipeline without custom parsing.
⬇️ Input sample
None of the parameters are required — an empty run fails safely with a logged error rather than scraping nothing silently, because the Actor checks for at least one zip code before starting.
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
targetZipCodes | No | array | Zip codes to scrape agents from. Supports bulk input for multiple locations. | ["07101", "00501"] |
zipCodes | No | array | Legacy alias of targetZipCodes, kept for backward compatibility. Prefer targetZipCodes. | ["07101"] |
maxAgentsPerZip | No | integer (1–10000) | Maximum number of agents to extract per zip code. Default 10 (prefill). | 50 |
maxItemsPerZipcode | No | integer (1–10000) | Legacy alias of maxAgentsPerZip, kept for backward compatibility. | 50 |
agentSortOrder | No | string enum | RELEVANT_AGENTS | RATINGS_REVIEWS | MOST_SALES | MOST_RECENT_ACTIVITY | TESTIMONIALS_RECOMMENDATIONS. Default RELEVANT_AGENTS. | "MOST_SALES" |
sortOrder | No | string enum | Legacy alias of agentSortOrder, same enum values. | "RATINGS_REVIEWS" |
includeMarketAnalytics | No | boolean | Adds averageRating, recommendationsCount, isPaid, isRealtor, sortingWeight, servicesBuyer/servicesSeller, price-range fields, a recently-sold sample, and the derived priceRangeMidpoint/daysSinceLastSale/dataCompletenessScore/agentTypeLabel fields. Default true. | true |
minDataCompletenessScore | No | integer (0–100) | Skip agents whose dataCompletenessScore falls below this percentage. Only applies when includeMarketAnalytics is on. Default 0. | 40 |
enableGrowthTracking | No | boolean | Adds reviewCountDelta, soldCountDelta, previousReviewCount, previousSoldCount, isFirstRunForAgent, computed against this agent's previous run. Default true. | true |
monitoringScopeId | No | string | Optional label keeping separate monitoring campaigns from sharing a growth-tracking baseline. Leave empty for one shared baseline per agent. | "client-acme-2026" |
maxRetries | No | integer (1–10) | How many times to retry a failed request per proxy tier before giving up on that page/profile. Default 3. | 5 |
proxyConfiguration | No | object | Smart proxy management. Starts with no proxy; falls back to datacenter then residential automatically if requests are blocked. | {"useApifyProxy": false} |
{"targetZipCodes": ["07101", "00501"],"maxAgentsPerZip": 25,"agentSortOrder": "MOST_SALES","includeMarketAnalytics": true,"minDataCompletenessScore": 30,"enableGrowthTracking": true,"monitoringScopeId": "client-acme-2026","maxRetries": 3}
Common pitfall: filling in both targetZipCodes and its legacy alias zipCodes (or maxAgentsPerZip and maxItemsPerZipcode) is harmless — the Actor reads targetZipCodes/maxAgentsPerZip first and only falls back to the legacy field when the primary one is empty — but leaving all zip code fields empty makes the run stop immediately with a logged error, since at least one zip code is required for the Actor to do anything.
⬆️ Output sample
Output is typed, normalized JSON with a consistent schema — one row per agent, pushed to the dataset as soon as it's collected rather than batched at the end of the run. Export directly to JSON, CSV, Excel, XML, or RSS from the Apify Console or API.
{"agent_name": "Jane Smith, agent","website": "https://www.realtor.com/realestateagents/9988776","email": null,"listing_count": 12,"sold_count": 34,"office_phone": "973-555-0142","mobile_phones": "973-555-0199","areas_serviced": "Newark, NJ, Irvington, NJ","office_company_name": "Prime Realty Group","company_website": "https://www.primerealtygroup.com","review_count": 27,"agent_photo": "https://ap.rdcpix.com/abc123/agent-photo.jpg","agentId": "9988776","averageRating": 4.8,"recommendationsCount": 19,"isPaid": true,"isRealtor": true,"sortingWeight": 142.3,"servicesBuyer": true,"servicesSeller": true,"avatarInitials": null,"brokerFulfillmentId": "5544332","combinedAnnualMin": 500000,"combinedAnnualMax": 2500000,"forSaleMinPrice": 250000,"forSaleMaxPrice": 950000,"lastListingDate": "2026-06-18T00:00:00Z","recentlySoldSample": [{ "beds": 3, "baths": 2, "city": "Newark", "stateCode": "NJ", "photo": "https://ap.rdcpix.com/xyz/sold1.jpg" },{ "beds": 4, "baths": 3, "city": "Irvington", "stateCode": "NJ", "photo": "https://ap.rdcpix.com/xyz/sold2.jpg" }],"hasAdditionalSoldListings": true,"priceRangeMidpoint": 1500000,"daysSinceLastSale": 42,"dataCompletenessScore": 87.5,"agentTypeLabel": "REALTOR® · Paid Member · Buyer & Seller Agent","isFirstRunForAgent": false,"previousReviewCount": 24,"reviewCountDelta": 3,"previousSoldCount": 31,"soldCountDelta": 3,"zip_code": "07101","scrapedAt": "2026-07-30T14:02:11.123Z"}
⚠️ email is always null. Realtor.com's own agent-branding-profile API does not return email addresses on this data surface, so the Actor keeps the field honestly null instead of fabricating a value. If includeMarketAnalytics or enableGrowthTracking is turned off, the corresponding fields above (market-analytics or growth-tracking fields) are simply absent from the row rather than nulled.
🔍 How do you filter and target specific agents?
Four real controls determine exactly which agents you get and how many:
- Zip code targeting.
targetZipCodesaccepts a bulk list, so you can run a single job across every zip code in a metro area rather than one job per zip. There is no radius or "nearby zip" expansion — each zip code is queried independently against Realtor.com's own agent-search index for that zip. - Sort order.
agentSortOrderpicks which agents Realtor.com surfaces first within each zip:RELEVANT_AGENTS(Realtor.com's own relevance ranking),RATINGS_REVIEWS,MOST_SALES,MOST_RECENT_ACTIVITY, orTESTIMONIALS_RECOMMENDATIONS. Since most runs cap results withmaxAgentsPerZip, the sort order decides which agents make the cut, not just their order. - Quality threshold.
minDataCompletenessScoredrops any agent whose computeddataCompletenessScore(percentage of 24 tracked fields that are non-null) falls below your chosen percentage — useful for excluding thin, mostly-empty profiles before they reach your CRM. - Volume control.
maxAgentsPerZipcaps agents per zip code (1–10000). Internally, Realtor.com returns 24 agents per page, and the Actor paginates until it hits your cap or runs out of agents in that zip — whichever comes first.
{ "targetZipCodes": ["10001", "10002", "10003"], "maxAgentsPerZip": 15, "agentSortOrder": "MOST_SALES" }
{ "targetZipCodes": ["90210"], "maxAgentsPerZip": 100, "minDataCompletenessScore": 60 }
{ "targetZipCodes": ["60601"], "agentSortOrder": "RATINGS_REVIEWS", "enableGrowthTracking": true, "monitoringScopeId": "monthly-audit" }
💻 How to extract Realtor.com agent data programmatically
The Actor runs as a standard Apify Actor — start it with one API call, poll or wait for the run, then read the dataset back as JSON.
🐍 Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"targetZipCodes": ["07101", "00501"],"maxAgentsPerZip": 25,"agentSortOrder": "MOST_SALES",}run = client.actor("realtor-com-agents-by-zip-code-scraper-with-market-analytics").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["agent_name"], item["sold_count"], item["averageRating"])
📤 Export to spreadsheets or CRM
Every run's dataset can be exported directly from the Apify Console or API as CSV or Excel. Map agent_name to your CRM's contact-name column, office_phone/mobile_phones to phone fields, company_website to company URL, and sold_count/averageRating to lead-scoring columns — no reformatting needed since the dataset is already flat, one row per agent.
⚖️ Is it legal to scrape Realtor.com agent data?
Yes — scraping publicly listed real estate agent directory data is generally legal, since these profiles (name, brokerage, listings, ratings) are published by Realtor.com specifically to be discovered by prospective clients. This dataset contains personal data about identifiable individuals — agent names, phone numbers, and photos — so GDPR and CCPA obligations attach to how you store and use it, not to whether you may collect it. You need a lawful basis (e.g. legitimate interest for B2B outreach) to retain and act on this data, and affected individuals retain rights to access, correction, and erasure under those regimes. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
Can an agent's listing disappear between runs?
Yes. Agents can leave Realtor.com's directory, stop paying for a featured profile, or simply drop out of the top results for a zip code depending on agentSortOrder. There is no "delisted" flag in the output — if an agent is no longer returned, they simply won't appear in that run's dataset for that zip code.
Can I get ratings and reviews along with the main agent records?
Yes, by default. With includeMarketAnalytics on (default true), every row includes averageRating, recommendationsCount, and review_count alongside the core contact fields — no separate request or extra parameter needed.
How accurate is the contact and performance data?
The Actor returns data exactly as Realtor.com's own agent-search and agent-branding-profile endpoints report it at request time. Accuracy depends on whether the agent and their brokerage keep their Realtor.com profile updated. Recommend validating phone numbers and emails through a separate verification step before outreach — especially since email is always null on this data surface and must be sourced elsewhere.
How many agents can I get per run?
Up to maxAgentsPerZip (or its legacy alias maxItemsPerZipcode) per zip code, 1–10000, across every zip code in targetZipCodes. The Actor paginates Realtor.com's own 24-per-page response until it reaches your cap or runs out of agents actually available in that zip code — whichever happens first, so a small zip code may return fewer agents than requested even at a high cap.
What does the data-completeness score actually measure?
dataCompletenessScore is the percentage of 24 specific fields (name, website, email, listing/sold counts, phones, service areas, company info, ratings, sorting weight, service flags, avatar ID, broker ID, price-range fields) that are non-null for that agent, computed fresh on every run. Set minDataCompletenessScore above 0 to filter out agents with mostly-empty profiles.
Does the Realtor.com Agent Scraper work with Claude, ChatGPT, and AI agent frameworks?
Yes, as a standard HTTP-callable Apify Actor. Any agent framework that can make an authenticated HTTP request can start a run via the Apify API and read back structured JSON — there is no separate MCP server for this Actor.
Can I use this without a Realtor.com account or API key?
Yes. The Actor calls Realtor.com's own public-facing GraphQL endpoint directly; no Realtor.com login, account, or API key is used anywhere in the request flow. You only need an Apify account to run the Actor itself.
What happens on an agent's very first run under a monitoring scope?
isFirstRunForAgent is true and previousReviewCount, previousSoldCount, reviewCountDelta, and soldCountDelta are all null — never a faked 0. From the second run onward with the same monitoringScopeId (or none, if you didn't set one), real deltas appear.
💬 Your feedback
Found a field that doesn't match Realtor.com's live profile, or a zip code that consistently fails? Open an issue on the Actor's Apify Console page with the zip code and parameters used — that's the fastest way to get it looked at.
Conclusion
The Realtor.com Agent Scraper turns Realtor.com's own agent directory into structured, filterable JSON — contact details, sales and ratings performance, computed market analytics, and honest cross-run growth deltas, all in one row per agent. It's built for lead-generation teams, brokerage auditors, and market analysts who need agent data by zip code on a repeatable basis, not a one-off manual export. Configure your target zip codes and sort order, and the Actor handles pagination, retries, and proxy escalation automatically. Start a run from the Apify Console or apify_client to get your first dataset.