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
| PARAMETER | TYPE | REQ | DEFAULT | DESCRIPTION |
|---|---|---|---|---|
| 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
| FIELD | TYPE | DESCRIPTION | NULLABLE |
|---|---|---|---|
| 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
{
"mode": "search",
"listingType": "sold",
"locations": ["Coomera, QLD, 4209"],
"maxResultsPerSearch": 50
}
{
"mode": "search",
"listingType": "rent",
"locations": ["Bondi, NSW, 2026"],
"maxResultsPerSearch": 50
}
{
"mode": "search",
"listingType": "buy",
"locations": [
"Coomera, QLD, 4209",
"Pimpama, QLD, 4209",
"Upper Coomera, QLD, 4209"
],
"maxResultsPerSearch": 100
}
{
"mode": "search",
"listingType": "sold",
"locations": ["Coomera, QLD, 4209"],
"maxResultsPerSearch": 5
}
{
"mode": "search",
"listingType": "sold",
"locations": ["Parramatta, NSW, 2150"],
"splitByPropertyType": true,
"limitPages": 10,
"maxResultsPerSearch": 500
}
{
"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.
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
- Sold property prices in an Australian suburb
- Weekly rent benchmarking by suburb
- Agency market share from sold listings
- Building a comparable set for a valuation
- Monitoring new for-sale stock in a target area
- Australian property data inside an AI agent
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