# AU & NZ Real Estate Agent OSINT - Profiles & Decision Scores (`abotapi/realestate-agent-osint`) Actor

Build OSINT intelligence reports on real estate agents across Australia and New Zealand. Extract profiles, contacts, agency details, active listings, sales history, reviews and media mentions. Each report includes an evidence-backed 0–100 decision score. Structured JSON for AI agents, APIs and MCP.

- **URL**: https://apify.com/abotapi/realestate-agent-osint.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 agent reports

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

## Real-Estate Agent OSINT: Scored Agent Reports for Australia & NZ

Real-Estate Agent OSINT turns public real-estate data into one scored, explainable report per agent, for every Australian state and territory and New Zealand. Give it an agent's name, a profile link or a suburb, and it combines what is publicly known about the agent and adds sold history, public contacts, reviews, a licence check, who they list with and a 0 to 100 score. Export the dataset as JSON, CSV or Excel, call it from the API, or give it to an AI agent as a tool.

### Why This Scraper?

- **One report per agent.** Name, agency, contacts, sold history, reviews, licence status, partners and a 0 to 100 score, all in one row.
- **Australia and New Zealand.** Every Australian state and territory plus New Zealand. Set `country` to `nz` for New Zealand runs.
- **Find agents your way.** Look up an agent by name, paste a profile link, or sweep a whole suburb.
- **Contacts only where they are public.** Phones and emails appear only when a public page shows them, so you never get guessed or scraped-from-nowhere contact details.
- **Reviews you can trust.** Ratings, review counts and the themes customers mention, with quoted examples.
- **Built for schedules and AI.** Get only new or changed agents on repeat runs, and give the results to an AI agent as a tool.

### Use Cases

- **Agency principals and recruiters:** find rising agents, check licence status and see agency moves and key co-listing partners before a hire.
- **Vendors choosing an agent:** compare agents in one suburb on sold volume, reviews and licence standing.
- **Proptech and lead-gen builders:** enrich an agent database with cross-site identities, sold counts and contact details through the API.
- **Mortgage brokers and conveyancers:** build prospect lists of the top agents in a territory.
- **AI and MCP agent builders:** answer "who is the best agent in suburb X" with an explainable result your agent can quote.

### Data You Get

> Sample shape: values are illustrative placeholders with fake data, not a real person.

| Field | Example |
| --- | --- |
| `agentId` | `"agent_jane_sample_a1b2c3d4"` |
| `name` / `title` | `"Jane Sample"` / `"Director / Licensee"` |
| `country` / `region` | `"au"` / `"NSW"` |
| `agencyName` / `agencyGroup` | `"Ray White Sample Town"` / `{"group": "Ray White"}` |
| `suburbs` | `["Bondi NSW"]` |
| `phones` / `phoneDetails` | numbers a page shows, each with its kind, source and basis |
| `emails` / `emailDetails` | addresses a page shows, labelled `personal` or `role` |
| `socialLinks` / `socialLinkDetails` | `{"linkedin": "..."}` / links with platform and kind |
| `bio` / `yearsExperienceStated` | the agent's public profile text / `15` |
| `languages` / `specialities` / `awards` | `["English", "Greek"]` / labelled specialities / awards with year and source |
| `agency` | name, website, mailbox, phone, address, logo, roster and business entity |
| `currentListings` | `{"count": 9, "suburbs": [...], "propertyTypes": [...], "priceTexts": [...]}` |
| `soldSummary` | `{"count12m": 34, "count24m": 61, "volume12m": 52000000}` |
| `soldHistory` / `soldHistoryComplete` | each sale with address, date, price, method, source / `true` |
| `reviews` | `{"count": 96, "average": 4.6, "themes": [...]}` |
| `licence` / `licenceCheck` | licence number, status, expiry and any disciplinary findings / `"matched"` |
| `score` | `{"overall": 78, "pillars": {...}}`: how the agent compares with others in the run |
| `network` | how many partners the agent lists with, and the top ones |
| `sources` | `["rma", "domain"]`: where the data came from |
| `mediaMentions` | press articles about the agent |
| `changeType` | `NEW`, `UPDATED`, `UNCHANGED` or `EXPIRED` (scheduled runs) |

