Commercial Property AU Scraper - Listings & Agents avatar

Commercial Property AU Scraper - Listings & Agents

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Commercial Property AU Scraper - Listings & Agents

Commercial Property AU Scraper - Listings & Agents

Scrape Australian commercial property listings with full detail data. Extract descriptions, highlights, property attributes, GPS coordinates, nearby places, agents, agencies, images and rich listing metadata.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

3

Bookmarked

53

Total users

11

Monthly active users

2 days ago

Last modified

Share

RealCommercial Scraper: Australian Commercial Property Listings, Prices & Agent Contacts

RealCommercial turns realcommercial.com.au into a clean commercial property data feed. Search by suburb, state, postcode or region, or paste a search link you already filtered in a browser, and get every for sale, for lease, recently sold or recently leased listing that matches: price, floor or land area, tenure, detailed attributes, description, highlights, images, agent and agency contacts, and map coordinates. Export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Two ways to search. Pick a suburb, state, postcode or region, or paste a realcommercial.com.au search link already filtered in a browser.
  • Every listing type. For sale, for lease, recently sold and recently leased commercial properties.
  • Commercial filters built in. Property type, price range, floor or land area, keywords and sort order, without building query strings by hand.
  • Detail-page enrichment. Each listing is opened on its own page for the full description, highlights, detailed attributes, images, nearby places, demographics and downloadable documents.
  • Agent and agency contacts. Names, phone numbers and enquiry links for every listed agent, plus the primary agency and any other agencies on the listing.
  • Built for schedules. Incremental mode returns only new, updated and reappeared listings on recurring runs, and a bad input fails loudly instead of silently returning nothing.
  • Resume long crawls. Continue an interrupted run from its run or dataset ID without paying twice for listings already collected.

Use Cases

  • Commercial property investors and analysts: track new listings, price ranges and floor areas across suburbs or an entire state.
  • PropTech platforms and brokerages: build an internal Australian commercial listings database with agent and agency contact details.
  • Site selection teams: compare warehouse, retail, office and land availability by suburb, property type and price band.
  • Valuers and researchers: pull recently sold and recently leased comparables for a suburb or property type.
  • Market monitoring teams: watch a saved search on a schedule and get only the listings that are new, changed or gone.

Data You Get

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

FieldExample
propertyId"505197008"
urlfull link to the listing on realcommercial.com.au
listingType"for-sale" (also "for-lease", "sold", "leased")
propertyTypes["offices"]
tenureType / tenureTypeDisplay"vacant" / "Vacant Possession"
title"Prime CBD Office Suite"
address.suburb / address.state / address.postcode"Melbourne" / "VIC" / "3000"
price.display"$2,400,000"
price.value / price.isRange2400000 / false
attributes.area / attributes.areaValue / attributes.areaUnit"367 m²" / 367 / "m²"
attributes.carSpaces4
highlights["Prime CBD location", "Recently refurbished"]
status / daysActive"New" / 12
hasTour / producttrue / "elite"
media.imageCount18
agentsname, phone and enquiry link for each listed agent
agencyprimary agency name, phone and address
nearbyPlacesnearby transport, schools and other places (when available)
demographicData.summarysuburb-level demographic summary text (when available)
latitude / longitude-37.8136 / 144.9631
changeType"NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED"; incremental mode only)
scrapedAttimestamp of the scrape

Each record also carries the full description text, description metadata such as phone numbers found in the text, downloadable documents, virtual tour and external website links, conjunctional and other agency names, the canonical page path, a high quality listing flag, map precision, and the listing's last updated timestamp.

How to Use

  1. Pick a mode: location (choose a suburb, state, postcode or region and filters below) or url (paste one or more realcommercial.com.au search result links you already filtered).
  2. For location mode, add one or more locations and set listing type, property types, price range, area range and keywords as needed. For url mode, paste the links instead; the location and filter fields are ignored.
  3. Set Maximum Listings and Maximum Pages to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Offices for sale in Melbourne:

{
"mode": "location",
"locations": [{ "suburb": "Melbourne", "state": "VIC" }],
"listingType": "for-sale",
"propertyTypes": ["offices"],
"maxListings": 50
}

