Real Estate AU Agents Scraper – Profiles, Reviews & Stats avatar

Real Estate AU Agents Scraper – Profiles, Reviews & Stats

Pricing

from $1.20 / 1,000 record scrapeds

Go to Apify Store
Real Estate AU Agents Scraper – Profiles, Reviews & Stats

Real Estate AU Agents Scraper – Profiles, Reviews & Stats

Scrape Australian real estate agent and agency profiles by suburb or profile URLs. Returns names, roles, agencies, performance stats, median sold price, days advertised, properties sold, ratings, full reviews, and contact details.

Pricing

from $1.20 / 1,000 record scrapeds

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

13

Total users

5

Monthly active users

5 hours ago

Last modified

Share

realestate.com.au Agent & Agency Scraper: Profiles, Performance Stats & Reviews

This scraper turns realestate.com.au into a structured directory of Australian property agents and agencies: who they are, where they work, how they perform, and what their clients say. Search by suburb and state, or paste profile and search links you already opened in a browser, then export every record as JSON, CSV or Excel, or read it straight through the API.

Why This Scraper?

  • Two record kinds, one actor. Individual agent profiles and whole agency profiles (with the full team roster), each returned in a consistent, flat shape ready for a CRM or lead list.
  • Performance you can rank on. Median sold price, median days advertised, and properties sold as lead agent or secondary agent.
  • Reputation built in. Average rating, total review count, an at-a-glance summary, and the full list of individual reviews (rating, text, reviewer role, date, and the property each review refers to).
  • Contact details where published. Agent mobile and office numbers, agency phone, postal address, and the agency's own website.
  • Two ways to find data. Search by suburb and state, or paste profile and search links you already opened in a browser, in the same run.
  • Resilient by design. A request that gets refused is retried automatically on alternate connections; the run only fails outright once every option has been exhausted, so a quiet suburb is never confused with a run that could not connect.
  • Optional one-click export. Send records, up to a per-run cap, into Notion, Linear, Airtable, or Apify through MCP connectors, without changing what lands in the dataset.

Use Cases

  • Real estate CRMs and lead lists: pull agent and agency contact details, ratings, and coverage areas into your own database.
  • Agent and agency benchmarking: compare median sold price, days advertised, and properties sold across a suburb or region.
  • Reputation monitoring: track review volume, ratings, and sentiment for a shortlist of agents or agencies over time.
  • Recruiting and vendor selection: shortlist top-performing agents or agencies before an appraisal or a hiring decision.
  • Market research and directories: build a suburb-by-suburb map of who is active, with a full team roster for each agency.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
recordType"agent" (also "agency")
agentId"00000001"
name / firstName"Jane Doe" / "Jane"
jobTitle"Sales Executive"
yearsExperience / startYearInIndustry12 / 2012
descriptionfull biography text (fetched with profile details)
mostActiveLocation{ "suburb": "Sample Suburb", "state": "NSW" }
rating.average / rating.totalReviews5 / 82
reviewSummary"Consistently praised for clear communication and strong results."
stats.medianSoldPrice.overall875000
stats.medianDaysAdvertised.overall43
stats.propertiesSold.asLeadAgent / .asSecondaryAgent34 / 41
phone.mobile / phone.office"0400000000" / "0200000000"
specialities["Residential Sales", "First Home Buyers"]
awardslist of named awards, when published
agencyId / agency.name"AAA000" / "Sample Agency"
reviews[0].rating / .text / .reviewerRole / .publishDate5 / "Prompt, clear, and helpful throughout the sale." / "seller" / "2026-01-01"
profileImageUrlagent photo URL
url"https://www.realestate.com.au/agent/jane-doe-00000001"
source"realestate.com.au"
scrapedAt"2026-01-01T00:00:00.000Z"

Agency records (recordType: "agency") carry agencyId, name, a structured address (street, suburb, state, postcode), phone.office, website, rating.average/rating.totalReviews, a performance object, the full team roster in agents[] (each with agentId, name, jobTitle, profileUrl, profileImageUrl, and rating), agentCount, social links, logoUrl, coverPhotoUrl, primaryColor, the isCommercial/isResidential flags, and separate seller and buyer review lists under reviews.seller[] / reviews.buyer[].

How to Use

  1. Pick a mode: location (suburb + state) or url (paste profile or search links you already opened in a browser).
  2. For location mode, choose Search for (agent or agency) and list one or more suburb/state combinations. For URL mode, paste profile and/or search links instead; the location fields are ignored.
  3. Set Maximum records to control run size and cost (default 20, hard ceiling 1,000,000; 0 means no limit up to that ceiling), and use Fetch full profile details and Maximum reviews per record to control how much detail each record carries.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Search for agents in a suburb:

