Realtor.com Agents Scraper - Profiles & Contact Data avatar

Realtor.com Agents Scraper - Profiles & Contact Data

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Realtor.com Agents Scraper - Profiles & Contact Data

Realtor.com Agents Scraper - Profiles & Contact Data

Extract US real estate agent profiles from Realtor.com by city or ZIP, with available phones, office details, ratings, and sales statistics. Pay per delivered agent row plus a start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

5

Total users

3

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Realtor.com Scraper

Export US real estate agent profiles from Realtor.com as structured rows with public contact details, brokerage information, ratings, and sales statistics.

  • Search agents by a US city and state or ZIP code.
  • Get phones, office addresses, websites, and profile links where available.
  • Compare ratings, listing counts, languages, and served areas.
  • Filter by agent name, membership flag, or listing price range.
  • Pay $3.00 per 1,000 delivered rows on the Free plan, plus a small start fee.

What does Realtor.com Scraper do?

This Actor searches the Realtor.com agent directory. Each dataset row represents one agent, with rowType set to agent and id equal to agentId. Use the results for brokerage research, local market comparisons, or a CRM import, subject to the applicable data-use rules. It collects agent profiles, not property listings.

  • Location search: enter one location as a city and two-letter state or ZIP code. These are two forms of the same search mode.
  • Filtered search: add agentName, isRealtor, minPrice, or maxPrice to narrow that location search.
  • Profile details: enrichProfiles is on by default. It adds available contact, office, license, MLS, and specialization fields to the same agent row, without creating another billed row.

What data can you extract from Realtor.com?

The table describes agent rows. Availability varies by profile; an absent field is not evidence that the agent has no such attribute.

FieldDescriptionExample
rowTypeEntity represented by the row.agent
agentIdSource identifier; also used as the row's id.example-agent-id
nameAgent's displayed name.Jane Doe
profileUrlLink to the agent profile.https://www.realtor.com/realestateagents/example-agent-id
phoneFirst agent phone, or an office phone if needed.+1 555 0100
phonesAgent phone numbers with their source labels.[{"type":"Office","value":"+1 555 0100"}]
officePhonesPhone numbers for the office.[{"type":"Office","value":"+1 555 0101"}]
officeNameReal estate office name.Example Realty
brokerNameProperty broker or brokerage name.Example Brokerage
addressOffice address, including suite when provided.{"street":"123 Example Street","unit":null,"locality":"Austin","region":"TX","postalCode":"78701","country":"US","full":"123 Example Street, Austin, TX 78701"}
websiteAgent's personal website.https://example.com
socialMediaSocial profile links keyed by platform.{"linkedin":"https://example.com/profile"}
averageRatingSource's average rating.4.8
reviewsCountAggregate number of reviews, not review text.12
forSaleCountCount of current listings shown for the agent.6
recentlySoldCountCount of recently sold listings shown.20
forSaleMinLowest current listing price shown.250000
forSaleMaxHighest current listing price shown.750000
languagesLanguages listed on the profile.["English","Spanish"]
servedAreasAreas served, with name and state code.[{"name":"Austin","stateCode":"TX"}]
specializationsListed areas of practice.["Buyer's Agent"]
licenseNumberLicense number when provided.EXAMPLE-LICENSE
licenseStateState associated with the license.TX
mlsMLS membership entries supplied by the profile.[]
bioAgent's profile biography.Example agent biography.
enrichedWhether additional profile details were obtained.true
leadSourceWhether contact fields came from search or profile details.detail
leadAbsencesReasons for unavailable contact fields.{"emails":"闸门锁","geo":"未验证"}
searchLocationLocation used for this search.Austin, TX
scrapedAtCollection timestamp.2026-10-24T00:00:00+00:00

source is realtor.com. The Actor leaves emails as an empty list and geo as null; it does not supply email addresses or coordinates. In leadAbsences, 闸门锁 identifies the email contact-form restriction, and 未验证 marks coordinates as unverified. These are literal output values, not instructions to provide credentials.

How to scrape Realtor.com

  1. Open Realtor.com Agents Scraper in Apify Console.
  2. Enter location, such as Austin, TX or 78701.
  3. Set maxResults to 3 for a small first run. Keep profile enrichment enabled if you need contact fields.
  4. Click Start and check the run status.
  5. Open the dataset and download it, or read its rows through the API.

An empty input starts an example search for Austin, TX, limited to 3 rows from the form's sample values. Normal start and row charges apply to this example. Supplying location selects the location-search mode automatically; there is no mode selector to fill in.

