# Australian Property Data API - AVM, Sales, Listings (`nabeelbaghoor/australian-property-data-api`) Actor

Australian residential property data: match an address to a property, then read its attributes and source dates, planning and tenure, recorded sales with price suppression flags, current and past listings, sale and rental valuations, auction results and suburb market metrics.

- **URL**: https://apify.com/nabeelbaghoor/australian-property-data-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Real estate, Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 address matcheds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Australian Property Data API - AVM, Sales, Listings

Look up any Australian residential property: match an address to a property, read its attributes with the dates they were sourced, its planning and tenure, every recorded sale with the source that reported it, its current and past listings, an automated sale or rental valuation, and the auction results and market metrics for the suburb around it.

### What this actor does

- **Address to property ID, with a confidence score.** Match resolves free text to exactly one property and tells you how sure it is. When it will not narrow, suggest mode returns ranked candidates instead of a guess. Everything else keys off that property ID.
- **Attributes with their source dates.** Bedrooms, bathrooms, car spaces, land, floor and living area, property type, roof and wall type, year built, land use and the feature list - each with the date the provider last sourced it. A bedroom count sourced in 2014 is a different fact from one sourced last month, and this actor keeps the difference.
- **Recorded sales with the source that reported them.** Valuer General registered transfers and agent-advised sales are two different claims about the same market, with different lags and different reliability. The source is a first class column on every transaction row, never averaged across.
- **Price suppression handled honestly.** Some Australian jurisdictions restrict publication of a sale price, and the provider flags those. The flag rides beside the value on every row, so a suppressed price never enters a median as a zero.
- **Listings, current and historic.** Sale and rental listings with their status, advertised price, first seen date, auction date and time, description, images, energy efficiency rating and a direct link to the statement of information where one is attached.
- **Automated valuations with their uncertainty.** Sale and rental valuations across all four products - enquiry, origination, plus and pro - returning the estimate, its lower and upper range, the forecast standard deviation and the confidence level. Plus and pro accept your own bedroom, bathroom and car space figures, which is how you value a property as renovated rather than as recorded.
- **Search by area or by radius.** Properties, listings and transactions by suburb and postcode, or outward from a centre property or coordinate, filtered by bedrooms, bathrooms, car spaces, land area, living area, price and date. Transaction searches can narrow to the same street or even the same building, which is what unit comparables actually need.
- **Market metrics and auction results.** Median and mean sale and rental prices, transaction volumes, days on market, hold periods, rental yields and buyer and renter demand, by suburb, state or capital city area, at your choice of frequency and aggregation window.
- **Census demographics.** One row per measure for a suburb, state or greater capital city area.
- **Pay per result.** You are charged for rows carrying a real record. Addresses the provider cannot match and searches that return nothing are free.

### Bring your own key

This actor calls the provider with **your own api key and api secret**. Paste both into the input, or set the secret as the `DATA_API_KEY` secret. Nothing runs on anyone else's credentials, and a run without them ends cleanly with an explanation rather than failing.

The two values are base64 encoded together and sent in the `Authorization` header. The provider states it does **not** accept them as form parameters, so there is exactly one correct way to send them and several that look correct. This actor gets that right.

### If the API answers with an HTML "Access Denied" page

This one is worth knowing before it happens. The provider's production host sits behind an edge network that can block a caller by IP address, and when it does, **every path answers with an HTML page rather than JSON** - including paths that do not exist. Verified against the live host while building this actor.

That failure looks nothing like an API error and is easy to mistake for a bad credential. This actor detects it, reports it as a network level block rather than an authentication problem, and pulls out the edge reference number so you can hand it to the provider's support team, which is what their own documentation asks for. Running from a different network is the other fix.

### Suppressed sale prices are not zeros

In several Australian states the sale price of a property may not be published. The provider marks those transactions with a suppression flag rather than omitting them, because the sale itself is still a real event with a real date.

A pipeline that reads the missing price as `0` drags every median it touches downwards. One that ignores the flag entirely may publish something it is not allowed to. So the flag sits beside the value on every transaction row, and on the recent sale on every property row, and the value is left exactly as the provider sent it.

### Two sources for the same sale

Transactions come from either the state Valuer General - a registered transfer, authoritative but lagged by the registration process - or from the selling agency, which is faster but self-reported. They disagree, and the disagreement is informative rather than noise.

