# View.com.au Scraper - Property Listings, Prices & Agents (`abotapi/view-com-au-scraper`) Actor

Scrape View.com.au properties for sale, rent and recently sold across Australia. Search by suburb, city, state or URL. Extract prices, full addresses, property details, agents and agencies, photos, GPS coordinates and market insights.

- **URL**: https://apify.com/abotapi/view-com-au-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Automation, Travel
- **Features:** Limited permissions
- **Stats:** 11 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.
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

## View.com.au Scraper: For Sale, For Rent and Sold Listings Across Australia

View.com.au Scraper turns View.com.au into structured property data. Search by state, suburb or postcode, paste search-result URLs, or paste individual property links, and get full addresses, parsed prices, bedrooms, bathrooms, car spaces, land size, agent and agency contacts, images and GPS coordinates for properties for sale, for rent or already sold. Export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Three ways to search.** Build a search from state, suburb and postcode, paste View.com.au search-result page URLs directly, or paste individual property detail URLs for one record per link.
- **Search results already carry the useful fields.** Price, address, agent and image details come back with the listing card itself, so most searches do not need a separate visit to each property page.
- **Structured, ready-to-use data.** Prices are parsed into a numeric value, currency and price type, addresses are split into street, suburb, state and postcode, and GPS coordinates are included where the source provides them.
- **Optional detail-page enrichment.** Turn on Include Detail Page Data, or use detail mode, for the full description, floor plans, a valuation estimate, the suburb's price trend and the agent's email address.
- **Flexible filters.** Narrow by property type, price, bedrooms, bathrooms and car spaces, and choose how results are sorted.
- **Four pre-built dataset views.** Overview, Media, Agents and Agencies, and Location and Market views are ready in the dataset, so you can browse results without building your own column layout.
- **Built for recurring monitoring.** Incremental mode classifies every listing against your last scheduled run as new, updated, unchanged, reappeared or expired (expired and reappeared require turning on Emit expired listings), and a genuine connectivity failure fails the run loudly instead of quietly returning nothing.

### Use Cases

- **Property investors and buyers' agents:** track new listings and price changes across a suburb, a city or a whole state.
- **Real estate agencies and agents:** monitor competitor listings, sale methods and agent performance metrics in your market.
- **Rental market researchers:** collect weekly rent prices and availability across suburbs for yield analysis.
- **Data scientists and market analysts:** build historical price, suburb-trend and days-on-market datasets.
- **Lead generation teams:** collect agent and agency contact details tied to active listings.
- **Proptech and listing aggregators:** keep a property catalogue in sync with recurring incremental runs.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `id` | `12345678` |
| `listingUrl` | `"https://www.view.com.au/property/vic/sampleville-3000/5-10-example-street-12345678/"` |
| `address.full` | `"5/10 Example Street, SAMPLEVILLE VIC 3000"` |
| `address.suburb` / `address.state` / `address.postcode` | `"SAMPLEVILLE"` / `"VIC"` / `"3000"` |
| `price.display` | `"$850,000 - $900,000"` |
| `price.value` / `price.priceType` | `850000` / `"range"` |
| `features.bedrooms` / `features.bathrooms` / `features.carSpaces` | `3` / `2` / `1` |
| `features.landSizeInSqm` | `450` |
| `propertyType` / `sourcePropertyType` | `"apartment"` / `"Apartment & Unit"` |
| `listingType` | `"buy"` (also `"rent"`, `"sold"`) |
| `saleMethod` / `status` | `"Sale"` / `"On Market"` |
| `rank` | `"Premium"` |
| `images` | photo URLs with `sequence`, on the site's CDN |
| `agents` | `firstName`, `lastName`, `phone`, `mobile`, `numberOfSoldListings`, `averageSoldPrice` (replaced by a detail-page agent entry with `email` when detail data is included) |
| `agency` | `name`, `profileLink`, `brandColour` |
| `location.lat` / `location.lon` | `-37.81` / `144.96` |
| `daysOnMarket` | `14` |
| `soldPrice` / `soldAt` | `900000` / `"2026-01-20"` (sold listings) |
| `lgaName` | `"Sample Council"` |
| `createdAt` / `updatedAt` | listing-created and listing-updated timestamps |
| `source.portal` / `source.scrapedAt` | `"view.com.au"` / scrape timestamp |

