ECOMMERCEFINANCIAL API MCP READY

Realestate.com.au Property API

Australian residential listings as structured JSON. Buy, rent and sold come from one Actor, searched by suburb, so "Coomera, QLD, 4209" is the whole input and there is no listing URL to find first. Sold rows carry a confirmed sale date, the selling agency and the site's displayed price estimate; rent rows carry the advertised weekly figure. The price is an estimate, not a settled figure, and the page below says so in every place it matters.

MEDIAN LAGon demand
FIELDS40

Input parameters

PARAMETERTYPEREQDEFAULTDESCRIPTION
mode enum yes search search builds the query from suburb, state and postcode and needs no URL. url collects specific listing pages you already hold.
listingType enum no buy buy, rent or sold. sold is what powers sold-price research and is the only listing type that returns a confirmed date.
locations string[] no Australian locations written as "Suburb, STATE" or "Suburb, STATE, POSTCODE". The state is not optional, because several Australian suburbs share a name. Empty searches the whole country. Up to 20 per run.
maxResultsPerSearch integer no 50 Listings returned per search, 1 to 2000. The cap is applied at the source rather than by discarding rows you already paid for, so it is a real ceiling on spend. — drives your bill
daysBack integer no Recency filter, 1 to 365 days. It only applies to a date-sorted search, which the suburb searches this Actor builds are not, so on a suburb search it returns a single error row instead of listings. Leave it empty and schedule instead.
limitPages integer no Cap how many pages of search results to walk, 1 to 50. Useful on large suburbs where you want a sample rather than the whole list.
splitByPropertyType boolean no false Walk houses, units, townhouses and the rest as separate searches. Slower, but reaches deeper into a suburb whose single result list is truncated.
splitByPriceRange boolean no false Same idea by price band. Combine with splitByPropertyType only when one alone still runs out of results.
listingUrls string[] no Specific listing URLs to collect. Required when mode is url, ignored otherwise. Up to 500 per run.

Output schema

FIELDTYPEDESCRIPTIONNULLABLE
result_type string listing or error. Every row is one or the other, so a failed search is visible in the data rather than silently absent. no
searchLabel string The search URL this row came from. Present in search mode, absent in URL mode. yes
propertyId string Stable identifier for the property on the source site. This is the key to diff two runs on. no
listingUrl string Direct link to the listing. no
listingType string Sold, Buy or Rent, capitalised as the source presents it rather than as you passed it in. no
propertyType string Dwelling type, for example House, Unit, Townhouse or Apartment. no
streetAddress string Street address as published. Occasionally withheld, mostly on apartments. yes
suburb string Suburb name. no
fullSuburb string The full address line with suburb, state and postcode as the source formats it, for example "15 Apple Berry Avenue, Coomera, Qld 4209". yes
state string Australian state or territory. yes
postcode string Four-digit Australian postcode, as a string so leading zeros survive. yes
bedrooms integer Number of bedrooms. yes
bathrooms integer Number of bathrooms. yes
parking integer Number of parking spaces. yes
landSize string Land size as published, unit included. Absent on roughly half of a mixed suburb sample, mostly units and apartments. yes
landSizeValue number Numeric land size, parsed for sorting and filtering. yes
landSizeUnit string Unit the land size is expressed in, usually square metres. yes
floorArea string Internal floor area as published. Present on a minority of listings, so do not build a required column on it. yes
floorAreaValue number Numeric floor area. yes
estimatedPrice string The price exactly as displayed. On sold and rent rows that is a figure; on for-sale rows it is often text such as "Contact Agent", "AUCTION" or a written range. no
estimatedPriceValue number Numeric form of the price. Null whenever the listing quotes no figure, which on for-sale searches is common. yes
soldDate string When the property sold, in ISO form. Present on every sold row and confirmed, unlike the price. yes
lastSoldAgency string The agency on the listing. On sold rows that is the selling agency; on buy and rent rows it is the agency currently marketing the property. no
propertyHistoryLink string Link to the source's fuller history page for this property, where one exists. yes
rentPrice string Advertised weekly rent as a bare number in a string, for example "2000". Rental rows only. The human-readable form lives in estimatedPrice. yes
rentCurrency string Currency the rent is quoted in. Always AUD, and populated on every row rather than only on rentals. no
description string Full listing copy as written by the agency, including its formatting quirks and contact details. no
images string[] Photo URLs from the listing. no
photoCount integer How many photos the listing carries. no
latitude number Property latitude. In the raw JSON only, not in either named dataset view. yes
longitude number Property longitude. In the raw JSON only, not in either named dataset view. yes
agents object[] Listing agents, each with agency, phone, rating and reviewCount, plus name and profileUrl where the source publishes them. Sold rows frequently carry the agency without the individual. no
offMarket boolean Whether the listing is off market, normalised from the source's yes and no strings. True on sold rows, false on live buy and rent stock. no
listedAt string When the source last surfaced this listing. Often null on for-sale rows, so it is a weak sort key and a poor recency filter. yes
countryCode string Always AU for this source. no
summary string One-line plain-language summary of the listing, so an agent can read a record without post-processing. no
sourceUrl string The search or listing URL an error row relates to. Error rows only. yes
error_message string Why a search or URL produced no listings, in plain language. Error rows only. yes
error_type string Machine-readable error category, for example CollectionError. Error rows only. yes
fetched_at string UTC timestamp when this row was collected. no

Worked examples