You can filter to one source, and every row records which one it came from either way, so a downstream average never silently mixes a registered price with an advertised one.

### Example output

```json
{
  "recordType": "transaction",
  "requested": "RICHMOND 3121 VIC",
  "found": true,
  "propertyId": "3987592",
  "fullAddress": "21 STANLEY ST RICHMOND VIC 3121",
  "latitude": -37.82364584,
  "longitude": 144.99504193,
  "sourceCategory": "vg",
  "transactionDate": "2024-11-28",
  "contractDate": "2024-11-06",
  "transferDate": "2025-01-15",
  "transferType": "full",
  "saleValue": 1350000,
  "saleValueSuppressed": false,
  "listingId": "146535076",
  "daysOnMarket": 24,
  "bedrooms": 3,
  "bathrooms": 1,
  "carSpaces": 4,
  "landArea": 420,
  "propertyType": "house",
  "landUse": "residential"
}
```

### FAQ

#### What Australian property data does this actor return?

For a property: the standardised address and coordinates, bedrooms, bathrooms, car spaces, land, floor and living area, property type, roof and wall type, year built, land use, features, parcel plan and lot numbers, current market status, active listings, and the most recent sale. Optionally also planning and zoning, tenure history, the full listing history and the full sale history. For an area: listings, recorded sales, auction results, historic market metrics and census demographics.

#### How do I find a property ID from an address?

Run address match mode with the address as free text. It returns exactly one property with a match score, or reports that the text did not narrow to a single property. For partial or ambiguous addresses, address suggest mode returns ranked candidates you can pick from before spending a property lookup.

#### What is the difference between the enquiry, origination, plus and pro valuations?

Enquiry is the general purpose automated valuation. Origination is the lending grade product and is mandatory for new customers on some request paths. Plus combines a sale and a rental valuation in one request. Pro adds environmental hazard information on top of that. Plus and pro are sale side products, so a rental valuation requested under them falls back to enquiry rather than being refused.

#### Why does a valuation come with a forecast standard deviation?

Because an automated valuation without a measure of its own uncertainty is a number pretending to be a fact. The forecast standard deviation is the model's statement of how wide the estimate really is, and lenders commonly set policy thresholds on it. It is returned alongside the estimate, its lower and upper range, and the confidence level.

#### Can I get sold prices for Australian properties?

Yes, from two sources that are kept apart: Valuer General registered transfers and agency-advised sales. Every transaction row records the source, the sale value, the transaction, contract and transfer dates, and an explicit flag for whether the price is suppressed under state rules. Suppressed prices are flagged rather than zeroed, so your medians stay honest.

#### How do I get comparable sales for a unit?

Run a transaction search in point and radius mode with the subject property as the centre, and set proximity to same building. That returns sales inside the same complex rather than within a radius that would sweep in freestanding houses on the same street. Same street and same suburb are the wider settings.

#### What market metrics are available?

Sale side: median and mean sale price, sale transaction volume, mean hold period and median days on market. Rental side: median and mean rental price, median rental yield, rental transaction volume and median days on market. Demand: potential buyers and potential renters. Median days on market exists in both families and means something different in each, so every row records which family it was read from.

#### Does it cover all Australian states?

The address, property, listing and transaction data covers all eight states and territories. The provider wants state codes lowercase and refuses other casing, which returns an empty run rather than an error, so this actor presents them as a fixed list and sends the form the API wants. Coverage depth for recorded sales varies by state because it follows each state's own land registry publication rules.

### Keyword map

Australian property data API, Australia real estate API, property data API Australia, AVM API Australia, automated valuation model Australia, property valuation API, sold prices Australia API, property sales history API, Valuer General data API, real estate listings API Australia, rental listings API, auction results API, suburb market data API, median house price API, rental yield data, days on market data, property attributes API, UPRN equivalent Australia, property ID lookup, address matching API Australia, census demographics API, statement of information, comparable sales API, unit comparables, forecast standard deviation AVM

# Actor input Schema

## `mode` (type: `string`):

Address match resolves free text to exactly one property, which every property mode needs. Address suggest offers candidates when a partial address will not narrow. Property report reads one property in full. Property search finds properties by area and attribute ranges. Listing and transaction search look around a point or inside a suburb. Valuation orders an automated valuation. Auctions, market metrics and demographics describe the area rather than the property.

## `addresses` (type: `array`):