Every row also carries spreadsheet-friendly flat copies of the most-used nested values, `suburb`, `state`, `postcode`, `priceDisplay`, `priceValue`, `priceMin`, `priceMax`, `isPriceHidden`, `bedrooms`, `bathrooms`, `carSpaces`, `landSizeInSqm`, `landSizeSystem`, `latitude`, `longitude`, `imageCount`, `agentName`, `agentPhone`, `agencyName` and `agencyUrl`. They repeat values already in the nested fields (null when the listing does not provide them), add no extra charge, and the nested fields are unchanged.

For convenience the input also accepts the alternative names `startUrl` (one search URL, switches to URL mode), `location` (for example `nsw` or `Kew, VIC`), `results_wanted` (same as Max listings) and `max_pages` (same as Max pages). `startUrl` and `results_wanted` win when given (an explicit Max listings value is overridden by a positive `results_wanted`, `startUrl` replaces Search List URLs); `location` and `max_pages` only apply when Locations and Max pages are empty.

Turning on Include Detail Page Data, or using detail mode, adds `heading`, `description`, `floorPlans`, `landPricePerSqm`, `staticMapUrl`, `videoUrl` and `virtualTourUrl` (each only when the source page provides it), `valuationEstimate` and `suburbTrend`, all pulled from the property's own detail page rather than the search-results card. It also replaces the `agents` array with a detail-page version that adds `email` and `photoFileName` but drops `numberOfSoldListings`, `averageSoldPrice` and `position`. When incremental mode is on, every row also carries `changeType`, `changedFields`, `firstSeenAt` and `lastSeenAt`; these four fields are absent unless incremental mode is turned on.

### How to Use

1. Pick a **Search Mode**: Search by Location, Search List URLs, or Property Detail URLs.
2. For location mode, add one or more locations. State is required; suburb and postcode are optional. Set the **Listing Type**. For URL or detail mode, paste the URLs instead.
3. Optionally filter by property type, price, bedrooms, bathrooms or car spaces, and pick a sort order.
4. Set **Maximum Listings** and **Maximum Pages** to control run size and cost, then click **Start**.

#### URL mode

Behaviour change: the default **Search List URLs** list now holds one example of each supported URL shape (previously a single Melbourne search page). The URLs are read in order until **Maximum Listings** is reached (default 25, so by default only the first URL is read); raise Maximum Listings to cover every shape, or clear the field and paste your own URLs. Supported shapes:

| Shape | Example |
| --- | --- |
| Buy, rent, sold search | `view.com.au/for-sale/vic/in-melbourne-3000/`, `/for-rent/...`, `/sold-properties/...` |
| Suburb without postcode, state-wide, other suburb | `/for-sale/vic/in-melbourne/`, `/for-sale/vic/`, `/for-sale/vic/in-kew-east-3102/` |
| Paginated | `?page=2` (that page is scraped), also with `sort` |
| Property type and bedrooms | `/apartments/`, `/houses/in-melbourne-3000/`, `/3-bedrooms/`, `/houses/3-bedrooms/` |
| Price filter | `?priceFrom=500000&priceTo=900000` |
| Legacy `/list-2` | rewritten to `?page=2` |
| `www.` host | accepted |
| Property detail | full `/property/...-<id>/` URL, one record |

Numeric-id-only property URLs (`/property/<id>/`) are not served by the site and are skipped with a warning. In Search by Location mode a plain name such as `Kew East` is accepted for the suburb.

**Search for sale properties in Melbourne CBD:**

```json
{
  "mode": "location",
  "locations": [{ "suburb": "Melbourne", "state": "VIC", "postcode": "3000" }],
  "listingType": "buy",
  "maxListings": 50,
  "maxPages": 2
}
```

**Rentals with at least two bedrooms across two locations, including a state-wide search:**

```json
{
  "mode": "location",
  "locations": [
    { "state": "VIC" },
    { "suburb": "Sydney", "state": "NSW", "postcode": "2000" }
  ],
  "listingType": "rent",
  "bedroomsMin": 2,
  "maxListings": 100,
  "maxPages": 4
}
```