Other record types: in URL mode the rows are `property`, `agency` and `news` records, and in suburb mode with `suburbLeaderboard` on, each suburb also gets one ranked leaderboard row. New Zealand agents carry `nzStats`, `servicedSuburbs` and `nzRecentSales` instead of the Australian sold lists.

### How to Use

1. Pick a **mode**. **Realestate** (default) profiles agents from names, profile links or a suburb sweep. **URL** reads the links in `urls` and ignores the agent inputs.
2. Add your targets: `agentQueries` (name and suburb), `agentUrls`, or `suburbs`. For New Zealand set `country` to `nz`.
3. Switch the report sections you need on or off, and set **Max results per run** to control cost.
4. Click **Start**. The actor collects every agent first and then scores them together, so rows arrive in the dataset when collection finishes.

**Profile agents by name:**

```json
{
  "agentQueries": [
    { "name": "Jane Sample", "suburb": "Bondi NSW" }
  ],
  "maxItems": 5
}
```

**Sweep suburbs in several states:**

```json
{
  "suburbs": ["Applecross WA", "Bondi NSW", "Sandy Bay TAS"],
  "maxAgentsPerSuburb": 4,
  "maxItems": 12,
  "suburbLeaderboard": true
}
```

**Sweep New Zealand suburbs:**

```json
{
  "country": "nz",
  "suburbs": ["Ponsonby, Auckland", "Thorndon, Wellington"],
  "maxAgentsPerSuburb": 4,
  "maxItems": 8
}
```

**Read pasted links (URL mode):**

