# Allhomes.com.au Scraper: Canberra Prices, EER & UV (`kotaro001/allhomes-com-au-scraper`) Actor

Scrape allhomes.com.au sale, rent and sold listings in the ACT. Every row carries the price, EER, block size, agent phone and sold date; detail pages add the Unimproved Value, annual rates, description and transfer history.

- **URL**: https://apify.com/kotaro001/allhomes-com-au-scraper.md
- **Developed by:** [Tuyen Tran](https://apify.com/kotaro001) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Live Sample Dataset & Verified Run Benchmark

Two runs on **2026-11-03** on Apify Cloud, build `0.1.14`. Both datasets are public: open the JSON or CSV link in a browser, no login and no run needed.

**List run** — `IwFYdO11UBrbVgKqt` · **30 rows** · 55 columns · 32.4 s · charged `apify-actor-start` 1, `listing-scraped` 30.
[JSON](https://actors.zapstackguides.com/samples/allhomes-list.json) · [CSV](https://actors.zapstackguides.com/samples/allhomes-list.csv)

**Detail run** — `hK5a1iFRTmzS0FWio` · **3 rows** · 55 columns · 149.3 s · charged `listing-scraped` 3, `detail-scraped` 3.
[JSON](https://actors.zapstackguides.com/samples/allhomes-detail.json) · [CSV](https://actors.zapstackguides.com/samples/allhomes-detail.csv)

Fill rate on the 30-row list sample: `priceNumeric` 27/30, `eer` 30/30, `landSizeSqm` 0/30. The three empty prices are auctions where no guide price is printed, so the field stays null instead of guessing. Block size is empty because every row in this sample is an apartment; run a house suburb to see it. In the 3-row detail sample, `unimproved_value` and `rates_annual` are filled on 1 of 3 rows, because the portal only prints them when the building has a published valuation.

| # | Address | Price | Beds | Baths | EER | Source |
|---|---|---|---|---|---|---|
| 1 | 217/2 Akuna Street, City ACT 2601 | $199,000+ | 1 | 1 | 6 | [Open](https://www.allhomes.com.au/unit-217-2-akuna-street-city-act-2601) |
| 2 | 312/2 Akuna Street, City ACT 2601 | $210,000 | 1 | 0 | 6 | [Open](https://www.allhomes.com.au/unit-312-2-akuna-street-city-act-2601) |
| 3 | 604/2 Akuna Street, City ACT 2601 | $215,000 | 0 | 1 | 6 | [Open](https://www.allhomes.com.au/unit-604-2-akuna-street-city-act-2601) |

Open the sample, compare the three rows with the source pages, check the $2.005 and $8.005 lines below, and note the 50-row free limit. That is the whole test, under five minutes.

### What does the Allhomes.com.au Scraper do?

Scrape **allhomes.com.au** listings for Canberra and the ACT by suburb, state and postcode, across three channels: buy, rent and sold. Every row is one property, with address, price text and number, bedrooms, bathrooms, parking, EER, property type, agent phone, agency name and listing URL.

Detail mode adds the ACT Unimproved Value, its valuation year and scope, the annual rates, the full description, features and the transfer history. The Actor reads public pages only. It does not log in, bypass a paywall or read private data.

### Why scrape allhomes.com.au with this Actor?

The ACT publishes facts that other states do not: an Energy Efficiency Rating on almost every listing, an Unimproved Value for land, and annual rates. This Actor puts those fields at the top level, so they sort and export without opening a nested blob.

1. **EER in every row.** Sort by energy rating, filter the worst performers, or build a retrofit shortlist.
2. **Land value and rates in detail mode.** `unimproved_value`, `uv_year`, `uv_scope` and `rates_annual` are separate numeric columns.
3. **Three channels, one schema.** Buy, rent and sold rows share the same column names, so a union query needs no remapping.
4. **Multi-suburb runs.** Pass a `suburbs` list and every area lands in one dataset, ready for CSV or Sheets.
5. **Stale-listing filter.** `minDaysOnMarket: 60` keeps only listings that have been advertised for 60 days or more.
6. **Change feed.** `onlyPriceChanged`, `onlyNew` and `onlyEmitChanges` return only what moved since the last run.

### What data can you extract from allhomes.com.au?

| Field group | Fields | List mode | Detail mode |
|---|---|---|---|
| Identity | `listingId`, `sourcePortal`, `listingUrl` | Yes | Yes |
| Address | `fullAddress`, `street`, `suburb`, `state`, `postcode`, `latitude`, `longitude` | Yes | Yes |
| Price | `priceDisplay`, `priceNumeric`, `priceHistory`, `priceChangesCount` | Yes | Yes |
| Property | `propertyType`, `bedrooms`, `bathrooms`, `carSpaces`, `landSizeSqm`, `building_size`, `eer` | Yes | Yes |
| Agent | `agent1_name`, `agent1_phone`, `agency_name`, `agency_phone` | Name only | Phone and agency phone |
| ACT values | `unimproved_value`, `uv_year`, `uv_scope`, `rates_annual` | No | Yes |
| Dates | `daysOnMarket`, `sold_date`, `auction_date`, `listing_status` | Yes | Yes |
| Content | `description`, `features`, `history`, `images` | No | Yes |

`uv_scope` tells you what the valuation covers: `lot` for a single block, `block` when the UV covers the whole strata building. That matters for apartments, where the value is not the unit's alone.

### How to scrape allhomes.com.au listings and price history

1. Choose `channel`: `buy`, `rent` or `sold`.
2. Enter `state`, `suburb` and `postcode`, or pass a `suburbs` list for several areas.
3. Set `maxPages` and `maxItems` for the size you need.
4. Turn on `includeDetails` for UV, rates, description and agent phone; cap the spend with `maxDetails`.
5. Add `minDaysOnMarket` when you only want stale stock, and `onlyPriceChanged` for a daily alert.
6. Press **Run**, then save the task and add a schedule in Apify.

The actor pages until `maxPages` or the result set ends. A repeat run uses `stateKey` to remember what it saw, so the change fields stay meaningful across days.

### How much does it cost to scrape allhomes.com.au?

Pricing is **pay-per-event**. All Apify platform compute and residential/unblocker proxy usage is 100% included in the per-event price. You never pay a separate compute-unit or proxy surcharge.

- **List Mode (`includeDetails: false`): $2.005 per 1,000 listings** on the Apify Standard tier ($0.005 actor start + 1,000 × $0.002 per listing), or **~$1.60 per 1,000** on Apify Scale/Business discounted tiers.
- **Full Detail Mode (`includeDetails: true`): $8.005 per 1,000 listings with full details** on the Apify Standard tier ($0.005 actor start + 1,000 × $0.002 listing + 1,000 × $0.006 detail add-on), or **~$6.40 per 1,000** on discounted tiers. A 3-row detail test run costs exactly **$0.029**.
- **Free plan limit:** Free Apify accounts can extract **up to 50 rows per run**, enough to inspect the full schema, verify field fill rates and test a suburb before upgrading. Paid Apify plans unlock unlimited rows per run.
- Detail rows are billed whether they are live or served from the cache, because the customer receives the data in both cases.

**Pre-calculated 1,000-listing total** (one actor start plus the rows):

1. List only, `includeDetails: false`: **$2.005** on Standard (Free/Bronze), **$1.604** on Silver+.
2. Full details, `includeDetails: true`: **$8.005** on Standard (Free/Bronze), **$6.404** on Silver+.

### Input parameters and configuration examples

| Parameter | Default | What it does |
|---|---|---|
| `channel` | `buy` | `buy`, `rent` or `sold`. |
| `state` | `ACT` | State or territory code. |
| `suburb` | `Canberra` | Suburb name; separate several with a semicolon. |
| `postcode` | `2601` | Four-digit postcode. |
| `suburbs` | `[]` | One entry per area, e.g. `Downer, ACT, 2602`. |
| `maxItems` | `20` | Row cap for the run. |
| `maxPages` | `1` | List pages per area. |
| `includeDetails` | `false` | Read each property page. |
| `maxDetails` | `50` | Detail page cap. |
| `minDaysOnMarket` | `0` | Keep only listings at or above this many days. |
| `onlyNew` | `false` | Only listings seen for the first time. |
| `onlyPriceChanged` | `false` | Only rows whose price changed, plus removed rows. |
| `minPrice`, `maxPrice` | empty | Price bounds where the portal prints a number. |
| `propertyTypes` | empty | Optional type filter. |
| `stateKey` | `default` | Separate tracking history per search. |

```json
{
  "channel": "buy",
  "state": "ACT",
  "suburbs": ["Downer, ACT, 2602", "Campbell, ACT, 2612"],
  "maxItems": 50,
  "maxPages": 2,
  "includeDetails": true,
  "maxDetails": 10,
  "minDaysOnMarket": 0
}
```

### Output example

```json
{
  "listingId": "124-15-coranderrk-street-city-act-2601",
  "channel": "buy",
  "fullAddress": "124/15 Coranderrk Street, City ACT 2601",
  "suburb": "City",
  "state": "act",
  "postcode": "2601",
  "priceDisplay": "Auction 18/11/26",
  "priceNumeric": null,
  "propertyType": "unit",
  "bedrooms": 2,
  "bathrooms": 2,
  "carSpaces": 2,
  "landSizeSqm": null,
  "eer": 6,
  "unimproved_value": 20000000,
  "uv_year": 2023,
  "uv_scope": "block",
  "rates_annual": 120177,
  "daysOnMarket": 0,
  "priceChangesCount": 0,
  "agent1_phone": "",
  "agency_name": "",
  "listingUrl": "https://www.allhomes.com.au/unit-124-15-coranderrk-street-city-act-2601"
}
```

Empty values are real: the page did not print a price, a phone or a land size, so the field stays empty rather than invented.

### 🇦🇺 Australian Real Estate Data Suite (6 Portals)

| Actor | Best for | Link |
|---|---|---|
| 🏠 Realestate.com.au Scraper | Residential buy, rent and sold listings, price drops and agent phones | https://apify.com/kotaro001/realestate-com-au-scraper |
| 📈 Property.com.au Scraper | Sold history, rent estimates and school zones | https://apify.com/kotaro001/property-com-au-scraper |
| 🏢 Realcommercial.com.au Scraper | Offices, warehouses, retail and farming | https://apify.com/kotaro001/realcommercial-com-au-scraper |
| 🏡 OnTheHouse.com.au Scraper | Cotality estimates, sale history and suburb medians | https://apify.com/kotaro001/onthehouse-com-au-scraper |
| 🏛️ Allhomes.com.au Scraper | Canberra EER, unimproved value, rates and auction dates | https://apify.com/kotaro001/allhomes-com-au-scraper |
| 🌐 Domain.com.au Scraper: Prices, Schools & Suburb Trends | Sale, rent and sold listings with sale method, inspection times, school catchments, suburb medians, owner-occupier mix and agent phones | https://apify.com/kotaro001/domain-com-au-scraper |

Run the same suburb across the five actors, export to Sheets, and join on `fullAddress` to combine asking price, sold history, estimates and ACT land values.

### Frequently Asked Questions (FAQ) & Legal Disclaimer

#### Does the Actor return a price when the page shows an auction date?

No. `priceNumeric` stays null and `priceDisplay` keeps the printed text, such as `Auction 18/11/26`. Guessing a guide price would corrupt every average built on the data.

#### Why is the unimproved value missing on some apartments?

The portal prints an Unimproved Value only for buildings with a published valuation; `uv_scope` tells you whether it covers the lot or the whole block. No value on the page means an empty column.

#### Can I scrape several suburbs in one run?

Yes. Pass a `suburbs` list; each area becomes its own search and all rows land in one dataset.

#### How do I find 60-day-old listings?

Set `minDaysOnMarket: 60`. Rows without a known days-on-market value are dropped, so the result is exactly the stale stock.

#### Is this legal?

The Actor reads public listing pages and does not access private data. You are responsible for how you use the data and for complying with the portal's terms and Australian privacy law.

# Changelog

This Actor's version history is a separate document: https://apify.com/kotaro001/allhomes-com-au-scraper/changelog.md

# Actor input Schema

## `channel` (type: `string`):

buy = sale listings, rent = rentals, sold = recently sold with prices.

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

Suburb name, e.g. Canberra, Downer, Forrest.

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

State code. allhomes covers the ACT and nearby NSW.

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

Four-digit postcode of the suburb.

## `startUrls` (type: `array`):

Optional. Paste allhomes search URLs to read them instead of building one.

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

Optional filter, e.g. House, Unit, Townhouse, Land.

## `minPrice` (type: `integer`):

Minimum price in AUD. Listings without a number are kept.

## `maxPrice` (type: `integer`):

Maximum price in AUD. Listings without a number are kept.

## `minBeds` (type: `integer`):

Minimum bedrooms, 0-6.

## `maxItems` (type: `integer`):

Cap on rows written to the dataset.

## `includeDetails` (type: `boolean`):

Open each property page for EER, Unimproved Value, rates, description and transfer history. Billed per detail page.

## `maxDetails` (type: `integer`):

Cap on detail pages per run. At least 1.

## `maxPages` (type: `integer`):

Result pages to read, up to 50 rows per page.

## `onlyNew` (type: `boolean`):

Shorthand for onlyEmitChanges: return only listings not seen in earlier runs.

## `onlyPriceChanged` (type: `boolean`):

Shorthand for onlyEmitChanges: return only rows whose price changed, plus removed rows.

## `onlyEmitChanges` (type: `boolean`):

Emit only new, repriced or removed listings.

## `includeRemovedListings` (type: `boolean`):

Close a listing after the first run that no longer sees it.

## `stateKey` (type: `string`):

Separate tracking history per search.

## `minDaysOnMarket` (type: `integer`):

Keep only listings that have been advertised for at least this many days. 0 = no filter. Rows without a known days-on-market value are dropped when this is above 0.

## `suburbs` (type: `array`):

Optional. One or more areas such as 'Downer, ACT, 2602'. Each entry becomes its own search, and all rows land in one dataset. You can also separate entries with a semicolon in the suburb field.

## Actor input object example

```json
{
  "channel": "buy",
  "suburb": "Canberra",
  "state": "ACT",
  "postcode": "2601",
  "maxItems": 20,
  "includeDetails": false,
  "maxDetails": 50,
  "maxPages": 1,
  "onlyNew": false,
  "onlyPriceChanged": false,
  "onlyEmitChanges": false,
  "includeRemovedListings": false,
  "stateKey": "default",
  "minDaysOnMarket": 0,
  "suburbs": []
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `stats` (type: `string`):

No description

# 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("kotaro001/allhomes-com-au-scraper").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("kotaro001/allhomes-com-au-scraper").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 kotaro001/allhomes-com-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kotaro001/allhomes-com-au-scraper"
        }
    }
}
```

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/THdsWNK0f3RDaLVfw/builds/A5cZvsBpqdGKDT3g8/openapi.json