**Scrape from a search-result URL you already have:**

```json
{
  "mode": "url",
  "urls": ["https://www.view.com.au/for-sale/vic/in-melbourne-3000/"],
  "maxListings": 50
}
```

**Scrape specific property detail pages:**

```json
{
  "mode": "detail",
  "detailUrls": [
    "https://www.view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"
  ]
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/view-com-au-scraper").call(run_input={
    "mode": "location",
    "locations": [{"suburb": "Melbourne", "state": "VIC", "postcode": "3000"}],
    "listingType": "buy",
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["address"]["full"], listing["price"]["display"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/view-com-au-scraper').call({
  mode: 'location',
  locations: [{ suburb: 'Melbourne', state: 'VIC', postcode: '3000' }],
  listingType: 'buy',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

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

#### Resume and recurring updates

Three related but separate controls, pick the one that matches what you are doing:

- **Resume from Checkpoint** (on by default) continues the SAME run automatically after a platform migration or a manual Resurrect. Nothing to configure.
- **Resume from run ID** continues ONE specific PREVIOUS interrupted run: paste its run or dataset id and this run skips every listing id already collected there.
- **Incremental mode** is for running this SAME search on a schedule, such as daily. The actor remembers the search itself, keyed by **State key**, or an automatically derived key based on your mode, locations, filters and sort, so a differently configured search never shares a baseline by accident. Every row then carries `changeType` (`NEW`, `UPDATED`, `UNCHANGED`, `REAPPEARED` or `EXPIRED`), `changedFields`, `firstSeenAt` and `lastSeenAt`.

By default, `UNCHANGED` listings are suppressed and not billed, and `EXPIRED` listings are never produced. Turn on **Emit unchanged listings** and **Emit expired listings** to see them too; both bill extra dataset rows. `EXPIRED` is only produced after a run that scans the complete tracked search from a fresh start (in URL mode, only when every pasted URL is page 1 and shows the whole result set; in detail mode never), with no Maximum Listings or Maximum Pages cap hit, no fetch failure, no Resume from run ID, and not resumed from a checkpoint. `REAPPEARED` only appears for a listing an earlier complete scan already marked `EXPIRED`, once a later run finds it again; a listing that merely drops out during a partial run is not classified as `REAPPEARED`.

In incremental mode, `source`, `updatedText` and `daysOnMarket` are always left out of the comparison because they change without the listing changing; they still appear in the output. Use **Ignore fields when detecting changes (incremental mode only)** to skip more, for example `images` or `agents.email`. Changing that list never produces a one-time wave of UPDATED rows.

Resume from run ID and incremental mode can be combined once, to bootstrap a monitoring baseline from an existing dataset. With incremental mode off, the default, output is unchanged from before this feature existed.

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

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape; the Apify dataset itself 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** (the listing's address) and its key fields flattened to plain text, such as price, agency, property type, status and listing URL. 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 have not authorized a connector yet.
3. For **Notion**, also set `notionParentPageUrl` to the page where item pages 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` | string | `location` | `location`, `url`, or `detail`. |
| `locations` | array | required for location mode (prefill: suburb Melbourne, state VIC, postcode 3000) | Locations to search. State is required; suburb and postcode are optional. |
| `urls` | array | one example of each supported URL shape, read in order until Maximum Listings is reached (see URL mode below) | View.com.au search-result page URLs; each URL scrapes exactly the page it points at. A full property URL pasted here is scraped as one detail record. |
| `detailUrls` | array | `["https://www.view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"]` (one example La Trobe Street, Melbourne property URL; replace it with your own) | Individual property detail page URLs. One record per URL. |
| `listingType` | string | `buy` | `buy`, `rent`, or `sold`. |
| `propertyTypes` | array | none (all types) | Filter: `house`, `apartment`, `townhouse`, `land`, `studio`, `villa`, `rural`. |
| `priceMin` | integer | none | Minimum price in AUD. |
| `priceMax` | integer | none | Maximum price in AUD. |
| `bedroomsMin` | integer | none | Minimum bedrooms. |
| `bathroomsMin` | integer | none | Minimum bathrooms. |
| `carsMin` | integer | none | Minimum car spaces. |
| `sort` | string | `date-desc` | `default`, `date-desc`, `updatedAt-desc`, `price-asc`, or `price-desc`. |
| `maxListings` | integer | `25` | Stop after this many listings. |
| `maxPages` | integer | `2` | Max search pages per location, about 25 results per page. |
| `includeDetailPage` | boolean | `false` | Fetch each property's detail page for description, floor plans and more. |
| `outputFormat` | array | `["json"]` | Legacy setting; it does not change the output. Download the dataset as JSON, CSV, Excel and other formats from the Storage tab regardless of this setting. |
| `proxyConfiguration` | object | Apify Residential, country AU | Connection settings. |
| `resumeFromCheckpoint` | boolean | `true` | Continue the SAME run after a platform migration or a manual Resurrect. |
| `resumeFromRunId` | string | none | Continue ONE interrupted previous run or dataset by id. |
| `incrementalMode` | boolean | `false` | Track this search across scheduled runs and flag NEW, UPDATED, UNCHANGED, REAPPEARED and EXPIRED listings. |
| `stateKey` | string | none (auto-derived from your search settings) | Set only to intentionally share one incremental baseline across differently-configured runs. |
| `emitUnchanged` | boolean | `false` | Also output, and bill, UNCHANGED listings. |
| `emitExpired` | boolean | `false` | Also output, and bill, EXPIRED listings after a complete scan. |
| `ignoreFieldsForChanges` | array | `[]` | Incremental mode only. Field names or dotted paths (for example `price.display`) that never make a listing UPDATED or appear in `changedFields`. The fields stay in the output. |
| `mcpConnectors` | array | none | Send a summary of each record to apps authorized under Integrations. |
| `notionParentPageUrl` | string | none | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "id": 12345678,
  "listingUrl": "https://www.view.com.au/property/vic/sampleville-3000/5-10-example-street-12345678/",
  "address": {
    "full": "5/10 Example Street, SAMPLEVILLE VIC 3000",
    "streetNumber": "10",
    "streetName": "Example Street",
    "unitNumber": "5",
    "suburb": "SAMPLEVILLE",
    "state": "VIC",
    "postcode": "3000",
    "country": "Australia",
    "countryCode": "AU"
  },
  "price": {
    "display": "$850,000 - $900,000",
    "value": 850000,
    "currency": "AUD",
    "priceType": "range",
    "isRange": true,
    "min": 850000,
    "max": 900000
  },
  "features": {
    "bedrooms": 3,
    "bathrooms": 2,
    "carSpaces": 1,
    "landSizeInSqm": 450
  },
  "propertyType": "apartment",
  "sourcePropertyType": "Apartment & Unit",
  "listingType": "buy",
  "saleMethod": "Sale",
  "status": "On Market",
  "rank": "Premium",
  "images": [
    {
      "url": "https://view.com.au/viewstatic/images/listing/sample-slug/800-w/12345678-1-ABC1234.jpg",
      "sequence": 1
    }
  ],
  "agents": [
    {
      "id": 99999,
      "firstName": "Jane",
      "lastName": "Smith",
      "phone": "9000 1234",
      "mobile": "0400 000 000",
      "profileLink": "https://www.view.com.au/agent/jane-smith-99999/",
      "numberOfSoldListings": 25,
      "averageSoldPrice": 920000
    }
  ],
  "agency": {
    "id": 10001,
    "name": "Sample Realty",
    "profileLink": "https://www.view.com.au/agency/sample-realty-10001/",
    "brandColour": "1A1A1A"
  },
  "location": { "lat": -37.81, "lon": 144.96 },
  "daysOnMarket": 14,
  "lgaName": "Sample Council",
  "createdAt": "2026-01-15T09:30:00.000Z",
  "updatedAt": "2026-02-20T11:00:00.000Z",
  "source": {
    "portal": "view.com.au",
    "scrapedAt": "2026-02-22T12:00:00.000Z"
  }
}
```

### Plan Requirement

The default proxy setting, Apify Residential with country Australia, is the tested and supported configuration, and the one this actor is built for. The actor first requests pages without any extra step and only obtains a site clearance when the site challenges the request. If a residential exit is refused, it rotates across Australian, New Zealand and Singapore residential exits. In our measurements, requests through an Apify datacenter proxy group were refused by the site, so a datacenter group is not recommended; if you choose a different proxy group or your own proxy URLs, results are not guaranteed.

Apify free plans do not include residential proxies. If the connection is refused for your account the run stops with this message: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required: https://apify.com/pricing. If you entered your own proxy URLs, check that their credentials are valid." If pages cannot be loaded for any other reason, the run fails with "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later." rather than returning an empty dataset. Check the Proxy and Storage page in your Apify account for your current residential proxy access.

### FAQ

#### How much does it cost?

Pricing is set on this actor's page. The **Pricing** tab shows the current rates. You are charged for two events: `apify-default-dataset-item` once for every row written to the dataset, and `apify-actor-start` once per run. Rows that are not written (for example unchanged listings suppressed in incremental mode) are not charged. Use **Maximum Listings** to cap the size, and the cost, of any run (at most 100000 listings per run and 100 pages per location).

#### Is it legal to scrape View.com.au?

This actor collects only publicly available property listing data. You are responsible for how you use it: follow View.com.au's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price, address and features are generally factual data, but photos and agency branding may be subject to third-party rights.

#### Can I get only new, updated or delisted properties on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. Each run then returns only new and updated listings by default; unchanged ones are skipped and not billed unless you turn on **Emit unchanged listings**. Turn on **Emit expired listings** to also see delistings, but that is only produced after a run that scans the complete tracked search from a fresh start, with no cap hit and neither resume mechanism truncating it. A listing only shows as `REAPPEARED` after an earlier complete scan already marked it `EXPIRED` and a later run finds it again; a listing that comes back after being skipped for another reason is not classified as `REAPPEARED`.

#### What is the difference between the three resume and update controls?

**Resume from Checkpoint** (on by default) automatically continues the SAME run after a platform migration or a manual Resurrect, with nothing to configure. **Resume from run ID** continues ONE specific PREVIOUS interrupted run by pasting its run or dataset id, skipping listings it already collected. **Incremental mode** is for a recurring, scheduled search: the actor remembers the search itself and classifies every listing against what it saw last time, with no id to paste. They do not conflict, and can be combined once to bootstrap a monitoring baseline from an existing dataset.

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

A run fails outright, rather than finishing with an empty dataset, when the input itself is invalid, when a pasted **Resume from run ID** does not match a run or dataset this Apify account can read, when incremental mode already has saved state for this search and you also pass **Resume from run ID**, or when a connectivity failure occurred and zero listings were collected. A run that reaches View.com.au fine but genuinely finds no matching listings for your filters finishes successfully with an empty dataset and a status message, not a failure. Try loosening your filters, or check that the suburb and state are spelled correctly.

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

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each listing into Notion, Linear or Airtable.

### 🔗 Want more real estate 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/realcommercial-au-scraper"><b>Commercial Property AU Scraper</b></a><br>Scrape Australian commercial property listings with full detail data. Extract...</td></tr>
<tr><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><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></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/domain-com-au-scraper"><b>Domain.com.au</b></a><br>Extract enriched Domain.com.au property listings across buy, rent, and sold, with...</td><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></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/view-com-au-scraper/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`):