One Australian address, or part of one, per line. Used by address match and address suggest.

## `propertyIds` (type: `array`):

One property ID per line, for property report and valuation modes. Address match mode is how to turn an address into one.

## `listingIds` (type: `array`):

One listing ID per line, for listing by ID mode.

## `numberOfResults` (type: `integer`):

How many candidates address suggest returns per line.

## `includeFullAttributes` (type: `boolean`):

Call the attributes endpoint as well as the summary, adding roof type, wall type, living area, land use and the feature list. Doubles the request count per property, which is why it is optional.

## `includePlanning` (type: `boolean`):

Emit a planning and zoning row for each property.

## `includeTenure` (type: `boolean`):

Emit one row per historical tenure record for each property.

## `includePropertyListings` (type: `boolean`):

Emit one row per current and historic listing for each property.

## `includeTransactions` (type: `boolean`):

Emit one row per recorded sale for each property, with the source that reported it and whether the price is suppressed.

## `latestListingOnly` (type: `boolean`):

Return only the most recent listing for each property rather than its whole listing history.

## `latestTransactionOnly` (type: `boolean`):

Return only the most recent recorded sale for each property rather than its whole sale history.

## `searchArea` (type: `string`):

Whether a listing or transaction search works outward from a point or inside a suburb and postcode. A point search needs either a centre property ID or a latitude and longitude.

## `suburb` (type: `string`):

Suburb name to search within.

## `postcode` (type: `string`):

Four digit Australian postcode to search within.

## `state` (type: `string`):

Australian state or territory. The provider wants these lowercase and refuses other casing, which is the kind of thing that returns an empty run rather than an error, so the choice is made for you here.

## `boundingBox` (type: `string`):

A bounding box for property search, which can stand in for a state and suburb.

## `gccsaCode` (type: `string`):

A Greater Capital City Statistical Area code, for auction results and demographics scoped to a whole capital city.

## `centrePropertyId` (type: `string`):

The property a point and radius search works outward from. Using a property rather than a coordinate is usually what you want for comparables, because it centres on the building rather than on a rooftop pin.

## `latitude` (type: `number`):

Latitude of a point and radius search, when no centre property is given.

## `longitude` (type: `number`):

Longitude of a point and radius search, when no centre property is given.

## `radius` (type: `number`):

How far around the centre point to search, in the units the provider documents for the endpoint.

## `proximity` (type: `string`):

Narrow a transaction search to the same street, the same building or the same suburb as the centre property. Same building is what you want for unit comparables.

## `coordinatesOnly` (type: `boolean`):

Ask a property search for coordinates rather than full summaries. The cheap way to build a map layer from a search you will enrich later.

## `listingTypes` (type: `array`):

Whether a listing search returns properties for sale, for rent, or both.

## `listingType` (type: `string`):

Restrict a property's own listings to sale or rent in property report mode.

## `listingStatus` (type: `string`):

Which listing state to return. Sold and leased are completed outcomes; not sold and not leased are listings that came off the market without one, which is a different signal.

## `propertyTypes` (type: `array`):

Which property types a listing search or market metric covers.

## `propertyType` (type: `string`):

A single property type, for property search, transaction search and the plus and pro valuation products.

## `landUse` (type: `string`):

Restrict a transaction search by land use classification, for example residential.

## `sourceCategory` (type: `string`):

Where a recorded sale came from. The Valuer General source is the state's registered transfer; the agency source is what the selling agent reported. They disagree and they have different lags, so choosing deliberately matters and the source travels on every row either way.

## `bedroomsMin` (type: `integer`):

Lowest bedroom count to include.

## `bedroomsMax` (type: `integer`):

Highest bedroom count to include.

## `bathroomsMin` (type: `integer`):

Lowest bathroom count to include.

## `bathroomsMax` (type: `integer`):

Highest bathroom count to include.

## `carSpacesMin` (type: `integer`):

Lowest car space count to include.

## `carSpacesMax` (type: `integer`):

Highest car space count to include.

## `landAreaMin` (type: `integer`):

Lowest land area to include, in square metres.

## `landAreaMax` (type: `integer`):

Highest land area to include, in square metres.

## `livingAreaMin` (type: `integer`):

Lowest living area to include, in square metres.

## `livingAreaMax` (type: `integer`):

Highest living area to include, in square metres.

## `priceMin` (type: `integer`):