{
"mode": "location",
"searchType": "agent",
"locations": [{ "suburb": "Sydney CBD", "state": "NSW" }],
"fetchDetails": true,
"maxItems": 20
}

Search for agencies in a suburb:

{
"mode": "location",
"searchType": "agency",
"locations": [{ "suburb": "Melbourne", "state": "VIC" }],
"maxItems": 20
}

Scrape specific profiles by URL:

{
"mode": "url",
"urls": [
"https://www.realestate.com.au/agent/jane-doe-00000001",
"https://www.realestate.com.au/agency/sample-agency-AAA000"
]
}

Continue a previous run without duplicates:

{
"mode": "location",
"searchType": "agent",
"locations": [{ "suburb": "Sydney CBD", "state": "NSW" }],
"maxItems": 50,
"resumeFromRunId": "aBcDeFgHiJkLmNoPq"
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/au-property-agents-scraper").call(run_input={
"mode": "location",
"searchType": "agent",
"locations": [{"suburb": "Sydney CBD", "state": "NSW"}],
"maxItems": 20,
})
for record in client.dataset(run["defaultDatasetId"]).iterate_items():
print(record["name"], record.get("agency", {}).get("name"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/au-property-agents-scraper').call({
mode: 'location',
searchType: 'agent',
locations: [{ suburb: 'Sydney CBD', state: 'NSW' }],
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How maxItems and maxPages shape a run

Location mode walks search result pages in order (roughly 24 agents or 12 agencies per page) until it reaches Maximum records, runs out of new results, or hits the site's own last page. Maximum search result pages adds an optional ceiling on how many pages are walked per location; leave it empty and Maximum records stays the only real limit. Once a search has found new records, a later page made up entirely of already-known records ends that search early. Leading pages already covered by a resumed run are walked through rather than treated as the end, so a resume seed does not cut a search short.

URL mode

Supported URL shapes (the urls default and prefill hold one example of each, so URL mode with the field untouched scrapes one example per shape instead of failing):

ShapeExample
Agent search (location)https://www.realestate.com.au/find-agent/sydney-cbd-nsw-2000
Agency search (location)https://www.realestate.com.au/find-agency/sydney-cbd-nsw-2000/
Paginated search (?page=N sets the starting page)https://www.realestate.com.au/find-agent/sydney-cbd-nsw-2000?page=2
Search without surrounding suburbshttps://www.realestate.com.au/find-agent/sydney-cbd-nsw-2000?includeSurrounding=false
Agent profilehttps://www.realestate.com.au/agent/bryn-fowler-132261
Agency profilehttps://www.realestate.com.au/agency/sydney-cove-property-the-rocks-PUHSYD

Any other URL shape is skipped with a warning that names the URL (Skipping unsupported URL ...). A search that matches no suburb logs No agents found for ... (nothing matched this search) or No agencies found for ... instead of returning silently, and a run with no usable locations or URLs stops with No work items.

Reviews

Reviews come with the full profile (fetchDetails on for agents; agencies always). Maximum reviews per record (maxReviews, default 50) caps how many reviews are kept on each record; 0 omits them. Agent records carry a reviews[] list; agency records carry separate reviews.seller[] and reviews.buyer[] lists.

Output views

The dataset has these views (Output tab and ?view= on the API): Results (all records), Overview (compact), Agents (performance, specialities, awards; profiles that list awards or specialities as free text fill awardsText / specialitiesText; recentListings holds the agent's recent sold listings with address, type, beds/baths/parking, price and sold date, and lastSoldDate the most recent of those dates: search results fill them from the agent's search card (up to 5 listings), and with profile details on (or a pasted agent profile URL) they come from the agent's profile page (up to 10 listings); with profile details on, agent records also carry currentListings, the agent's current counts as the site shows them (forSale, forRent, sold and total = for sale + for rent), and currentForSaleListings, up to 3 of their current for-sale listings. The current-listing fields come only from the profile page, so they are left out when profile details are off or the page does not show them), Agencies (address, team size, performance) and Reviews (reviews per record) and Changes (incremental) (change type per record, incremental mode only). Each run also saves a small OUTPUT summary (records pushed, by record type, detail-enriched count, whether the cap was reached).

Resume

Paste a previous run ID or dataset ID from this actor into resumeFromRunId to skip every agent or agency already collected there; the run then returns only new records and does not re-charge for them. Resume is a one-time delta that continues ONE specific earlier run; for a schedule that should report what changed, use Incremental mode below instead. Leave it empty for a normal run.

Incremental mode (recurring monitoring)

Turn on Incremental changes for scheduled runs (incrementalMode) and schedule the actor against the same search. The first run returns every matching agent or agency as NEW. Each later run is compared with the saved state for that search and returns only what changed: NEW (first seen), UPDATED (a tracked field changed; changedFields names it, e.g. rating, phone, reviews), and REAPPEARED (came back after being gone). Every returned row also carries changeType, changedFields, firstSeenAt and lastSeenAt; the Changes (incremental) view lists them.

  • Unchanged records are not returned and not billed (no record event and no profile-enrichment event). Turn on Emit unchanged records (emitUnchanged) to get them marked UNCHANGED (billed like any returned record).
  • Expired records (in the previous run, gone now) are returned as EXPIRED only if you turn on Emit expired records (emitExpired), and only after a run that scanned the whole search: not when Maximum records or Maximum search result pages capped the run, when a pasted URL starts after page 1, when a saved checkpoint continued the run, or when Resume was used. Expired rows are billed like any returned record.
  • What counts as a change: every output field except scrapedAt, yearsExperience (it rises on the calendar), and the numbered image host. Add more with Ignore fields when detecting changes (ignoreFieldsForChanges, dotted names such as rating.totalReviews); ignored fields stay in the output, they are just not compared.
  • State is kept per search (mode, search type, locations or URLs, surrounding suburbs, Fetch full profile details, Maximum reviews per record), so different searches never mix and each review cap has its own baseline (the reviews list is compared, so changing the cap would otherwise flag most records as UPDATED). Set State key (stateKey) to name a campaign or deliberately share one; a named key is not split by the review cap. Changing Maximum records or the proxy does not start a new baseline.
  • Maximum records and unchanged records: unchanged records do not count toward the cap, so every profile on a page is still opened and compared; the run stops once the cap of returned records is reached, and a run stopped by the cap never produces EXPIRED rows.
  • An agent whose profile could not be loaded in an incremental run is skipped for that run (not returned, not compared, not billed) and retried next time.
  • Incremental mode and Resume from run ID do not combine on a search that already has saved state; the run fails with a message telling you to remove one of them.
  • With fetchDetails on, every agent's profile is still opened to check for changes, so an incremental run saves rows and charges, not requests.

Send results into your apps (MCP connectors)

Optionally pipe the scraped records into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where records should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringlocationlocation (suburb + state) or url (paste links).
searchTypestringagentagent or agency. Location mode only.
locationsarraynone (prefill: Sydney CBD, NSW)Suburb, state, and postcode per entry; all three are optional individually.
includeSurroundingbooleantrueInclude agents or agencies from surrounding suburbs.
urlsarrayone example of each supported URL shape (see URL mode)Profile or search URLs (URL mode).
fetchDetailsbooleantrueOpen each agent's profile for contact details, full stats, and reviews. Agencies always include full details.
maxReviewsinteger50Cap on reviews per record. 0 omits reviews.
maxItemsinteger20Stop after this many records. 0 for unlimited.
maxPagesintegernone (walks every result page)Optional bound on search result pages per location; maxItems is the real limit.
proxyConfigurationobjectnone (prefill: Apify Proxy, RESIDENTIAL group, country AU)Connection settings for this run.
resumeFromRunIdstringnonePaste a previous run ID or dataset ID from this actor to skip already-collected agents/agencies.
incrementalModebooleanfalseScheduled monitoring: return only NEW / UPDATED / REAPPEARED records versus the previous run of the same search.
stateKeystringnone (derived from the search)Name a monitoring campaign, or deliberately share state across differently-configured runs.
emitUnchangedbooleanfalseAlso return unchanged records, marked UNCHANGED (billed).
emitExpiredbooleanfalseAlso return records that disappeared, marked EXPIRED, after a fully scanned search (billed).
ignoreFieldsForChangesarray[]Extra field names (dotted) that must not count as a change.
mcpConnectorsarraynoneOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"recordType": "agent",
"agentId": "00000001",
"name": "Jane Doe",
"firstName": "Jane",
"jobTitle": "Sales Executive",
"yearsExperience": 12,
"startYearInIndustry": 2012,
"description": "Full agent biography text appears here when full profile details are fetched.",
"mostActiveLocation": { "suburb": "Sample Suburb", "state": "NSW", "postcode": "2000" },
"rating": { "average": 5, "totalReviews": 82 },
"reviewSummary": "Consistently praised for clear communication and strong results.",
"stats": {
"medianSoldPrice": { "overall": 875000 },
"medianDaysAdvertised": { "overall": 43 },
"propertiesSold": { "overall": 75, "asLeadAgent": 34, "asSecondaryAgent": 41 }
},
"phone": { "mobile": "0400000000", "office": "0200000000" },
"specialities": ["Residential Sales", "First Home Buyers"],
"agencyId": "AAA000",
"agency": { "id": "AAA000", "name": "Sample Agency", "profileUrl": "https://www.realestate.com.au/agency/sample-agency-AAA000" },
"reviews": [
{ "rating": 5, "text": "Prompt, clear, and helpful throughout the sale.", "reviewerRole": "seller", "publishDate": "2026-01-01" }
],
"profileImageUrl": "https://www.realestate.com.au/images/agent-00000001.jpg",
"url": "https://www.realestate.com.au/agent/jane-doe-00000001",
"source": "realestate.com.au",
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

Plan Requirement

The site challenges every automated request, whatever connection it comes from: a plain request through a datacenter, residential or direct connection is refused, so changing the connection tier does not unblock it. The actor solves that challenge itself and reads pages through the Apify Proxy; its default connection setting is Apify Proxy, the RESIDENTIAL group, country AU. Apify free plans do not include residential proxies. On a free plan the run logs:

The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable. For residential access, upgrade at https://apify.com/pricing or supply your own proxy URLs.

and carries on with the backup connection. Contact numbers, profile and record links, the source label, the agency website, and images are included only when the run is served over the residential connection; on any other connection those fields are left out of the affected records (the run logs a warning saying so). A run fails instead of finishing empty with one of these messages:

  • The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required: https://apify.com/pricing. If you entered your own proxy URLs, check that their credentials are valid.
  • No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Australian property agent pages. Upgrade at https://apify.com/pricing or supply your own proxy URLs, then try again.
  • Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later.

A run also fails if a resumeFromRunId you supplied could not be read.

FAQ

How much does it cost?

You pay per record returned, plus one profile-enrichment event per record when Fetch full profile details is on (see the table below). Use Maximum records and Maximum reviews per record to cap the cost of any run.

Billing is pay per event, as currently registered on the Pricing tab (FREE plan prices; paid plans are lower):

EventWhat is billedFREE plan price
Record scrapedonce per agent or agency record returned to the dataset$0.0018
Profile enrichment (detail-enrichment)once per record whose full profile is fetched, charged right after that record is saved, so a run that stops early is only billed for records already delivered; not charged when Fetch full profile details is off; in incremental mode, not charged for unchanged records that are not returned$0.0008
Actor startonce per GB of run memory (minimum one)$0.06

Use Maximum records and Maximum reviews per record to cap the cost of a run.

This actor collects only publicly available agent and agency data. You are responsible for how you use it: follow realestate.com.au's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Names, roles, and performance figures are generally facts, but photos, logos, and review text may be subject to third-party rights.

Can I run this repeatedly without getting duplicate agents or agencies?

Yes. Schedule the actor from the Schedules tab with Incremental changes for scheduled runs turned on: each run returns only the agents and agencies that are new or changed since the last run of the same search, with changeType and changedFields. To continue one interrupted run instead, paste its ID into resumeFromRunId.

Why are some fields empty in my results?

Contact numbers, profile links, the agency website, and images are only populated when the run is served over the residential connection (see Plan Requirement). On an Apify free plan, or with a custom connection setting, those fields are left out; use a paid plan with the default setting and re-run.

Why did my run fail instead of returning an empty dataset?

If every request is refused across every connection the actor tries, the run stops with a clear message so "no agents in this suburb" is never confused with "nothing could be read." Re-run it in a few minutes. If only some locations or URLs could not be read, you still get what was found for the rest.

What is the difference between the two search types?

searchType: agent returns individual agent profiles; searchType: agency returns whole agency profiles, each with its full team roster in agents[]. This choice only applies in location mode; URL mode is classified automatically from the link you paste.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.

🔗 Want more real estate data?

Pair this actor with these related scrapers from the same team:

🏠 Real Estate AU
Extract detailed Australian real estate property listings with 30+ structured fields...
🏠 Commercial Property AU Scraper
Scrape Australian commercial property listings with full detail data. Extract...
🏠 RealestateCo NZ
From $1/1K. Search and extract all real estate properties for sale, rent, and sold across...
🏠 Homely.com.au
Scrape Homely.com.au properties for sale, rent, and sold, plus agent finder, suburb...
🏠 REIWA Scraper
Scrape REIWA.com.au across sale, rental, sold, commercial, business and rural properties...
🚗 Dubizzle.com Scraper
From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.