Search by Location builds URLs from suburb/state. Search List URLs lets you paste view.com.au search result page URLs directly. Property Detail URLs scrapes individual property pages you paste (one record per URL).

## `locations` (type: `array`):

Locations to search. State is required. Suburb and postcode are optional - omit for broader searches.

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

Type of property listings to scrape

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

Filter by property type. Leave empty for all types.

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

Minimum property price in AUD

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

Maximum property price in AUD

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

Minimum number of bedrooms

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

Minimum number of bathrooms

## `carsMin` (type: `integer`):

Minimum number of car spaces

## `sort` (type: `string`):

Sort order for search results

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

Paste view.com.au search result page URLs (listing pages). These are URLs that show multiple properties, e.g. https://www.view.com.au/for-sale/vic/in-melbourne-3000/. Each URL scrapes exactly the page it points at (a ?page=N URL scrapes page N). A pasted full property URL (/property/vic/...-12345678/) is scraped as one detail record. The default list holds one example of each supported URL shape; URLs are read in order until Maximum Listings is reached (default 25, so by default only the first URL is read - raise Maximum Listings to cover every shape).

## `detailUrls` (type: `array`):

Paste individual view.com.au property detail page URLs, e.g. https://www.view.com.au/property/vic/melbourne-3000/123-example-street-12345678/. One record is scraped per URL with full detail-page data. Only used when Search Mode is 'Property Detail URLs'.