Use a city with its two-letter state, such as Austin, TX, or a ZIP such as 78701. ZIP+4 is also accepted as an input format. A state alone, such as Maryland, is not accepted. The Actor accepts one location per run, not a list of cities.

An agentName value narrows the chosen location; it does not replace it. isRealtor keeps agents marked as members by the site. Price filters concern listing prices used in the agent search, not commissions or service fees. Set enrichProfiles to false when search-level fields are enough.

What to fill in

FieldWhat to enterDefault
locationOne US city and two-letter state, or ZIP code.No fixed default; example uses Austin, TX
agentNameOptional agent name or surname, such as Jane Doe.Empty
maxResultsMaximum agent rows for the location, from 1 to 500.70; form prefill 3
isRealtorKeep only agents marked as members.false
minPriceOptional minimum listing price in USD, zero or higher.Not set
maxPriceOptional maximum listing price in USD, zero or higher.Not set
enrichProfilesAdd available profile details to each agent row.true

Location search:

{
"location": "Austin, TX",
"maxResults": 3,
"enrichProfiles": true
}

The same mode with ZIP and name filters:

{
"location": "78701",
"agentName": "Jane Doe",
"minPrice": 250000,
"maxPrice": 750000,
"maxResults": 3,
"enrichProfiles": false
}
  • maxItems and limit are accepted as aliases for maxResults. Location aliases include city, zip, zipCode, postalCode, and searchLocation.
  • Close misspellings of field names can be corrected. Other unknown fields are ignored, with a note in the input report; they do not fail the run solely because they are unknown.
  • Unusable filter values are dropped. A reversed minimum/maximum price range is swapped.
  • An invalid target stops the run before any rows are collected or charged. For example, a state-only location produces INVALID_INPUT: location: use a US city with its two-letter state .... The start fee can still apply.
  • Each run writes INPUT_REPORT to its default key-value store with the interpreted fields, corrections, ignored fields, and example-run flag. INPUT_ECHO contains the parsed input settings.

Output example

This illustrative row uses placeholder identity and contact data:

{
"rowType": "agent",
"id": "example-agent-id",
"agentId": "example-agent-id",
"name": "Jane Doe",
"profileUrl": "https://www.realtor.com/realestateagents/example-agent-id",
"phone": "+1 555 0100",
"phones": [{"type": "Office", "value": "+1 555 0100"}],
"officeName": "Example Realty",
"brokerName": "Example Brokerage",
"averageRating": 4.8,
"reviewsCount": 12,
"forSaleCount": 6,
"recentlySoldCount": 20,
"languages": ["English", "Spanish"],
"servedAreas": [{"name": "Austin", "stateCode": "TX"}],
"emails": [],
"geo": null,
"leadAbsences": {"emails": "闸门锁", "geo": "未验证"},
"enriched": true,
"leadSource": "detail",
"searchLocation": "Austin, TX",
"source": "realtor.com",
"scrapedAt": "2026-10-24T00:00:00+00:00"
}

You can export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. Use JSON when you need to preserve nested phone, address, and served-area structures. RUN_SUMMARY contains counts and warnings; ERROR_SUMMARY records input or collection failures when they occur.

Why use this Realtor.com scraper?

  • Row-based pricing: apart from the start fee, charges apply to agent rows delivered to the dataset.
  • Details stay together: enrichment fills the same agent row, so it does not add a second row charge.
  • Useful partial profiles: if enrichment fails for an agent, available search data can still be delivered with enriched set to false.
  • Visible limits: the row allowance, free-plan limits, and maximum run cost bound the request.
  • Saved rows remain available: rows already written to the dataset remain there if the run later stops. Do not assume unfinished collection has already been saved.
  • No proxy setup: you do not need to set up proxies.

How much does it cost to scrape Realtor.com?

The Actor uses pay-per-event pricing. Platform usage is included in these prices. The start event costs $0.005 per allocated GB, with a minimum of one event. At the default 512 MB, one start costs $0.005.

Apify planStart at 512 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.0030$3.00
Starter$0.005$0.0030$3.00
Scale$0.005$0.0026$2.60
Business$0.005$0.0022$2.20
Platinum$0.005$0.0020$2.00
Diamond$0.005$0.0016$1.60
  • maxResults applies to the single location input. Its default is 70; larger requests are collected in parts of 70, up to the input maximum of 500.
  • Free Apify plan users are limited to 200 rows per run and 10 runs of this Actor. These are limits set by the Actor developer.
  • The whole run stops at the Maximum cost per run you set in run options, named maxTotalChargeUsd in the API. A budget or limited source matches can produce fewer rows than requested.