```json
{
  "mode": "url",
  "urls": ["https://reiwa.com.au/for-sale/applecross/"],
  "maxItems": 20
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/realestate-agent-osint").call(run_input={
    "agentQueries": [{"name": "Jane Sample", "suburb": "Bondi NSW"}],
})
for agent in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(agent["name"], agent["score"]["overall"], agent["phones"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/realestate-agent-osint').call({
    agentQueries: [{ name: 'Jane Sample', suburb: 'Bondi NSW' }],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Tips

- **Names:** type the name as the agent uses it. A similar but different name is treated as another person and is not charged.
- **Suburbs:** include the state or region (`"Bondi NSW"`, `"Ponsonby, Auckland"`).
- **Licence:** a licence is attached only when the register clearly matches the agent.
- **Cost control:** `maxItems` is the most agents a run will report, and one agent is one report. In URL mode it is shared across the links, with at least 1 record per link, so the default 5 with 16 default links returns up to 16 records.
- **Output views:** the dataset opens on **Overview**, with further views for agents, profiles and contacts, press mentions, agencies and suburb leaderboards. Views pick columns, not rows.

#### Resume and recurring updates

- **Resume:** paste the ID of an interrupted run into `resumeFromRunId` and agents already reported are skipped, so you do not pay twice.
- **Only new or changed agents:** turn on `incrementalMode` for scheduled runs and keep the same `stateKey`. Each row is marked `NEW`, `UPDATED`, `UNCHANGED` or `EXPIRED`, and unchanged agents are neither returned nor charged unless `emitUnchanged` is on.

### Send results into your apps (MCP connectors)

Optionally pipe the results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the run: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | enum | `realestate` | `realestate` (agent reports) or `url` (read pasted links). |
| `urls` | array | 16 example links | URL mode only. Prefilled with one example of every supported listing, agency, directory and article link shape. Replace them to scope a run. `maxItems` is split evenly across the links. |
| `agentQueries` | array | `[]` | `{"name": "...", "suburb": "..."}` pairs to profile. Only the exact name or a documented short or full form of the given name is collected and billed. |
| `agentUrls` | array | `[]` | Agent profile links from the supported directories. |
| `suburbs` | array | `[]` | Suburbs to sweep for all agents, best with state and postcode in Australia or with the region in New Zealand. |
| `maxAgentsPerSuburb` | integer | `25` | Cap per suburb during a sweep, counted as people across the sources. |
| `country` | enum | `au` | `au` (every Australian state and territory) or `nz` (New Zealand, every region). |
| `includeSoldHistory` | boolean | `true` | Attach the full sold track record per agent. |
| `includeReviews` | boolean | `true` | Fetch and analyse vendor reviews. |
| `includeLicenceCheck` | boolean | `true` | Check the government licence registers (NSW, QLD and WA in Australia, the national register in New Zealand) and the disciplinary record. |
| `includeNetwork` | boolean | `true` | Build the co-listing network and save `network.html` when an agent has a co-listing partner. |
| `includeAgencyData` | boolean | `true` | Attach the agency block: website, general mailbox, phone, address, logo and roster names. |
| `includeCurrentListings` | boolean | `true` | Attach the agent's current for-sale listings summary. |
| `includeAgentWebsites` | boolean | `true` | Read the agent's public profile on the agency's own site and the New Zealand portals for emails, phones, awards and languages, only as a page shows them. |
| `includeMedia` | boolean | `true` | Search the industry news site once per agent name and attach confirmed articles as `mediaMentions`. |
| `includeAgencyEntity` | boolean | `true` | Australia: attach the agency's business entity from the public business register. Needs `includeAgencyData`. |
| `aiAnalysis` | boolean | `false` | Deprecated: no longer used. Kept so saved tasks still start; the value is ignored. |
| `suburbLeaderboard` | boolean | `false` | Push a ranked leaderboard record per suburb (needs at least three scored agents). |
| `maxItems` | integer | `5` | Realestate mode: stop after this many agents, counted as people. URL mode: split evenly across the links, at least 1 record per link. |
| `proxyConfiguration` | object | Apify connection service, AU | Connection settings for the run. Keep the default for the agent directories. See Plan Requirement. |
| `maxRequestsPerMin` | integer | `24` | Polite pacing cap, per site. |
| `resumeFromRunId` | string | (none) | Continue one interrupted run. |
| `incrementalMode` | boolean | `false` | Return only new and changed agents on scheduled runs. |
| `stateKey` | string | `default` | Name or share an incremental-mode state. |
| `emitUnchanged` | boolean | `false` | Also return (and bill) unchanged agents. |
| `emitExpired` | boolean | `false` | Also return agents gone from the source set. |
| `ignoreFieldsForChanges` | array | `[]` | Extra fields, dotted paths allowed, that must not alone mark a record `UPDATED` (incremental mode only). |
| `mcpConnectors` | array | (none) | Connectors to pipe results into (optional). |
| `notionParentPageUrl` | string | (none) | Notion parent page (Notion connector only). |
| `maxNotifyListings` | integer | `50` | Max items to export per connector. |

### Output Example

> Sample shape: values are illustrative placeholders with fake data, not a real person. Contact values are masked; field names and structure are those of a real row.

**An Australian agent row (abridged):**

```json
{
  "agentId": "agent_jane_sample_a1b2c3d4",
  "changeType": "NEW",
  "name": "Jane Sample",
  "title": "Director / Licensee",
  "country": "au",
  "agencyName": "Ray White Sample Town",
  "suburbs": ["Bondi NSW"],
  "phones": ["[masked mobile]"],
  "emails": ["[masked personal email]"],
    "bio": "Jane has sold in the eastern suburbs since 2009.",
  "yearsExperienceStated": 15,
  "languages": ["English", "Greek"],
  "agency": { "name": "Ray White Sample Town", "address": "1 Sample Street, Bondi NSW 2026", "teamSize": 12 },
  "currentListings": { "count": 9, "listingsRead": 9, "suburbs": [{ "suburb": "Bondi NSW", "count": 6 }] },
  "soldSummary": { "countAll": 214, "count12m": 34, "count24m": 61, "volume12m": 52000000 },
  "soldHistory": [{ "address": "12 Sample Street, Bondi NSW", "soldDate": "2025-11-14", "price": 2450000, "method": "Private treaty", "source": "rma" }],
  "soldHistoryComplete": true,
  "reviews": { "count": 96, "average": 4.6 },
  "licence": null,
  "licenceCheck": "withheld",
  "score": {
    "overall": 78,
    "pillars": { "performance": 88, "reputation": 71, "experience": 64 }
  },
  "network": { "partnerCount": 12, "inRunPartnerCount": 1 },
  "sources": ["rma", "domain"]
}
```

**A New Zealand row carries these fields instead (abridged):**

```jsonc
{
  "country": "nz",
  "agencyName": "Sample Realty Remuera",
  "nzStats": [{ "source": "realestate-nz", "soldTotal": 80, "sold12m": 28, "medianPrice": 1940000 }],
  "servicedSuburbs": ["Remuera", "Epsom", "Meadowbank"],
  "nzRecentSales": [{ "address": "3 Sample Road, Remuera", "suburb": "Remuera", "soldDate": "2026-09-12", "source": "realestate-nz" }],
  "licenceCheck": "matched"
}
```

### Plan Requirement

The agent directories are read through Apify's built-in connection service, which the default `proxyConfiguration` selects. Keep the default and run on an Apify plan that includes it. If a run cannot be served, the actor stops with a clear message and charges nothing for rows it did not deliver.

### FAQ

#### How much does it cost?

The actor uses pay-per-event pricing: a small start event, one event per scored agent report, and separate events for sold history, reviews analysis, the co-listing network and suburb leaderboards, with lower prices on higher Apify plans. See the Pricing tab for the current prices, and use `maxItems` to cap the cost of a run.

#### Is it legal to scrape real-estate agent data?

The actor reads only publicly available pages and government register entries, and collects an email or phone only when a page displays it. You are responsible for using the data in line with the privacy, spam and marketing laws that apply to you, such as the Australian Privacy Act and Spam Act and the New Zealand Privacy Act, and with each site's terms.

#### Can I get only new or changed agents on a schedule?

Yes. Turn on `incrementalMode` with a fixed `stateKey`. Scheduled runs then return only `NEW`, `UPDATED` and (with `emitExpired`) `EXPIRED` agents, and unchanged agents are neither returned nor billed unless you set `emitUnchanged`.

#### Why did my run fail instead of returning an empty dataset?

If the sources do not answer, the run stops with a clear message instead of returning an empty result, and you are not charged for rows that were not delivered. Run it again later or lower `maxRequestsPerMin`.

#### Why are some contacts, prices or licences missing?

Contacts are collected only where a public page shows them, so some agents have no email or phone. New Zealand sources often keep prices private, and some states publish no searchable licence register, so those agents have no licence entry.

#### Can I use it with AI agents or MCP?

Yes. Call the actor as a tool through Apify's MCP server or the API. The output is structured data with source links, so your AI agent can quote it instead of guessing.

### 🔗 Want more Realestate data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏠 <a href="https://apify.com/abotapi/realestate-au-scraper"><b>Real Estate AU</b></a><br>Extract detailed Australian real estate property listings with 30+ structured fields...</td><td>🏠 <a href="https://apify.com/abotapi/realestate-co-nz-scraper"><b>RealestateCo NZ</b></a><br>Search and extract all real estate properties for sale, rent, and sold across New Zealand...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/au-property-agents-scraper"><b>Real Estate AU Agents Scraper</b></a><br>Scrape Australian real estate agent and agency profiles by suburb or profile URLs...</td><td>🏠 <a href="https://apify.com/abotapi/reiwa-com-au-scraper"><b>REIWA Scraper</b></a><br>Scrape REIWA.com.au across sale, rental, sold, commercial, business and rural properties...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/homely-com-au-scraper"><b>Homely.com.au</b></a><br>Scrape Homely.com.au properties for sale, rent, and sold, plus agent finder, suburb...</td><td>📇 <a href="https://apify.com/abotapi/hipages-business-scraper"><b>HiPages Scraper</b></a><br>Scrape business listings from HiPages Australia by category, location, or URL. Extract...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/realestate-agent-osint/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

What to run. 'realestate' (default): one scored report per agent from agentQueries, agentUrls or suburbs. 'url': read the pasted urls (listings, agencies, articles, agent profiles); agentQueries, agentUrls and suburbs are then ignored.

## `urls` (type: `array`):

URL mode only (ignored in Realestate mode). One link per line from reiwa.com.au, domain.com.au, ratemyagent.com.au / .co.nz, realestate.com.au, realcommercial.com.au, property.com.au, theguardian.com or theurbandeveloper.com, a realestate.co.nz agent profile (/agent/<id>/<name>) or a Ray White New Zealand office site agent profile. Left untouched: one example of every supported link shape. maxItems is split evenly across the links (at least 1 record each). Unsupported or bot-protected links are skipped with a SKIP warning.

## `agentQueries` (type: `array`):

Agents to look up by name, as a JSON array: \[{"name": "Jane Smith", "suburb": "Bondi NSW"}]; New Zealand (country nz): {"name": "Jane Smith", "suburb": "Ponsonby, Auckland"}. The suburb is optional but keeps namesakes out: the directories are searched in that suburb's state. An ambiguous suburb ("Richmond") is not searched or billed; the run lists the candidates.

## `agentUrls` (type: `array`):

Agent profile links to report on: domain.com.au /real-estate-agent/<name>-<id>, ratemyagent.com.au or .co.nz /real-estate-agent/<name>-<code>/, reiwa.com.au or realestate.com.au agent pages. One row per agent, however many links reach it.

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

Suburbs to sweep for the agents working there. Australia with the state (and postcode): "Bondi NSW", "Brighton VIC 3186", "Darwin" (= Darwin City NT 0800). New Zealand (country nz) with the region: "Ponsonby, Auckland". A name several suburbs share ("Richmond", "St Kilda") is not swept until you add the state, postcode or region; the run lists the candidates.

## `maxAgentsPerSuburb` (type: `integer`):

Max agents reported per swept suburb, counted as people (one agent on several directories is one row).

## `country` (type: `string`):

Market: 'au' = Australia (NSW, VIC, QLD, SA, WA, TAS, NT, ACT), 'nz' = New Zealand. Scopes the directories, the suburb names and the licence registers; a suburb of the other country is not swept.

## `includeSoldHistory` (type: `boolean`):

Attach the sold listings (address, date, price where published, method) and their analysis. Billed as sold-history once per agent whose sold list is complete and holds 5 or more sales.

## `includeReviews` (type: `boolean`):

Attach the review analysis: count, average, Bayesian rating, aspect themes with real quotes (reviewer names removed). Billed as reviews-multisite once per agent with analysed reviews.

## `includeLicenceCheck` (type: `boolean`):

Check the agent's own register (NSW, QLD, WA or New Zealand). licence holds a CONFIRMED licence only (name and the register's address agree); same-name entries the address does not confirm go to licenceCandidates (leads, not facts); licenceCheck says how the lookup ended. VIC, SA, ACT, TAS and NT have no register that permits automated lookup (licenceCheck no-public-register).

## `includeNetwork` (type: `boolean`):

Attach the co-listing partners named on the agent's sales; a partner that is another agent of this run is marked inRun. When the graph has at least one link, network.html is saved and network is billed once per run.

## `includeAgencyData` (type: `boolean`):

Attach the agent's agency (agency). Australia: as the agent directory publishes it: website, general mailbox (labelled role or person), phone, address, logo, profile tier and roster (names, roles, directory links; never colleagues' numbers); rides the agent's profile request, no extra request. New Zealand: the office of the agent's joined realestate.co.nz profile: name, legal entity, address, website and roster names.

## `includeCurrentListings` (type: `boolean`):

Attach the agent's current for-sale listings (currentListings). Australia: the directory's total, suburbs, property types, advertised price texts, auction share and up to 5 listing links (one extra directory request per agent). New Zealand: the joined realestate.co.nz profile's own total and its first 6 listings with listed date and days listed (no extra request).

## `includeAgentWebsites` (type: `boolean`):

Read the agent's public profiles beyond the directories. Australia: the agent's profile on its agency's own website (Ray White, LJ Hooker, Raine & Horne, Harcourts, Barry Plant office sites, the agent's own page, or an independent agency's team pages). New Zealand: realestate.co.nz (the mobile its call link shows, office legal entity and address, listings, 12-month figures, recent sales), OneRoof (sold totals, bio, specialities, top suburbs), the Bayleys agent list and the agency's own site (Harcourts, Ray White, the agent's own page). Emails and phones ONLY as a page shows them (never behind an Email button, a masked number or hidden page data). A profile is used only when a phone it shows is already on the agent's record, or it is the only person of that name at the agent's office (in New Zealand also sharing a sale or listing with the agent's record); anything weaker is listed in leads. A site that does not answer is listed in unreadSections (agentWebsite / nzProfiles). Plain web requests, no proxy, about 1 to 8 per agent.

## `includeMedia` (type: `boolean`):

Search the Elite Agent industry news site for articles that print the agent's full name (one search per name, plain web request, no proxy). An article is listed in mediaMentions only when a sentence that names the agent also names the agent's agency or one of its suburbs, and no sentence ties the name to another office; any other article that prints the name is listed in mentionLeads (a lead, never counted or scored). Awards are read only from a sentence of such an article that names the agent and the award together (awards, source 'media'). Links point to the public articles. A news site that does not answer is listed in unreadSections (media).

## `includeAgencyEntity` (type: `boolean`):

Look up the agency on the public Australian Business Register (ABN Lookup name search in the office's state, plus one details page; plain web requests, at most two per agency, cached per run). agency.entity (ABN, entity name and type, status, GST, business names, location) is filled only when exactly one active entity in that state carries the agency's name AND its main business location postcode is the office postcode; otherwise up to three unconfirmed agency.entityCandidates are listed with the reason. It describes the agency, never the agent. Needs the agency block (Agency profile block on). New Zealand: not available (the NZ business register needs an access key). A register that does not answer is listed in unreadSections (agencyEntity).

## `aiAnalysis` (type: `boolean`):

Deprecated: no longer used. The actor returns structured data for your own AI agent.

## `suburbLeaderboard` (type: `boolean`):

Also push one ranked leaderboard row per suburb with 3 or more scored agents (the agents the sweep found there or whose main suburb it is). Billed as suburb-leaderboard once per board.

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

Hard cap on agents reported (and billed) per run in Realestate mode; one person is one row. URL mode: total records, split evenly across the links (at least 1 per link).

## `proxyConfiguration` (type: `object`):

Default: Apify Proxy RESIDENTIAL with AU exits (New Zealand works over them too). Agents outside Western Australia need residential: on a datacenter-only group or no proxy those directories are skipped, and a run that finds nothing else fails with 'Residential connection required'. Proxy traffic counts toward your Apify proxy usage.

## `maxRequestsPerMin` (type: `integer`):

Polite pacing per site: each directory, review site and licence register gets at most this many requests per minute.

## `resumeFromRunId` (type: `string`):

Run ID (or its dataset ID) of an interrupted run of this actor: agents it already reported are skipped and not billed again.

## `incrementalMode` (type: `boolean`):

Only emit (and only bill) agents that are new or whose merged record changed since the last successful run with the same state key. Compared: name, contact details, agency, licence, sold-listing summary and history, review count and average. Never compared (kept in the output): fetch and last-seen timestamps, photo URL, recent review text, source lists, and the values measured against the other agents of the run (score, network, Bayesian rating), which move whenever a peer joins or drops out. Unchanged agents are suppressed and not billed. When a source refuses an agent it listed before, the stored record is kept (for at most two runs in a row) instead of a degraded one.

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

Named baseline scope for incremental mode. Runs sharing a stateKey diff against each other.

## `emitUnchanged` (type: `boolean`):

Incremental mode only: also emit (and bill) unchanged agents, flagged changeType=UNCHANGED.

## `emitExpired` (type: `boolean`):

Incremental mode only: also emit agents that disappeared from the source set since the baseline, flagged changeType=EXPIRED. Only after a complete suburbs-only scan: never when a site refused a profile, suburb list or name search on that run, nor after a time-limit cut or a maxItems cap.

## `ignoreFieldsForChanges` (type: `array`):

Extra dataset fields that must not alone mark a record UPDATED. Dotted paths reach nested fields, for example reviews.average or soldSummary.count12m; \* matches any one key.

## `mcpConnectors` (type: `array`):

Optionally send a condensed summary of each result into the apps you already use, via Model Context Protocol (MCP) connectors. The full record stays in the dataset. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify.

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "realestate",
  "urls": [
    "https://reiwa.com.au/for-sale/applecross/",
    "https://reiwa.com.au/for-sale/applecross/houses/",
    "https://reiwa.com.au/for-sale/applecross/?page=2",
    "https://reiwa.com.au/sold/applecross/",
    "https://reiwa.com.au/rental-properties/applecross/",
    "https://reiwa.com.au/commercial/for-sale/perth/",
    "https://reiwa.com.au/business/for-sale/perth~region/",
    "https://reiwa.com.au/real-estate-agents/applecross/",
    "https://reiwa.com.au/27-marmion-street-fremantle-4964208/",
    "https://reiwa.com.au/real-estate-agency/bourkes-14089-0/",
    "https://reiwa.com.au/the-wa-market/resources/",
    "https://reiwa.com.au/news/perth-vacancy-rate-drops-to-lowest-level-in-nearly-two-years/",
    "https://www.theguardian.com/australia-news/australia-news",
    "https://www.theguardian.com/australia-news/2026/oct/01/brisbane-sydney-hit-hardest-by-falling-house-prices",
    "https://www.theurbandeveloper.com/",
    "https://www.theurbandeveloper.com/articles/brisbane-airport-corporation-masterplan-terminal3-plans-investment-approved"
  ],
  "agentQueries": [],
  "agentUrls": [],
  "suburbs": [
    "Applecross WA"
  ],
  "maxAgentsPerSuburb": 4,
  "country": "au",
  "includeSoldHistory": true,
  "includeReviews": true,
  "includeLicenceCheck": true,
  "includeNetwork": true,
  "includeAgencyData": true,
  "includeCurrentListings": true,
  "includeAgentWebsites": true,
  "includeMedia": true,
  "includeAgencyEntity": true,
  "aiAnalysis": false,
  "suburbLeaderboard": false,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  },
  "maxRequestsPerMin": 24,
  "incrementalMode": false,
  "stateKey": "default",
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `default` (type: `string`):

No description

## `profiles` (type: `string`):

No description

## `media` (type: `string`):

No description

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

No description

## `agencies` (type: `string`):

No description

## `articles` (type: `string`):

No description

## `leaderboard` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `sales` (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 = {
    "mode": "realestate",
    "urls": [
        "https://reiwa.com.au/for-sale/applecross/",
        "https://reiwa.com.au/for-sale/applecross/houses/",
        "https://reiwa.com.au/for-sale/applecross/?page=2",
        "https://reiwa.com.au/sold/applecross/",
        "https://reiwa.com.au/rental-properties/applecross/",
        "https://reiwa.com.au/commercial/for-sale/perth/",
        "https://reiwa.com.au/business/for-sale/perth~region/",
        "https://reiwa.com.au/real-estate-agents/applecross/",
        "https://reiwa.com.au/27-marmion-street-fremantle-4964208/",
        "https://reiwa.com.au/real-estate-agency/bourkes-14089-0/",
        "https://reiwa.com.au/the-wa-market/resources/",
        "https://reiwa.com.au/news/perth-vacancy-rate-drops-to-lowest-level-in-nearly-two-years/",
        "https://www.theguardian.com/australia-news/australia-news",
        "https://www.theguardian.com/australia-news/2026/oct/01/brisbane-sydney-hit-hardest-by-falling-house-prices",
        "https://www.theurbandeveloper.com/",
        "https://www.theurbandeveloper.com/articles/brisbane-airport-corporation-masterplan-terminal3-plans-investment-approved"
    ],
    "suburbs": [
        "Applecross WA"
    ],
    "maxAgentsPerSuburb": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/realestate-agent-osint").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 = {
    "mode": "realestate",
    "urls": [
        "https://reiwa.com.au/for-sale/applecross/",
        "https://reiwa.com.au/for-sale/applecross/houses/",
        "https://reiwa.com.au/for-sale/applecross/?page=2",
        "https://reiwa.com.au/sold/applecross/",
        "https://reiwa.com.au/rental-properties/applecross/",
        "https://reiwa.com.au/commercial/for-sale/perth/",
        "https://reiwa.com.au/business/for-sale/perth~region/",
        "https://reiwa.com.au/real-estate-agents/applecross/",
        "https://reiwa.com.au/27-marmion-street-fremantle-4964208/",
        "https://reiwa.com.au/real-estate-agency/bourkes-14089-0/",
        "https://reiwa.com.au/the-wa-market/resources/",
        "https://reiwa.com.au/news/perth-vacancy-rate-drops-to-lowest-level-in-nearly-two-years/",
        "https://www.theguardian.com/australia-news/australia-news",
        "https://www.theguardian.com/australia-news/2026/oct/01/brisbane-sydney-hit-hardest-by-falling-house-prices",
        "https://www.theurbandeveloper.com/",
        "https://www.theurbandeveloper.com/articles/brisbane-airport-corporation-masterplan-terminal3-plans-investment-approved",
    ],
    "suburbs": ["Applecross WA"],
    "maxAgentsPerSuburb": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/realestate-agent-osint").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 '{
  "mode": "realestate",
  "urls": [
    "https://reiwa.com.au/for-sale/applecross/",
    "https://reiwa.com.au/for-sale/applecross/houses/",
    "https://reiwa.com.au/for-sale/applecross/?page=2",
    "https://reiwa.com.au/sold/applecross/",
    "https://reiwa.com.au/rental-properties/applecross/",
    "https://reiwa.com.au/commercial/for-sale/perth/",
    "https://reiwa.com.au/business/for-sale/perth~region/",
    "https://reiwa.com.au/real-estate-agents/applecross/",
    "https://reiwa.com.au/27-marmion-street-fremantle-4964208/",
    "https://reiwa.com.au/real-estate-agency/bourkes-14089-0/",
    "https://reiwa.com.au/the-wa-market/resources/",
    "https://reiwa.com.au/news/perth-vacancy-rate-drops-to-lowest-level-in-nearly-two-years/",
    "https://www.theguardian.com/australia-news/australia-news",
    "https://www.theguardian.com/australia-news/2026/oct/01/brisbane-sydney-hit-hardest-by-falling-house-prices",
    "https://www.theurbandeveloper.com/",
    "https://www.theurbandeveloper.com/articles/brisbane-airport-corporation-masterplan-terminal3-plans-investment-approved"
  ],
  "suburbs": [
    "Applecross WA"
  ],
  "maxAgentsPerSuburb": 4
}' |
apify call abotapi/realestate-agent-osint --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/realestate-agent-osint"
        }
    }
}
```

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/ejqymSZG0K1dGeoMn/builds/4YjaTmgaEScBx3B5F/openapi.json