## `maxListings` (type: `integer`):

Stop after scraping this many listings. Capped at 100000 per run.

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

Maximum search result pages per location. Each page has ~25 results. Left empty, 2 pages are read. A hard cap of 100 pages per location always applies.

## `includeDetailPage` (type: `boolean`):

Fetch each property detail page for full data (description, all images, floor plans, sale history). Slower but more complete.

## `outputFormat` (type: `array`):

Export data in these formats

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

Configure proxy for reliable access. Residential AU proxies recommended.

## `resumeFromCheckpoint` (type: `boolean`):

Continue from the last saved checkpoint within the SAME run if it was interrupted (platform migration or a manual Resurrect). Distinct from resumeFromRunId (continues a specific PREVIOUS run by id) and incrementalMode (remembers this search across scheduled runs) below.

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

Paste a previous run ID (or its dataset ID) to continue ONE interrupted crawl — listing ids already collected in that run are skipped so this run only adds new ones. For a same-run interruption use resumeFromCheckpoint instead; for ongoing scheduled monitoring of this search use incrementalMode below.

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

Turn on when you run this same search on a schedule (e.g. daily) and only want to know what's new or changed since last time. The actor remembers this search's listings itself — no need to paste a run ID. Adds changeType (NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED), changedFields, firstSeenAt, and lastSeenAt to every row. Off by default so existing scheduled runs are unaffected. See stateKey, emitUnchanged, and emitExpired below.

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