Sold prices in a suburb — the sold-price research run, and the shape most people start from
{
  "mode": "search",
  "listingType": "sold",
  "locations": ["Coomera, QLD, 4209"],
  "maxResultsPerSearch": 50
}
Weekly rents — rent rows carry the advertised weekly figure, ready to schedule into a series
{
  "mode": "search",
  "listingType": "rent",
  "locations": ["Bondi, NSW, 2026"],
  "maxResultsPerSearch": 50
}
For-sale stock across several suburbs — up to 20 locations in one run, each suburb paired with its state
{
  "mode": "search",
  "listingType": "buy",
  "locations": [
    "Coomera, QLD, 4209",
    "Pimpama, QLD, 4209",
    "Upper Coomera, QLD, 4209"
  ],
  "maxResultsPerSearch": 100
}
Cheap test run — five rows is enough to see the schema, and costs about two cents
{
  "mode": "search",
  "listingType": "sold",
  "locations": ["Coomera, QLD, 4209"],
  "maxResultsPerSearch": 5
}
Deep sweep of a large suburb — split the walk when one result list truncates before the suburb runs out
{
  "mode": "search",
  "listingType": "sold",
  "locations": ["Parramatta, NSW, 2150"],
  "splitByPropertyType": true,
  "limitPages": 10,
  "maxResultsPerSearch": 500
}
Specific listings you already hold — url mode, for enriching a shortlist rather than discovering one
{
  "mode": "url",
  "listingUrls": [
    "https://www.realestate.com.au/property-house-qld-coomera-136778134"
  ]
}
POWER-USER TIP
Sanity-check the price on for-sale rows — estimatedPriceValue is null whenever the agent published no figure, and Australian for-sale listings say "Contact Agent" or "AUCTION" often enough that this is normal rather than rare. It can also come back in the price's own written units, so a listing advertised as "Guiding $1.5M" parses to 1.5. Filter for a non-null value and drop anything under a plausible floor before you average a buy search. Sold and rent rows are clean.
POWER-USER TIP
Recency comes from a schedule, not from daysBack — The date filter only applies to a date-sorted search, and the suburb searches this Actor builds are not sorted that way, so supplying daysBack returns one error row explaining the conflict. Run the same search on a schedule instead and diff on propertyId. A new propertyId is new stock, and a propertyId that moves from buy to sold is a sale you watched happen.
POWER-USER TIP
Land size, coordinates and agents live in the raw JSON — The two named views cover the columns most people sort on. landSize, latitude, longitude and the agents block are not in either of them, so pull the raw dataset when you need to map a suburb or match comparables on block size.
POWER-USER TIP
The agent profile URL ships a placeholder — agents[].profileUrl comes through with a literal {cid} token in its query string. Strip the query before you store or follow it; the path itself is correct.
POWER-USER TIP
Volume changes the per-listing price — The per-listing fee runs from $0.004 on the free tier down to $0.00343 at gold, and nothing is charged for a search that returns no listings. maxResultsPerSearch is the ceiling worth setting first, because the cap is applied at the source rather than by throwing away rows you already paid for.
POWER-USER TIP
The suburb needs its state — Several Australian suburbs share a name, so a bare suburb is rejected with a clear message rather than quietly guessed. Adding the postcode narrows it further where a suburb straddles one.

Coverage

3
listing types — buy · rent · sold
20
locations per run — "Suburb, STATE, POSTCODE"
2,000
listings per search — hard cap, applied at the source
500
listing URLs per run — url mode
2
named dataset views — overview · sold

Tasks

Saved runs with the inputs already filled in — each one a standalone page and a working configuration example.

Request a task →

Code

curl

curl -X POST "https://api.apify.com/v2/acts/johnvc~realestate-au-property-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"search","listingType":"sold","locations":["Coomera, QLD, 4209"],"maxResultsPerSearch":50}'

Python

from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/realestate-au-property-api").call(
    run_input={
        "mode": "search",
        "listingType": "sold",
        "locations": ["Coomera, QLD, 4209"],
        "maxResultsPerSearch": 50,
    }
)
for row in client.dataset(run.default_dataset_id).iterate_items():
    if row.get("result_type") != "listing":
        continue
    print(row["streetAddress"], row.get("soldDate"), row.get("estimatedPriceValue"))

Sold-only dataset view

# Address, postcode, sold date, price estimate, agency and history link.
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets//items?view=sold"

Changelog

2026-08-09 0.0.10 Documented every input and output field, and stopped shipping the automated valuation fields that came back empty in live testing.
2026-08-08 0.0.7 Published to the Store, with eight saved example tasks and the recency-filter conflict reported as a readable error row instead of an empty run.
2026-08-06 0.0.1 First build. Suburb search across buy, rent and sold, with the overview and sold dataset views.

What people use it for

Alternatives

Google Maps Places Scraper - Fast & Cheap — schools, shops and transport around an address, which a listing page never gives youours Google Maps Directions API — turns a shortlist into commute times, so suburbs rank by travel not postcodeours LinkedIn Company API — enriches the agencies in lastSoldAgency with headcount and firmographicsours
State land titles offices and paid valuation providers — confirmed settled sale prices, where this source can only give the figure the site displayscompeting
memo23/realestate-au-listings on the same marketplace — also covers realestate.co.nz, so it wins the moment a search crosses to New Zealandcompeting
azzouzana/real-estate-au-scraper-pro on the same marketplace — carries Store reviews where this one has none yet, so judge this one on its documented schema insteadcompeting