Example: 10 delivered agent rows on the Free plan, with the default 512 MB, cost $0.005 + 10 × $0.003 = $0.035. An example run delivering 3 rows costs $0.014 under the same settings. Enrichment does not change the row price.

What happens when the run timeout is too short

If the search is expected to outlast the remaining run time and automatic resumption is accepted, the run can pause instead of failing immediately. Its status message says "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." The run appears as ABORTED while paused.

When results are ready, the same run can resume, deliver rows to the same dataset, and finish as SUCCEEDED. The delivery step skips rows already present in that dataset rather than delivering and charging them again. Keep the default timeout of 3600 seconds to reduce the need for pauses. Genuine collection failures and manual cancellation are not the same as this automatic pause.

The synchronous API endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds. They can return an empty dataset while the run is paused. For longer searches, start asynchronously and read the dataset after SUCCEEDED, or use a webhook for the succeeded event.

Use with AI agents and the API

Apify MCP server

Add the Actor to Claude, ChatGPT, Cursor, VS Code, or another client that supports remote MCP servers:

https://mcp.apify.com?tools=lentic_clockss/realtor-com-agents-scraper

Sign in with Apify using OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; read the rows with get-dataset-items after completion.

Clients without remote MCP support can use:

npx @apify/actors-mcp-server --tools lentic_clockss/realtor-com-agents-scraper

Set APIFY_TOKEN for that command. Example prompt: "Find 3 real estate agents in Austin, TX. Include available phone numbers, office names, ratings, and profile links."

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/realtor-com-agents-scraper").call(
run_input={"location": "Austin, TX", "maxResults": 3}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/realtor-com-agents-scraper')
.call({ location: 'Austin, TX', maxResults: 3 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For asynchronous HTTP use, send the input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~realtor-com-agents-scraper/runs with an Authorization: Bearer header. Once the run succeeds, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json with the same authentication.

Integrations

Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or a webhook. Apify Schedules can repeat the same location search. Compare agentId across exports when maintaining an existing list.

FAQ

The Actor collects publicly available agent data. You are responsible for checking the site's terms and applicable data-protection law for your use. Public professional contact details can still be personal data and require a lawful basis for processing. Availability does not grant permission for unsolicited outreach.

Why did my run end as ABORTED?

An automatic pause can temporarily show ABORTED while results are pending. Check whether the status message explicitly says the run will resume. A manually aborted run or another failure does not have that same meaning; check its status and available error record.

How many results can I get?

Request 1–500 rows for one location, subject to matching profiles and your maximum run cost. The default allowance is 70. Free-plan runs are capped at 200 rows, and the Actor allows 10 free-plan runs. Requesting 500 does not guarantee 500 matching agents.

Why are some fields empty?

Profiles do not all provide the same information. Some details require enrichProfiles to be enabled, and enrichment can fail for individual agents. Check enriched and leadSource. Email addresses and coordinates are not supplied by this Actor, even with enrichment enabled.

Can I search by ZIP instead of city?

Yes. Set location to a ZIP such as 78701, or use City, ST. Do not send a state name alone or an array of locations.

Does enrichProfiles cost more?

There is no additional row charge for enrichment. It adds available detail fields to the same billed agent row and can take longer. Turning it off leaves search-level data, which may still contain some contact fields.

Can a successful run return no rows?

Yes. A valid search with no matching profiles can finish successfully with zero rows. Check the input and the reason in RUN_SUMMARY, then try removing a restrictive name or price filter. A zero-row run can still incur the start fee.

Can I schedule regular searches?

Yes. Save your input in an Apify Schedule and choose the frequency. Each run has its own start and row charges; a recurring schedule does not remove the row allowance or free-plan run limit.

Limitations

  • US agent-directory searches only; no international markets or property-listing collection.
  • One location per run. Direct profile URLs and agent IDs are not supported target inputs for this Actor.
  • No email addresses, contact-form submission, coordinates, or individual review text.
  • Enrichment is optional and does not guarantee complete phone, address, license, or MLS data.
  • Phones, office phones, served areas, languages, designations, specializations, MLS entries, and recently sold listing summaries are limited to 50 entries each within a row; companion count fields describe the source lists.
  • Listing statistics describe what the source shows, not a verified transaction history. Results and profile details can change between runs.

More real estate and property data scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.