Optional label for the incrementalMode baseline. Leave empty to auto-derive one from your search settings (mode/locations/urls/detailUrls/listingType/property types/price/bedrooms/bathrooms/cars/sort) — a different filter setup automatically gets its own baseline, never sharing one by accident. Set this only if you want multiple differently-configured runs to intentionally share one baseline.

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

When incrementalMode is on, also output listings that are UNCHANGED since the last run (changeType=UNCHANGED, changedFields=\[]). Off by default: unchanged listings are silently skipped, so you only see and pay for what's new or different. Turning this on bills extra dataset-item rows for listings that haven't changed.

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

When incrementalMode is on, also output a row for previously-tracked listings that are no longer found (changeType=EXPIRED), so you can detect delistings. Only emitted after a run that scans the full tracked search with no cap hit and no resumeFromRunId — a partial run never marks a still-live listing as expired. Off by default. Turning this on bills extra dataset-item rows.

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

Incremental mode only. Field names (for example images) or dotted paths (for example price.display or agents.email) that must NOT make a listing count as UPDATED or appear in changedFields. The fields stay in the output; they are only skipped when comparing with the last run. Source, updatedText and daysOnMarket are always ignored. Changing this list never causes a one-time wave of UPDATED rows. Leave empty to compare every field.

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

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. Notion gets a page per item; other connectors receive a best-effort write/digest. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `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": "location",
  "locations": [
    {
      "suburb": "Melbourne",
      "state": "VIC",
      "postcode": "3000"
    }
  ],
  "listingType": "buy",
  "sort": "date-desc",
  "urls": [
    "https://view.com.au/for-sale/vic/in-melbourne-3000/",
    "https://view.com.au/for-rent/vic/in-melbourne-3000/",
    "https://view.com.au/sold-properties/vic/in-melbourne-3000/",
    "https://view.com.au/for-sale/vic/in-melbourne/",
    "https://view.com.au/for-sale/vic/",
    "https://view.com.au/for-sale/vic/in-kew-east-3102/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/?page=2",
    "https://view.com.au/for-rent/vic/in-melbourne-3000/?page=2",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/apartments/",
    "https://view.com.au/for-sale/vic/houses/in-melbourne-3000/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/3-bedrooms/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/houses/3-bedrooms/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/?priceFrom=500000&priceTo=900000",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/?sort=price-asc&page=2",
    "https://www.view.com.au/for-sale/vic/in-melbourne-3000/",
    "https://view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"
  ],
  "detailUrls": [
    "https://www.view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"
  ],
  "maxListings": 25,
  "includeDetailPage": false,
  "outputFormat": [
    "json"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  },
  "resumeFromCheckpoint": true,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `defaultDataset` (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": "location",
    "locations": [
        {
            "suburb": "Melbourne",
            "state": "VIC",
            "postcode": "3000"
        }
    ],
    "urls": [
        "https://view.com.au/for-sale/vic/in-melbourne-3000/",
        "https://view.com.au/for-rent/vic/in-melbourne-3000/",
        "https://view.com.au/sold-properties/vic/in-melbourne-3000/",
        "https://view.com.au/for-sale/vic/in-melbourne/",
        "https://view.com.au/for-sale/vic/",
        "https://view.com.au/for-sale/vic/in-kew-east-3102/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/?page=2",
        "https://view.com.au/for-rent/vic/in-melbourne-3000/?page=2",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/apartments/",
        "https://view.com.au/for-sale/vic/houses/in-melbourne-3000/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/3-bedrooms/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/houses/3-bedrooms/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/?priceFrom=500000&priceTo=900000",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/?sort=price-asc&page=2",
        "https://www.view.com.au/for-sale/vic/in-melbourne-3000/",
        "https://view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"
    ],
    "detailUrls": [
        "https://www.view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    },
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/view-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 = {
    "mode": "location",
    "locations": [{
            "suburb": "Melbourne",
            "state": "VIC",
            "postcode": "3000",
        }],
    "urls": [
        "https://view.com.au/for-sale/vic/in-melbourne-3000/",
        "https://view.com.au/for-rent/vic/in-melbourne-3000/",
        "https://view.com.au/sold-properties/vic/in-melbourne-3000/",
        "https://view.com.au/for-sale/vic/in-melbourne/",
        "https://view.com.au/for-sale/vic/",
        "https://view.com.au/for-sale/vic/in-kew-east-3102/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/?page=2",
        "https://view.com.au/for-rent/vic/in-melbourne-3000/?page=2",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/apartments/",
        "https://view.com.au/for-sale/vic/houses/in-melbourne-3000/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/3-bedrooms/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/houses/3-bedrooms/",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/?priceFrom=500000&priceTo=900000",
        "https://view.com.au/for-sale/vic/in-melbourne-3000/?sort=price-asc&page=2",
        "https://www.view.com.au/for-sale/vic/in-melbourne-3000/",
        "https://view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/",
    ],
    "detailUrls": ["https://www.view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/view-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 '{
  "mode": "location",
  "locations": [
    {
      "suburb": "Melbourne",
      "state": "VIC",
      "postcode": "3000"
    }
  ],
  "urls": [
    "https://view.com.au/for-sale/vic/in-melbourne-3000/",
    "https://view.com.au/for-rent/vic/in-melbourne-3000/",
    "https://view.com.au/sold-properties/vic/in-melbourne-3000/",
    "https://view.com.au/for-sale/vic/in-melbourne/",
    "https://view.com.au/for-sale/vic/",
    "https://view.com.au/for-sale/vic/in-kew-east-3102/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/?page=2",
    "https://view.com.au/for-rent/vic/in-melbourne-3000/?page=2",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/apartments/",
    "https://view.com.au/for-sale/vic/houses/in-melbourne-3000/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/3-bedrooms/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/houses/3-bedrooms/",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/?priceFrom=500000&priceTo=900000",
    "https://view.com.au/for-sale/vic/in-melbourne-3000/?sort=price-asc&page=2",
    "https://www.view.com.au/for-sale/vic/in-melbourne-3000/",
    "https://view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"
  ],
  "detailUrls": [
    "https://www.view.com.au/property/vic/melbourne-3000/2610-228-la-trobe-street-18250692/"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  },
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/view-com-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/view-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/7iwbnQ1XMHHObYxTv/builds/rIR0Ft6hq84gnAA0T/openapi.json
