Domain.com.au Property Scraper
Pricing
from $2.00 / 1,000 results
Domain.com.au Property Scraper
Domain.com.au scraper & API for Australian real estate: search property for sale & rent and export address, price, beds, baths, parking, land size, property type, agent & agency, inspection times, photos and coordinates. Australia property market data and lead gen — fast, no login.
Pricing
from $2.00 / 1,000 results
Rating
2.0
(1)
Developer
Haketa
Maintained by CommunityActor stats
1
Bookmarked
70
Total users
8
Monthly active users
4 days ago
Last modified
Categories
Share
Domain.com.au Scraper — Australian Property Listings, Prices, Auctions, Agents & Geo
The most complete Domain.com.au scraper on Apify. This Domain.com.au scraper pulls live for-sale, for-rent and recently-sold property listings from Australia's #2 real estate portal — every address, price / price guide, auction date, beds / baths / parking, land size, property type, agent & agency, image gallery and latitude/longitude — normalized into one clean, flat JSON schema. No login, no coding.
Export to JSON, CSV, Excel, or API.
Built for property investors, buyer's agents, valuers and appraisers, mortgage brokers, PropTech & real-estate apps, relocation services, property journalists and housing researchers who need structured Domain.com.au data at scale.
🔎 Why scrape Domain.com.au?
Domain.com.au is the Nine Entertainment-owned real estate marketplace that, together with realestate.com.au, anchors the Australian residential property market. It carries hundreds of thousands of live for-sale, for-rent and recently-sold listings across every suburb, state and territory — each with price guides, auction dates, agent contacts, beds/baths/parking, land size, school-catchment data, photos and precise map coordinates.
That data powers an enormous amount of business: investors comping suburbs, buyer's agents building shortlists, valuers assembling sold-sales bundles, mortgage brokers sizing deals, PropTech apps needing a listings backbone, and journalists covering Saturday auctions. But Domain publishes it behind a Next.js single-page app fronted by Akamai Bot Manager, with no general-access API and aggressive datacenter-IP blocking. Collecting it by hand — copy-pasting prices and addresses suburb by suburb — is slow, error-prone and impossible to keep fresh day over day.
This Domain.com.au scraper does it for you in seconds. Point it at any suburb (or paste a Domain search URL), hit Start, and it returns a clean, de-duplicated, analytics-ready dataset you can download or pipe straight into your warehouse, CRM or dashboard.
Common reasons people scrape Domain.com.au:
- 🏠 Suburb comp scans — pull every active 3-bed house in a suburb and compare against last week's run
- 🔨 Auction pipelines — assemble Saturday-auction lists with dates, agents and guides per metro
- 📉 Price-reduction tracking — a leading indicator of softening markets and motivated vendors
- 📍 Mapping & heatmaps — every record carries
latitude/longitudefor choropleths and proximity analysis - 📞 Agent & agency lead-gen —
agentName,agentPhone(mobile),agentProfileUrl,agencyNameready for a CRM - 💰 Rent & yield analytics — weekly rents by bedroom count and property type per postcode
- 🎓 Relocation & school-catchment research — filter family-friendly suburbs by catchment and beds
✨ What this Domain.com.au scraper does
The actor fetches Domain search-result pages and (optionally) individual listing pages over plain HTTP/2 — no headless browser — and reads the data straight out of each page's embedded __NEXT_DATA__ JSON (the very JSON Domain's own front-end hydrates from). It then normalizes and flattens every record and pushes it to your Apify dataset.
- ✅ Three listing modes —
sale,rentandsoldlistings from any Australian suburb - ✅ Flexible targeting — a 28-suburb picker of capital-city and prestige areas, a free-text
customSuburbsfield for anysuburb-state-postcodeslug, or paste ready Domain.com.au search / listing Start URLs - ✅ Server-side filters — property type, min/max bedrooms, min/max price, and auction-only
- ✅ Automatic pagination — walks result pages suburb-by-suburb and returns hundreds to thousands of de-duplicated listings (deduped on Domain's
listingId), controlled bymaxListingsandmaxPages - ✅ Rich core fields on every card —
listingId,url, fulladdress,suburb,state,postcode,latitude,longitude,priceDisplay+ parsedprice/priceType,propertyType,bedrooms,bathrooms,carSpaces,landSize,agentName,agencyName,agentPhoto, theimagesgallery, plustagsand theisAuction/isNewListing/isPriceReduced/isUnderContract/isHotPropertyflags - ✅ Optional deep detail (
scrapeDetails: true) — visits each listing page fordescription,headline, structuredfeatures,inspectionTimes,schoolCatchments,agentPhone,agentProfileUrl,dateListed,daysOnMarketandstatus - ✅ Multi-format price parser — turns
Auction,Offers Over $785,000,$839,000 - $869,000,$650 pw,Contact Agent,EOI,Guideand more into a canonical numericprice+priceTypeenum - ✅ Akamai-safe by design — an Android-Chrome mobile fingerprint over AU residential IPs, soft-block detection, and fresh-IP retry, so parallel suburb searches never silently drop pages
- ✅ Export anywhere — JSON, CSV, Excel, XML, HTML or the Apify API
Freshly verified: a broad 6-metro run returned 401 de-duplicated listings in 46 seconds with 0 duplicate
listingIds and no value bugs; on a targeted multi-suburb run, standard listings returnedpriceDisplay,propertyType,address,agentName,agencyName,images,latitude/longitudeand thebeds/bathscount at ~100%.
🎯 Use cases
- Property investors & buyer's agents — suburb comp scans, auction-watch pipelines, stale-listing / motivated-vendor finders (
daysOnMarket+isPriceReduced), and hyper-local rent analytics for yield models. - Valuers, appraisers & mortgage brokers — build comparable-sales bundles with
soldPrice,bedrooms,bathrooms,landSize; pre-populate LMI and broker comparison sheets; track market velocity bydaysOnMarket. - PropTech apps & real-estate portals — a structured-data backbone with parsed price guides and normalized property types; saved-search diff alerts; AVM training data from recent sold prices.
- Real-estate agencies & vendor advocates — benchmark agency market share per suburb, recruit performing agents by listing volume, and enrich CRM feeds with current inventory.
- Mortgage brokers & lenders — pipeline outreach to premium-listing agents, refinance triggers from recent nearby sales, and first-home-buyer concierge curation under a price threshold.
- Relocation & migration services — brief inbound expats with rent ranges, filter family-friendly suburbs by
schoolCatchments, and map proximity to an employer usinglatitude/longitude. - Journalists & data reporters — same-day Saturday auction lists, price-reduction trend tracking, and agency league tables.
- Academic & government housing research — rental-affordability quartiles, housing-supply mapping, and auction-vs-private-treaty market-temperature indicators.
📥 Input
Pick a Listing Type and one or more suburbs, then optionally add filters. Leave everything as-is and click Start for a ready mixed sample across major capital cities — no setup required.
| Parameter | Type | Description |
|---|---|---|
listingType | string (enum) | sale, rent, or sold. Drives which Domain section is searched. Default sale. |
suburbs | array<string> | One or more suburb slugs from the dropdown (28 capital-city & prestige areas, e.g. bondi-beach-nsw-2026, south-yarra-vic-3141, surfers-paradise-qld-4217). Defaults to a Sydney/Melbourne/Brisbane sample. |
customSuburbs | array<string> | Advanced. Any extra suburb not in the dropdown, in name-state-postcode form (e.g. manly-nsw-2095, new-farm-qld-4005). |
startUrls | array<string> | Advanced. Paste ready Domain.com.au search or individual listing URLs for fully custom filtered searches. |
propertyTypes | array<string> | Filter to house, apartment, townhouse, villa, land, rural, unitBlock, retire, studio. Empty = all types. |
minBedrooms / maxBedrooms | integer | Bedroom range (0 = no limit). |
minPrice / maxPrice | integer | Price range in AUD (for rentals, interpreted as weekly rent; 0 = no limit). |
auctionOnly | boolean | When true, keep only listings going to auction. Default false. |
scrapeDetails | boolean | When true, visit each listing page for description, features, inspection times, school catchments, agent phone & profile. Richer but slower. Default false. |
maxListings | integer | Hard cap on total listings across all suburbs. 0 = unlimited. A bare default run is auto-capped at a ~150-listing mixed sample. Prefill 100. |
maxPages | integer | Max result pages per suburb (each page ≈ 20 listings). 0 = unlimited. Default 5. |
proxyConfiguration | object | Apify proxy. Australian residential is the default and strongly recommended — Domain blocks datacenter IPs and geo-restricts non-AU traffic. |
requestDelay | integer (ms) | Delay between requests. Keep above 1000 ms for reliability. Default 1500. |
maxConcurrency | integer | How many suburbs to search in parallel (1–10). Default 2. |
Example input
{"listingType": "sale","suburbs": ["bondi-beach-nsw-2026","south-yarra-vic-3141","surfers-paradise-qld-4217"],"customSuburbs": ["new-farm-qld-4005"],"propertyTypes": ["house", "apartment"],"minBedrooms": 2,"maxBedrooms": 4,"minPrice": 800000,"maxPrice": 3500000,"auctionOnly": false,"scrapeDetails": true,"maxListings": 300,"maxPages": 10,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "AU"},"requestDelay": 1200,"maxConcurrency": 3}
📤 Output
Every record uses one flat schema regardless of sale / rent / sold, so downstream warehouses ingest the whole dataset without branching logic. Fields are null when the underlying listing omits them.
Example output item (search mode — fields on every card)
{"listingId": "2021290672","listingType": "sale","saleMethod": null,"url": "https://www.domain.com.au/604-12-16-weemala-street-surfers-paradise-qld-4217-2021290672","promoType": "premiumplus","price": null,"priceType": "unknown","priceDisplay": "Submit All Offers. Must be sold!","priceMin": null,"priceMax": null,"isAuction": false,"auctionDate": null,"address": "604/12-16 Weemala Street","suburb": "Surfers Paradise","state": "QLD","postcode": "4217","latitude": -27.998634,"longitude": 153.42148,"propertyType": "Apartment / Unit / Flat","bedrooms": 2,"bathrooms": 2,"carSpaces": 2,"landSize": null,"agentName": "Tayla Moody","agencyName": "Ray White Malan + Co - Broadbeach","agentPhoto": "https://rimh2.domainstatic.com.au/.../contact_2029394.jpeg","tags": ["New"],"isNewListing": true,"isPriceReduced": false,"images": ["https://rimh2.domainstatic.com.au/.../2021290672_1_1_261031_023719-w1920-h1280","https://rimh2.domainstatic.com.au/.../2021290672_2_1_261031_023719-w1920-h1280"],"searchSuburb": "surfers-paradise-qld-4217","searchType": "sale","scrapedAt": "2026-11-01T23:40:33.690Z"}
Example output item (detail mode — scrapeDetails: true)
{"listingId": "2021270427","listingType": "sale","url": "https://www.domain.com.au/64-warners-avenue-bondi-beach-nsw-2026-2021270427","price": 2500000,"priceType": "auction","priceDisplay": "Auction Guide $2,500,000","isAuction": true,"address": "64 Warners Avenue","suburb": "Bondi Beach","state": "NSW","postcode": "2026","propertyType": "House","bedrooms": 3,"bathrooms": 2,"carSpaces": 1,"agentName": "Oliver Lavers","agentPhone": "0411 294 232","agentProfileUrl": "https://www.domain.com.au/real-estate-agent/oliver-lavers-1632498","agencyName": "TRG","headline": "Classic Bondi Charm with Exceptional Potential in Prized Pocket","description": "Rich in original period charm and character, this c1930s semi presents an outstanding opportunity...","features": ["Swimming Pool", "Secure Parking", "Balcony / Deck", "Dishwasher"],"inspectionTimes": ["2026-10-29T09:00:00 - 2026-10-29T09:30:00","2026-10-31T09:00:00 - 2026-10-31T09:30:00"],"dateListed": "2026-10-23T13:12:13.023","daysOnMarket": 2,"status": "new","images": ["https://rimh2.domainstatic.com.au/.../2021270427_1_1_261023_021213-w3497-h2389"]}
Field reference
Identifiers & URLs
| Field | Description |
|---|---|
listingId | Domain's internal listing ID — stable across runs, ideal for dedup and change detection |
url | Canonical listing URL on domain.com.au |
listingType / searchType | sale, rent or sold |
saleMethod | auction on search-mode auctions; richer values (privateTreaty, eoi, …) when scrapeDetails is on and Domain supplies them |
promoType | Domain's promotion tier (standard, premium, premiumplus, eliteProject, …) |
status | Listing status (new, active, underContract, …) — populated on detail runs |
Pricing
| Field | Description |
|---|---|
price | Normalized numeric price in AUD (weekly rent for rentals). null when the listing shows text only (e.g. "Auction", "Contact Agent") |
priceType | Parsed price type — fixed, range, guide, offersOver, auction, eoi, contactAgent, perWeek, perWeekRange, unknown |
priceDisplay | Original display string ("Auction Guide $2,500,000", "$839,000 - $869,000", "$650 pw") |
priceMin / priceMax | Lower/upper bound when the display is a range |
priceGuide | Free-text estimated-price guide (detail mode, when present) |
soldPrice / soldDate | Final sale price & date (sold listings where the agent discloses them) |
Address & geo
| Field | Description |
|---|---|
address | Street address as displayed (may be partial pre-launch) |
suburb / state / postcode | Suburb name, two-letter state code, 4-digit postcode |
latitude / longitude | Precise map coordinates — present on virtually every record |
councilArea | Local Government Area (detail mode, when disclosed) |
Property attributes
| Field | Description |
|---|---|
propertyType | House, Apartment / Unit / Flat, Townhouse, Villa, Land, Rural, etc. |
bedrooms / bathrooms / carSpaces | Counts (integers) |
landSize / buildingSize | Size in m² where the agent lists it |
Agent & agency
| Field | Description |
|---|---|
agentName | Primary listing agent |
agentPhone | Agent's published mobile (detail mode) |
agentPhoto | Agent headshot image URL |
agentProfileUrl | Agent's Domain profile page (detail mode) |
agencyName | Agency / brokerage brand |
agencyWebsite / agencyProfileUrl | Agency links (detail mode, when Domain exposes them) |
Rich detail (populated on scrapeDetails: true)
| Field | Description |
|---|---|
headline | Agent-written listing headline |
description | Full listing description text |
features | Array of feature strings (e.g. "Swimming Pool", "Secure Parking", "Dishwasher") |
inspectionTimes | Array of open-home strings (e.g. "2026-10-29T09:00:00 - 2026-10-29T09:30:00"), or ["By Appointment Only"] |
schoolCatchments | Array of catchment-school strings (e.g. "Bondi Beach Public School (Primary, Government)") when Domain lists them |
images | Full-resolution image URLs |
floorplanUrl / virtualTourUrl | Floor-plan and 3D-tour/video URLs, when the agent uploads them |
nbnConnection / energyRating | Free-text, agent-disclosed — frequently null |
dateListed / daysOnMarket | First-listed timestamp and days on market |
Flags & metadata
| Field | Description |
|---|---|
tags | Raw Domain tag strings (New, Hot Property, Price Reduced, Under Contract) |
isAuction / isNewListing / isPriceReduced / isUnderContract / isHotProperty | Convenience booleans derived from the listing |
auctionDate / auctionLocation | Auction date (ISO-8601) and venue, for auction listings |
searchSuburb | The suburb slug used in the request (traces records back to inputs) |
scrapedAt | ISO-8601 extraction timestamp |
Honest note on coverage. Core fields (
listingId,url,address,suburb,state,postcode,latitude,longitude,priceDisplay,priceType,propertyType,beds/baths,agentName,agencyName,images) return at or near 100% on standard listings. Some fields are intentionally conditional: numericpriceisnullwhenever a listing shows text only ("Auction", "Contact Agent", "Submit All Offers") — the text is always preserved inpriceDisplay.soldPrice/soldDateapply to sold listings;auctionDate/auctionLocationto auctions.description,features,agentPhone,inspectionTimes,schoolCatchments,floorplanUrl,nbnConnectionandenergyRatingcome from the detail page (scrapeDetails: true) and depend on what the agent discloses — several (school catchments, floor plan, NBN, energy, agent email) are often sparse because Domain does not reliably publish them. Project / off-the-plan development listings (/project/...URLs, common when searching whole-metro "region" slugs) describe a building rather than one unit, so they legitimately carry no per-unit price or bed/bath count but still return address, geo, agency and images.
🔁 Pagination & scale
Each Domain search page returns about 20 listings. For every suburb (or Start URL) the actor reads the embedded __NEXT_DATA__, discovers totalPages / totalListings, then walks pages 1..N — appending ?page=N — until it hits maxPages, the global maxListings cap, the last real page, or an empty page. Independent suburbs run in a small staggered worker pool (maxConcurrency) so throughput scales without tripping Akamai.
All records are de-duplicated on listingId within a run (the fresh verification returned 401 and 80 listings with zero duplicates). There is no hard record cap — raise maxListings, maxPages and the suburb list for metro-wide extraction (10K+ listings). Domain limits per-suburb deep pagination in its own UI (~50 pages); for very dense metros, slice by price band or property type to extract beyond that depth.
⚙️ How to use
- On Apify Console — open the actor, pick a Listing Type and one or more suburbs (or paste a Domain search URL in Start URLs), set
maxListings/maxPages, and click Start. Keep the default AU residential proxy. - Choose an export — download results as JSON, CSV, Excel, XML or HTML from the dataset tab.
- Via API —
POST https://api.apify.com/v2/acts/haketa~domain-com-au-scraper/runs?token=YOUR_TOKENwith your input JSON, then fetch items from the run'sdefaultDatasetId. - On a schedule — use Apify's Scheduler (hourly/daily/weekly/cron) to keep a dataset fresh.
- Integrate — wire the Apify Make / Zapier / n8n connectors, the Google Sheets integration, or a webhook into Postgres/Snowflake/BigQuery, Slack, or your CRM.
API example (Python)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/domain-com-au-scraper").call(run_input={"listingType": "sale","suburbs": ["bondi-beach-nsw-2026", "south-yarra-vic-3141"],"propertyTypes": ["house", "apartment"],"scrapeDetails": True,"maxListings": 200,"maxPages": 10,})for rec in client.dataset(run["defaultDatasetId"]).iterate_items():print(rec["address"], "—", rec["priceDisplay"], f"({rec['bedrooms']}br/{rec['bathrooms']}ba)")
API example (cURL)
curl -X POST "https://api.apify.com/v2/acts/haketa~domain-com-au-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"listingType": "sold","suburbs": ["south-yarra-vic-3141"],"propertyTypes": ["house"],"scrapeDetails": true,"maxListings": 100,"maxPages": 5}'
💡 Tips
- Pick specific suburbs for the cleanest data — whole-metro "region" slugs (
sydney-region-nsw) mix in many off-the-plan project listings that carry no per-unit price/beds. - Turn on
scrapeDetailswhen you need description, features, agent phone, inspection times or days-on-market — but leave it off for fast, cheap price/address/geo sweeps. - Build an auction watch by combining
auctionOnly: truewithscrapeDetails: trueto getauctionDate+ guide + agent per suburb. - Filter prices downstream — Australian listings often show text instead of a number; use
priceTypeandpriceDisplayalongside numericpriceso you never drop a "Contact Agent" listing. - Use
startUrlsto leverage Domain's own URL filters (bedrooms=,price=,excludeunderoffer=1) when you need a combination the picker doesn't expose. - Keep AU residential +
requestDelay≥ 1000 ms — it's what keeps the Akamai bypass reliable.
❓ FAQ
Is scraping Domain.com.au legal? This Domain.com.au scraper collects only public listing data that anyone can view without logging in — addresses, prices, agent business contacts, photos and features that the vendor and agency publish to attract buyers and tenants. It collects no private buyer/enquiry data. Review Domain's Terms of Use and your local rules, and keep use to legitimate research, analytics, journalism, valuation and property-search workflows. You are responsible for how you use the data (e.g. the Spam Act 2003 for any outreach using agent contacts).
How many results can I get, and how fast?
There's no hard cap. A broad 6-metro verification run returned 401 de-duplicated listings in about 46 seconds (search mode). Raise maxListings, maxPages and the suburb list for metro-wide runs of 10K+ listings; detail-enriched runs are slower (an extra fetch per listing).
Do I need proxies or a login? No login or API key — just an Apify token. Proxies are needed: Domain blocks datacenter IPs and geo-restricts non-AU traffic, so the actor defaults to Australian residential proxy with a mobile fingerprint. Keep that default.
What export formats are supported? JSON, CSV, Excel, XML and HTML, plus the Apify dataset API and webhooks.
Is there a Domain.com.au API? Domain's own API is gated behind a commercial partner agreement. This actor is a turnkey Domain.com.au API alternative: run it on demand or on a schedule and read results via Apify's REST API.
How fresh is the data? Live at run time. Whatever is visible on domain.com.au the moment the actor runs is what lands in your dataset. Schedule it to track changes day over day.
Can I filter by price, bedrooms or property type?
Yes — minPrice/maxPrice, minBedrooms/maxBedrooms and propertyTypes filter server-side. Land size, building size and features are returned as fields; filter those downstream in SQL/Sheets/Pandas, or use startUrls with Domain's own URL filters.
Does it handle sold listings and auctions?
Yes. Set listingType: "sold" for recently-sold properties (with soldPrice/soldDate where disclosed), or use auctionOnly: true to keep only auction listings with auctionDate.
Why is numeric price empty on some listings?
Because the listing shows text, not a number ("Auction", "Contact Agent", "Offers Over $785,000" parses, "Submit All Offers" doesn't). The display text is always preserved in priceDisplay, and priceType tells you which convention it used.
Can I extract agent contact details?
Yes — agentName, agentPhoto and agencyName come on every card, and agentPhone (mobile) + agentProfileUrl populate on detail runs (scrapeDetails: true). Agent email is only occasionally present; Domain no longer reliably publishes it in the listing JSON, so treat it as a bonus rather than a guarantee.
Does this work for realestate.com.au? No — this actor is Domain-specific. realestate.com.au is a separate portal with its own strategy.
What happens when Domain changes its site?
The actor reads data straight from each page's embedded __NEXT_DATA__, so routine Next.js redeploys don't break it — there's no build-ID data endpoint to go stale. Every field is read defensively (fallbacks + type coercion), so the core fields keep flowing while any deeper changes are patched.
🔗 Related scrapers
Need property data from other countries — or marketplaces that pair well with Australian property research? These companion scrapers by haketa cover the most-requested catalogues:
- Realtor.ca Scraper (Canada) — Canadian MLS listings across all provinces
- ImmobilienScout24 Scraper (Germany) — Germany's largest property marketplace
- Daft.ie Scraper (Ireland) — Irish homes and rentals nationwide
- Immoweb.be Property Scraper (Belgium) — Belgian residential & commercial
- Boliga Scraper (Denmark) — Danish listings & sold prices
- Apartments.com Scraper (US) — US apartment marketplaces
- SEEK Scraper (Australia/NZ) — Australian job listings for relocation use cases
Ready to pull live Australian property data? Click Start with the defaults for a ready sample, or point this Domain.com.au scraper at your suburbs and export clean listings to JSON, CSV, Excel or API in minutes.