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

Extracts structured Australian real-estate agency records from OpenStreetMap data across five major cities — Sydney, Melbourne, Brisbane, Perth, and Adelaide. Each record includes the agency name, street address, suburb, state, postcode, GPS coordinates, website (when available), and a canonical Ope

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

## Pricing

from $80.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

## Real Estate AU Scraper Pro

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

### Output

Each dataset item has a stable `recordId`, OSM node identity, agency name, address fields, coordinates, optional public contact fields, attribution, and a canonical detail URL. The URL is always constructed from source identity:

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

The Actor never copies listing anchors. Missing source fields are `null`; values are not guessed.

### Safe operating envelope

- Only five fixed Australian city bounding boxes are supported; arbitrary URLs and coordinates are rejected.
- The sources are public, documented read-only Overpass operators whose `robots.txt` does not disallow the API route, using OpenStreetMap data under ODbL 1.0.
- Requests are single-threaded, carry an identifying User-Agent, and have at least 1,000 ms between attempts.
- `maxItems`, `maxRequests`, `maxRunSeconds`, and `maxCostCents` are hard validated caps. Each network timeout is further shortened to the smaller remaining time/cost budget.
- HTTP errors, timeouts, invalid JSON, exhausted fallbacks, and zero valid records fail explicitly and write structured `RUN_SUMMARY` state.
- No credentials, cookies, proxy configuration, arbitrary targets, accounts, or secrets are accepted.
- Every output identifies `© OpenStreetMap contributors` / `ODbL-1.0`; downstream users remain responsible for attribution and share-alike obligations.

Public Overpass instances are community infrastructure with no SLA. This Actor deliberately stays far below the published small-use guidance (at most 12 requests/run and 500 records). Sustained or commercial high-volume operation should use a compliant self-hosted Overpass instance or regional extracts, not increased public-instance caps.

### Example input

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

### Local verification

```bash
npm ci
npm run ship-gate
npm run verify:key
apify actor:run
```

`npm run verify:key` makes one bounded XML direct-ID request to the public VK Maps Overpass operator and independently rechecks the frozen five-record key. It does not import the Actor parser and does not rewrite the key. `npm run score` compares the Actor's separate JSON bounding-box path against that key and reports before/after accuracy per field.

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 configured caps.

### Source policy and license

- Overpass is the documented read-only alternative for OSM queries: <https://operations.osmfoundation.org/policies/api/>
- Public-instance list and operator guidance: <https://wiki.openstreetmap.org/wiki/Overpass_API>
- Attribution and ODbL terms: <https://www.openstreetmap.org/copyright>

No map tiles, Nominatim endpoint, HTML pages, forms, authentication, or personal/private sources are accessed.

# 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 used to bound every request and backoff.

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

Bounds every request by remaining estimated compute time. Platform spending limits remain authoritative.

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

Timeout for each upstream request, further bounded by remaining run-time and cost budgets.

## `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-agency-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("slate_spool/australian-real-estate-agency-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 slate_spool/australian-real-estate-agency-scraper --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-agency-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/aji8aXZ0mO60k7kW0/builds/13W0Umovo1hVhTPwn/openapi.json