Lowest listing price to include.

## `priceMax` (type: `integer`):

Highest listing price to include.

## `saleValueMin` (type: `integer`):

Lowest recorded sale value to include in a transaction search.

## `saleValueMax` (type: `integer`):

Highest recorded sale value to include in a transaction search.

## `startDate` (type: `string`):

Earliest date to include, as YYYY-MM-DD. Applies to listings, transactions, auctions and market metrics.

## `endDate` (type: `string`):

Latest date to include, as YYYY-MM-DD.

## `sortBy` (type: `string`):

How a listing search orders its results before paging.

## `pageSize` (type: `integer`):

How many results the provider returns per page, up to 200. Paging follows the provider's forward cursor until the row cap is reached.

## `valuationKind` (type: `string`):

Whether to order a sale valuation, a rental valuation or both.

## `requestType` (type: `string`):

Which valuation product to order. Enquiry is the general purpose one; origination is the lending grade one; plus adds a rental valuation to a sale one; pro adds environmental hazards as well. Plus and pro are sale side only, so a rental valuation falls back to enquiry.

## `effectiveDate` (type: `string`):

Value the property as at this date rather than today, as YYYY-MM-DD. Accepted by the plus and pro products.

## `customerReference` (type: `string`):

A reference of your own, echoed back on the valuation. Useful for tying a valuation to a loan or case number.

## `bedrooms` (type: `integer`):

Override the recorded bedroom count when ordering a plus or pro valuation, which is how a property is valued as renovated rather than as recorded.

## `bathrooms` (type: `integer`):

Override the recorded bathroom count when ordering a plus or pro valuation.

## `carSpaces` (type: `integer`):

Override the recorded car space count when ordering a plus or pro valuation.

## `searchType` (type: `string`):

What an auction or demographics request is scoped to: a suburb, a whole state, or a greater capital city statistical area.

## `metrics` (type: `array`):

Which market metrics to read. Sale metrics and rental metrics are separate families, and median days on market exists in both with different meanings, so the family each row came from travels with it.

## `metricFamily` (type: `string`):

Median days on market is published in both the sale and rental families and means something different in each. This says which one to read it from. Ignored for metrics that exist in only one family.

## `frequency` (type: `string`):

How often a market metric is reported. Monthly is only available for rental transaction volume, median days on market and median rental price.

## `aggregationWindow` (type: `string`):

The window each reported historic value is aggregated over. A shorter window is more responsive and noisier.

## `apiKey` (type: `string`):

Your own api key from the provider. It is base64 encoded together with the api secret and sent in the Authorization header; the provider does not accept them as form fields.

## `apiSecret` (type: `string`):

Your own api secret from the provider. Stored encrypted and never written into the dataset. Can also be supplied as the DATA\_API\_KEY environment secret.

## `maxResults` (type: `integer`):

Stop after this many rows. Counts every row: properties, listings, transactions, valuations and market values alike.

## `requestsPerMinute` (type: `integer`):

How fast to call the provider. Most endpoints allow 50 requests per second and the valuation endpoints allow 25, so the default sits under the stricter of the two.

## `baseUrl` (type: `string`):

Overrides the host the API is called on. Leave empty unless the provider has given you a different one.

## Actor input object example

```json
{
  "mode": "propertyReport",
  "includeFullAttributes": false,
  "includePlanning": false,
  "includeTenure": false,
  "includePropertyListings": false,
  "includeTransactions": false,
  "latestListingOnly": false,
  "latestTransactionOnly": false,
  "searchArea": "suburbAndPostcode",
  "state": "",
  "proximity": "",
  "coordinatesOnly": false,
  "listingType": "",
  "listingStatus": "",
  "propertyType": "",
  "sourceCategory": "",
  "sortBy": "",
  "pageSize": 25,
  "valuationKind": "both",
  "requestType": "enquiry",
  "searchType": "suburb",
  "metricFamily": "rent",
  "frequency": "",
  "aggregationWindow": "",
  "maxResults": 100,
  "requestsPerMinute": 1200
}
```

# Actor output Schema

## `records` (type: `string`):

One row per record, alongside the address, property ID or area that produced it.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/australian-property-data-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/australian-property-data-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call nabeelbaghoor/australian-property-data-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/australian-property-data-api"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hFoOG0BkkKzpy4wkz/builds/tm2gGFH3WewQPNZhX/openapi.json