Warehouses for lease across a whole state, with a price range:

{
"mode": "location",
"locations": [{ "state": "QLD" }],
"listingType": "for-lease",
"priceMin": 20000,
"priceMax": 60000,
"maxListings": 100
}

Paste an already-filtered search link (url mode):

{
"mode": "url",
"urls": ["https://www.realcommercial.com.au/for-sale/retail/in-sydney,nsw+2000/"],
"maxListings": 200,
"maxPages": 5
}

Daily monitoring of a lease search:

{
"mode": "location",
"locations": [{ "suburb": "Parramatta", "state": "NSW" }],
"listingType": "for-lease",
"incrementalMode": true,
"stateKey": "parramatta-lease-watch"
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/realcommercial-au-scraper").call(run_input={
"mode": "location",
"locations": [{"suburb": "Melbourne", "state": "VIC"}],
"listingType": "for-sale",
"maxListings": 50,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["title"], listing["price"]["display"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/realcommercial-au-scraper').call({
mode: 'location',
locations: [{ suburb: 'Melbourne', state: 'VIC' }],
listingType: 'for-sale',
maxListings: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

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

Maximum Listings and Maximum Pages

Maximum Listings stops the run once that many records have been pushed across all locations or URLs; set it to 0 for the maximum of 1,000,000 listings. Maximum Pages caps how many search result pages are read per location or URL, at roughly 25 results per page; set it to 0 for no limit up to the always-on hard cap of 100 pages per location or URL. Saved tasks that relied on 0 for unlimited therefore stop after 100 pages (about 2,500 listings) per location or URL; split a larger area into suburbs or add filters to read more. A URL that already includes a ?page= number starts from that page and continues forward for the given number of pages.

Url mode now starts with two example searches filled in (https://www.realcommercial.com.au/for-lease/in-melbourne,+vic+3000/ and https://www.realcommercial.com.au/for-sale/offices/?locations=in-sydney,nsw). If you run in url mode without changing the URLs field, or leave it out of an API call, those two searches are scraped (up to Maximum Listings) instead of the run failing with no URLs. Replace them with your own links.

Link shapeExampleResult
Listing type + location path/for-lease/in-melbourne,+vic+3000/Scraped
Listing type + property type + location path/for-sale/offices/in-melbourne,+vic/Scraped
Listing type + ?locations= query/for-sale/offices/?locations=in-sydney,nswScraped
Sold or leased search/sold/in-sydney,+nsw/, /leased/in-sydney,+nsw/Scraped
Search with ?page=N/for-sale/in-melbourne,+vic?page=3Scraped, starting at page N
Single property page/property-...-502012345Skipped, a warning names the URL
Other site or unrecognised path/agencies/Skipped, a warning names the URL

If every URL is skipped the run stops with an error instead of returning an empty dataset.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every listing already collected there, so you don't pay twice.
  • Incremental mode (incrementalMode) is for running this same search again and again, for example daily. Each listing is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED, or EXPIRED (only after a run that scanned the whole tracked search, and only with emitExpired). A listing is UPDATED when any field changes; scrapedAt, lastUpdatedAt, the order of the agents list, and anything in ignoreFieldsForChanges are never compared (they remain in the output). Changing the ignore list causes no one-time wave of UPDATED. EXPIRED is never produced from a partial scan: a capped run, a pasted URL starting at page 2 or later, or a resumed run. stateKey names or shares the stored state; leave it empty to let the actor derive one automatically from the mode, locations or URLs, and filters. With incremental mode off, records carry no changeType, changedFields, firstSeenAt or lastSeenAt fields.

Output views and run summary

The dataset has five views: Overview, Media, Agents, PDP Details and Changes (incremental mode), which lists propertyId, listingType, address, url, changeType, changedFields, firstSeenAt and lastSeenAt. Runs with several locations or pasted URLs also save an OUTPUT summary with searches started, pages loaded, listings pushed and whether every search reached its natural end.

Sorting and filters

Sort with sortBy: featured, date-desc (default), date-asc, price-desc, price-asc. Filters: propertyTypes, priceMin/priceMax, areaMin/areaMax (floor or land area), landAreaMin/landAreaMax (site area), tenure (vacant-possession or tenanted-investment) and keywords. They apply in location mode; in url mode filters come from the link itself.

Send results into your apps (MCP connectors)

Optionally pipe the scraped listings 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 listing, not the full JSON. Each item becomes one entry with a title (the listing's title or address) 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 listing pages 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 (pick suburb, state, filters) or url (paste search links). Fields for the other mode are ignored.
locationsarraysampleLocations to search: state is required, suburb, postcode and region are optional. Location mode only.
listingTypestringfor-salefor-sale, for-lease, sold, or leased. Location mode only.
propertyTypesarray(none, all types)Filter by commercial property type. Location mode only.
sortBystringdate-descfeatured, date-desc, date-asc, price-desc, or price-asc. Location mode only.
priceMininteger(none)Minimum property price (AUD). Location mode only.
priceMaxinteger(none)Maximum property price (AUD). Location mode only.
areaMininteger(none)Minimum floor or land area in square metres. Location mode only.
areaMaxinteger(none)Maximum floor or land area in square metres. Location mode only.
landAreaMininteger(none)Minimum land (site) area in square metres, separate from floor area. Location mode only.
landAreaMaxinteger(none)Maximum land (site) area in square metres. Location mode only.
tenurestring(none)vacant-possession or tenanted-investment. Location mode only.
keywordsstring(none)Keywords to search, for example co-working or warehouse. Location mode only.
urlsarraytwo example searches (see below)Search result page URLs to scrape. Url mode only.
maxListingsinteger20Stop after scraping this many listings across all locations or URLs. 0 = the maximum, 1,000,000.
maxPagesinteger0Maximum search result pages to process per location or URL, roughly 25 results per page. 0 = no limit; a hard cap of 100 pages per location or URL always applies.
resumeFromRunIdstring(none)Paste a previous run ID or dataset ID to continue a large crawl without re-collecting or re-charging for listings already saved there.
incrementalModebooleanfalseTurn on for daily or recurring monitoring: later runs return only new, updated and reappeared listings.
stateKeystring(none)Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Incremental mode only.
emitUnchangedbooleanfalseAlso return, and bill, listings that have not changed since the last run. Incremental mode only.
emitExpiredbooleanfalseAlso return, and bill, listings that were present in a previous run but are no longer found. Incremental mode only.
ignoreFieldsForChangesarray[]Field names (dots for nested, e.g. agents.phone) left out of change detection and changedFields; they stay in the output. Incremental mode only.
proxyConfigurationobjectsample (RESIDENTIAL, AU)Proxy and connection settings. See Plan Requirement below.
mcpConnectorsarray(none)Optional: send a summary of each listing to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which listing pages are created.
maxNotifyListingsinteger50Cap on how many listings are written to each selected connector per run.

Output Example

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

{
"propertyId": "505197008",
"url": "https://www.realcommercial.com.au/for-sale/offices/in-melbourne,vic+3000/property-505197008",
"listingType": "for-sale",
"propertyTypes": ["offices"],
"tenureType": "vacant",
"tenureTypeDisplay": "Vacant Possession",
"title": "Prime CBD Office Suite",
"description": "A well presented office suite in the heart of the CBD, close to transport and amenities.",
"highlights": ["Prime CBD location", "Recently refurbished", "Secure basement parking"],
"status": "New",
"daysActive": 12,
"hasTour": true,
"product": "elite",
"address": {
"street": "123 Example Street",
"suburb": "Melbourne",
"state": "VIC",
"postcode": "3000",
"full": "123 Example Street, Melbourne VIC 3000"
},
"price": {
"display": "$2,400,000",
"value": 2400000,
"min": 2400000,
"max": 2400000,
"isRange": false
},
"attributes": {
"area": "367 m²",
"areaValue": 367,
"areaUnit": "m²",
"carSpaces": 4
},
"media": {
"imageCount": 18,
"images": [{ "url": "https://www.realcommercial.com.au/image/800x600/sample-listing-1.jpg", "alt": "Building exterior" }]
},
"agents": [
{
"name": "Jordan Smith",
"phone": { "display": "0400 000 000", "dial": "0400000000" },
"enquiryUri": "/for-sale/offices/in-melbourne,vic+3000/property-505197008/enquiry"
}
],
"agency": {
"name": "Example Realty Group",
"phone": { "display": "03 9000 0000", "dial": "0390000000" },
"address": "Level 1, 123 Example Street, Melbourne VIC 3000"
},
"latitude": -37.8136,
"longitude": 144.9631,
"scrapedAt": "2026-09-28T02:00:00.000Z"
}

Plan Requirement

RealCommercial protects every page with an anti-bot challenge that no plain request passes on any connection type: Apify datacenter, Apify residential and a home connection are all refused. The actor therefore opens a verified session first and then reads pages through it. This is measured, not assumed, so do not expect it to work without a proxy.

  • Default setting. The proxy is preset to Australia's residential group, which is the connection the actor tries first. Keep it unless you need another exit country.
  • Apify free plans do not include residential proxies. When the selected connection is unavailable 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." and then continues on a backup connection. If that also cannot load the pages, the run fails with: "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 RealCommercial pages. Upgrade at https://apify.com/pricing or supply your own proxy URLs, then try again."
  • No proxy access at all. The run fails with: "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."
  • Site refusing every connection. The log shows "Connection blocked by site on every available connection. Try again in a few minutes." If no page could be loaded the run fails with "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." Such a run is a connection failure, never an empty result.

Which fields you get depends on the Proxy configuration you select. When it does not select the Apify RESIDENTIAL group (including leaving it empty), records omit url, media, agents/agent, agency, conjunctionalAgencies, otherAgencies and statementOfInformationUrl, and the run logs that some fields are left out. Selecting RESIDENTIAL (the preset) returns them.

FAQ

How much does it cost?

You pay per record returned. The Pricing tab shows the current rate. Use Maximum Listings to cap the cost of any run.

This actor collects only publicly available commercial property listings. You are responsible for how you use it: follow realcommercial.com.au's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Agent and agency contact details are published by the site itself for enquiries.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then classifies every listing as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED against the previous run for that same search, and unchanged listings are not billed unless you turn on Emit unchanged.

Why does url mode ignore my location and filter fields?

Location mode and url mode are two different ways to describe the same search. Location mode builds the search from the location and filter fields in this input. Url mode reads an already-filtered realcommercial.com.au search link instead, and ignores the location and filter fields entirely. Pick one mode for a run; check which mode is selected before assuming a filter "didn't work".

Why do some fields come back empty?

Fields such as nearbyPlaces, demographicData and tenureType only appear when the listing itself publishes them. Descriptions, highlights, images and contacts come from each listing's detail page automatically. If the Proxy configuration does not select the Apify RESIDENTIAL group, the listing URL, media, agents, agencies and statement-of-information link are left out of every record; the preset RESIDENTIAL selection returns them.

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

A run fails when its input can't be used at all: a minimum price or area set above the matching maximum, no valid locations or URLs configured for the selected mode, a Resume from a previous run ID or dataset ID this Apify account can't read, or incremental mode with saved state for the search while Resume is also set. If the input is valid but a search matches nothing, the run finishes with a warning. If not a single results page could be loaded (see Plan Requirement), the run fails rather than reporting an empty result.

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...
🏠 View.com.au Scraper
Scrape View.com.au properties for sale, rent and recently sold across Australia. Search...
🏠 Domain.com.au
Extract enriched Domain.com.au property listings across buy, rent, and sold, with...
🏠 Real Estate AU Agents Scraper
Scrape Australian real estate agent and agency profiles by suburb or profile URLs...
🏠 CommercialGuru SG Property Listings & Agent Contacts Scraper
Scrape commercialguru.com.sg Singapore listings at scale. Extract prices, PSF, floor...
🏠 Funda in Business Scraper
Scrape Funda in Business commercial listings: offices, retail, industrial, catering and...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 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.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.