# Australian Real Estate Agency Scraper Pro (`slate_spool/australian-real-estate-scraper-pro`) Actor

Professional-grade extraction of Australian real-estate agency records from OpenStreetMap, covering nodes, ways, and relations across five major cities — Sydney, Melbourne, Brisbane, Perth, and Adelaide. The Pro variant queries all OSM element types (not just nodes) using center-coordinate resolutio

- **URL**: https://apify.com/slate\_spool/australian-real-estate-scraper-pro.md
- **Developed by:** [Wes Shields](https://apify.com/slate_spool) (community)
- **Categories:** Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $120.00 / 1,000 results

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/platform/actors/running/actors-in-store#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

## AU Real Estate Scraper Pro

A local, publish-ready Apify Actor that collects structured Australian real-estate agency records from public OpenStreetMap data. This Phase 1 build is staged locally only; it has not been pushed, deployed, or published.

### What it returns

Each dataset item has a stable `recordId`, OSM element identity, agency name, address fields, coordinates, optional public contact details, attribution, and a canonical detail URL. The URL is always constructed from the returned element type and ID:

```text
https://www.openstreetmap.org/{osmType}/{osmId}
```

No listing-page anchors are read or copied. Missing source fields are represented as `null`, not guessed.

### Safe operating envelope

- Only five fixed Australian city bounding boxes are supported; callers cannot supply arbitrary targets.
- The Actor uses public Overpass API endpoints and OpenStreetMap data under ODbL 1.0.
- It sends one request at a time with at least 1,000 ms between requests.
- `maxItems`, `maxRequests`, `maxRunSeconds`, and `maxCostCents` are hard validated caps.
- Upstream HTTP errors, invalid JSON, exhausted fallbacks, and zero valid records fail explicitly and write `RUN_SUMMARY` with `status: FAILED`.
- The Actor accepts no credentials, tokens, cookies, proxy configuration, or arbitrary URLs.
- Output attribution is `© OpenStreetMap contributors`; downstream users remain responsible for ODbL attribution/share-alike obligations.

Public Overpass instances are suitable for small, bounded use but are community infrastructure. For sustained high-volume use, operate a compliant private Overpass instance or use regional OSM extracts rather than increasing these caps.

### Input example

```json
{
  "areas": ["sydney"],
  "maxItems": 100,
  "requestDelayMs": 1500,
  "maxRequests": 6,
  "maxRunSeconds": 180,
  "maxCostCents": 3,
  "requestTimeoutSeconds": 30,
  "includeContactDetails": true
}
```

### Local verification

```bash
npm ci
npm test
npm run score
npm run validate
apify actor:run
```

`npm run verify:key` independently rechecks the frozen answer key through OSM's XML element API. It is intentionally separate from the Actor's Overpass JSON path and does not rewrite the key.

The run summary is stored at key-value-store key `RUN_SUMMARY`. A successful run includes request counts, retries, bytes, rejected and emitted records, sleep time, elapsed time, estimated compute cost, and the configured caps.

### Source and legal notes

Data © OpenStreetMap contributors, available under the [Open Database License 1.0](https://opendatacommons.org/licenses/odbl/1-0/). The Actor uses documented machine interfaces and does not crawl OSM HTML pages. Respect the public instance resource limits and attribution requirements.

# Actor input Schema

## `areas` (type: `array`):

One or more supported city areas. Duplicate values are removed.

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

Hard output cap for the complete run.

## `requestDelayMs` (type: `integer`):

Polite delay between upstream requests; values below 1000 ms are rejected.

## `maxRequests` (type: `integer`):

Hard request budget, including failed attempts and fallbacks.

## `maxRunSeconds` (type: `integer`):

Hard wall-clock cap checked before every request and backoff.

## `maxCostCents` (type: `integer`):

Stops work before estimated compute cost exceeds this cap. Platform spending limits remain authoritative.

## `requestTimeoutSeconds` (type: `integer`):

Timeout for each upstream request; also bounded by remaining run time.

## `includeContactDetails` (type: `boolean`):

Include public phone, email, and website tags when contributors supplied them.

## Actor input object example

```json
{
  "areas": [
    "sydney"
  ],
  "maxItems": 100,
  "requestDelayMs": 1500,
  "maxRequests": 6,
  "maxRunSeconds": 180,
  "maxCostCents": 3,
  "requestTimeoutSeconds": 30,
  "includeContactDetails": true
}
```

# 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("slate_spool/australian-real-estate-scraper-pro").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("slate_spool/australian-real-estate-scraper-pro").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 slate_spool/australian-real-estate-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,slate_spool/australian-real-estate-scraper-pro"
        }
    }
}

```

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/FXYEFQtFAL604ouHb/builds/XhZlFcxQ0B4Ifa7MY/openapi.json
