Domain.com.au at a glance
Domain.com.au is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes address, suburb, state, postcode and type, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $3.00 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, AI, Developer Tools
- Region
- Oceania
- Pricing
- $3.00 per 1,000 results (Free plan), from $1.50 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 26 options
Extract enriched Domain.com.au property listings across buy, rent, and sold, with AI-enhanced content and deep structured data including descriptions, features, photos, GPS, agent contacts, suburb insights, school catchments, and complete sold and leased price history timelines.
What Domain.com.au can do
- Two ways to search. Filter by suburb, listing type and property criteria, or paste Domain search or listing URLs directly.
- Buy, rent and sold listings from one input, each with full agent and agency contact details, not just a listing summary.
- Optional price history timeline for a property's past sold, listed and leased events.
- Optional property insights: a sale and rental valuation estimate, suburb market trends, planning overlays, NBN connection type, school zoning and nearby childcare.
- Optional extended listing attributes: the indoor and outdoor feature split and a few listing-card fields Domain itself doesn't publish.
- Open for inspection and auction filters surface time-sensitive listings coming up in the next 7 days.
Choose what to collect
These inputs let you configure Domain.com.au - Buy, Rent, Sold & Price History. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | search = build the query from filters below. url = paste Domain.com.au search or listing URLs and let the actor walk them. |
sortBystring | Order results server-side. 'Default' keeps Domain's native order. For sold listings, 'Newest/Oldest' sorts by sale date; for buy/rent it sorts by date listed. Applies in Search mode. Does not sort a pasted URL's results by this key, leave it at Default in URL mode. |
inspectionsOnlyboolean | When on, return only listings with a scheduled inspection in the next 7 days. In URL mode, paste an inspection-times URL (path ending in /inspection-times/) instead. |
auctionsOnlyboolean | When on, return only listings going to auction in the next 7 days. Best used with listing type 'For sale'. Domain has no auction URL to paste, so this toggle is the only way to filter auctions. |
locationsarray | Only used when mode = search. One search runs per location. Accepts a plain suburb name ('Richmond', 'Bondi Beach'), 'Suburb State Postcode' or a Domain slug, e.g. 'Sydney NSW 2000', 'Bondi Beach NSW 2026', 'richmond-vic-3121'. A plain name uses the top match and logs a warning when other suburbs share the name; a name that matches no suburb is skipped with an error. Add the state or postcode to disambiguate same-named suburbs. |
urlsarray | Only used when mode = url. Paste Domain search URLs (e.g. https://www.domain.com.au/sale/melbourne-vic-3000/) or individual listing URLs. Multi-URL supported. Listing type and the filters above (property types, bedrooms, bathrooms, price, exclude-under-offer) apply to these results; filters written in a pasted search URL (ptype, bedrooms, bathrooms, price, excludeunderoffer, sort) win over the matching input field for that URL only. The inspection/auction toggles do not apply. Pagination starts at the page in the URL and walks forward. Leaving this field untouched scrapes one example of each supported URL shape (use maxListings to cap). new-homes, new-home project, real-estate-agents directory and auction-results pages are not supported and log a warning. |
listingTypestring | buy = for sale, rent = for rent, sold = sold listings. Applies in Search mode (selects which listings to search); also narrows a pasted URL's results to sold/leased listings when set to Sold. |
Show 19 more inputs
| Input | What it controls |
|---|---|
propertyTypesarray | Optional. Leave empty for all; selecting more than one keeps a listing that matches any of them. Applies in Search mode and to a pasted URL. |
minBedroomsinteger | Optional minimum bedrooms. Applies in Search mode and to a pasted URL. |
maxBedroomsinteger | Optional maximum bedrooms. Applies in Search mode and to a pasted URL. |
minBathroomsinteger | Optional minimum bathrooms. Applies in Search mode and to a pasted URL. |
minPriceinteger | Optional minimum price. For rent this is the weekly rent. Applies in Search mode and to a pasted URL. |
maxPriceinteger | Optional maximum price. For rent this is the weekly rent. Applies in Search mode and to a pasted URL. |
excludeUnderOfferboolean | When on, hides listings marked under offer / under contract. Applies in Search mode and to a pasted URL. |
fetchPropertyHistoryboolean | Also fetch each property's profile page for the full sold/leased price history timeline and rental estimate. Requires Fetch listing details. Adds one extra request per listing. |
maxListingsinteger | Hard cap on total listings across all searches. Default 20. Set to 0 for no limit (bounded by Max pages, or by the real inventory size when Max pages is also 0). Maximum 1000000. |
maxPagesinteger | Coarse output cap. Each page is ~30 listings. 0 means no limit (walk every page Domain reports for the search). Use Max listings for a finer cap; if both are set, Max listings wins. A hard limit of 1000 pages per search always applies. |
resumeFromRunIdstring | Paste a previous run ID (or its dataset ID) to continue a large pull across separate runs. Listings already saved by that run are skipped, so this run only appends new ones. Leave empty for a normal, fresh run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily/weekly recurring monitoring of the same search. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. What is compared: every listing field, including price, price guide, status, sale method, inspection and auction times, bedrooms/bathrooms/parking/land size, description, features, agency, agents, schools and the enrichment blocks (price history, value estimates, property insights, cross-listing data). Any change to one of these makes the listing UPDATED and names the field in changedFields. What is excluded: the scrape timestamp, the suburb-wide market insights block, the whole images list (photo URLs are signed and rotate between runs, so a changed URL is not a listing change), the listing-card badge text tagText and the order of the agents list; these are still returned on every record. You can exclude more fields with Ignore fields below. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately per location/URL/listingType/filter/enrichment setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the locations/URLs, listing type, filters, and enrichment toggles, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED, e.g. sold, leased, or delisted. Only produced once a run has fully scanned the tracked search, not when Max listings/Max pages capped it, or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names that should NOT count as a change in incremental mode, e.g. description or images. Use dots for nested fields, e.g. agents.photo or inspection.openTime. Ignored fields are still returned on every record and still shown in the output; they only stop a listing being marked UPDATED (and billed) when just they changed. Changing this list never causes a wave of UPDATED rows. Only applies when Incremental mode is on. |
mcpConnectorsarray | Optionally send the scraped listings into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-listing export; other connectors receive a best-effort write/digest. Leave empty to skip, this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which listing pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on how many listings are written to each selected connector per run (protects against very large writes). Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
displayAddressAddress (text)suburbSuburb (text)stateState (text)postcodePostcode (text)listingTypeType (text)propertyTypeProperty (text)pricePrice (text)bedroomsBeds (number)bathroomsBaths (number)parkingSpacesParking (number)agencyNameAgency (text)agentsAgents (array)Show 23 more fields
urlURL (link)idID (text)streetStreet (text)latitudeLatitude (number)longitudeLongitude (number)landSizeLand Size (number)landSizeUnitLand Unit (text)buildingSizeBuilding Size (number)buildingSizeUnitBuilding Unit (text)headlineHeadline (text)descriptionDescription (text)structuredFeaturesFeatures (array)statusStatus (text)firstListedDateListed (text)changeTypeChange (text)changedFieldsChanged fields (array)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)nameAgent (text)phonePhone (text)mobileMobile (text)emailEmail (text)profileUrlProfile (link)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "0000000000",
"url": "https://www.domain.com.au/1-example-street-sample-suburb-nsw-2000-0000000000",
"listingType": "buy",
"displayAddress": "1 Example Street, Sample Suburb NSW 2000",
"addressDisplayType": "FULL_ADDRESS",
"street": "1 Example Street",
"suburb": "Sample Suburb",
"state": "NSW",
"postcode": "2000",
"latitude": -33.8688,
"longitude": 151.2093,
"price": "Contact Agent",
"priceGuide": "Contact Agent",
"bedrooms": 2,
"bathrooms": 2,
"parkingSpaces": 1,
"landSize": 415,
"landSizeUnit": "m2",
"buildingSize": 95,
"buildingSizeUnit": "m2",
"propertyType": "Apartment Unit Flat",
"headline": "Example listing headline.",
"description": "Example multi paragraph description.",
"structuredFeatures": [
"Air Conditioning",
"Built-In Wardrobes",
"Pool",
"Security Access"
],
"saleMethod": null,
"isAuction": false,
"status": "NEW",
"inspection": {
"byAppointmentOnly": false,
"inspections": [
{
"start": "2026-01-03T13:45:00",
"end": "2026-01-03T14:00:00",
"time": "1:45pm",
"dayOfWeek": "Saturday"
}
]
},
"firstListedDate": "2026-01-01T00:00:00",
"agencyName": "Example Real Estate",
"agencyProfileUrl": "https://www.domain.com.au/real-estate-agencies/00000/",
"agencyId": "QWdlbmN5OjAwMDAw",
"agencyAddress": {
"street": "Example Street",
"streetNumber": "10",
"suburb": "Sample Suburb",
"state": "NSW",
"postcode": "2000"
},
"agencyBrandColour": "#000000",
"agents": [
{
"id": "QWdlbnQ6MDAwMDAwMA==",
"name": "Jane Smith",
"phone": "0400 000 000",
"mobile": "0400 000 000",
"email": "jane@example.com.au",
"photo": "https://example.com/agent-photo.jpg",
"profileUrl": "https://www.domain.com.au/real-estate-agent/0000000/"
}
],
"images": [
"https://example.com/hero-image.jpg"
],
"tags": [
"apartment_unit_flat",
"new"
],
"sourceUrl": "https://www.domain.com.au/1-example-street-sample-suburb-nsw-2000-0000000000",
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Buyers and renters: track new listings and price changes in a suburb without refreshing Domain by hand.
- Real estate agencies and PropTech: build a lead or comparables database with full agent, agency and pricing detail.
- Investors and valuers: pull price history and valuation estimates to build a suburb level model.
- Market researchers and media: track inventory, days on market and price trends across suburbs over time.
- Portfolio and compliance monitoring: use incremental mode to catch relisted, repriced or delisted properties on a schedule.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Domain.com.au return?
The documented output for Domain.com.au includes address, suburb, state, postcode, type, property, price and beds. Availability of each field depends on the source page and the selected mode.
How much does Domain.com.au cost?
It costs $3.00 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only new, updated and reappeared listings, and unchanged ones are not returned or billed unless you turn on Emit unchanged.
What is the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific run that got interrupted, it is a one-off. Incremental mode is for running the same search again and again on a schedule and getting only the changes each time; it remembers its own state between runs. See "Resume vs Incremental mode" above for the full detail, including how to bootstrap one from the other.
Why did my run fail instead of returning an empty dataset?
If the actor cannot establish a connection to Domain at the start of the run after several automatic retries, the run fails with a clear error (see Plan Requirement for the exact messages) instead of silently returning nothing. Once connected, a listing or results page that still cannot be read after retries is skipped and logged, so a run can finish with fewer listings than exist; check the run log if the count looks low. A resumeFromRunId that doesn't match a run or dataset you can access also fails fast, and turning on Incremental mode together with resumeFromRunId fails if that state key already has tracked listings from an earlier run, since combining them again would be ambiguous; remove one, or set a different State key.
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 listing summaries into Notion, Linear or Airtable.
