# NSW Development Applications and Building Leads (`ausgovdata/nsw-planning-applications`) Actor

New NSW development applications and complying development certificates from the NSW Planning Portal, across every council. Filter by council, type, cost and keyword.

- **URL**: https://apify.com/ausgovdata/nsw-planning-applications.md
- **Developed by:** [AusGovData](https://apify.com/ausgovdata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## NSW Development Applications and Building Leads

New development applications (DAs) and complying development certificates (CDCs) lodged
with NSW councils, from the NSW Planning Portal — the first public sign of building work
coming, so you can quote early.

### What you get

- One row per application, across every NSW council that uses the Planning Portal.
- The council, the application number and (for a DA) the council's own reference.
- The development types, in the portal's own words: dwelling house, demolition, retail
  premise, office premise, swimming pool, subdivision and so on.
- The estimated cost in Australian dollars, where the applicant gave one.
- The number of new dwellings and storeys, where the portal records them.
- The address and suburb (with home-related addresses partly withheld — see Privacy).
- The status and the lodgement date.

### Who uses it

- **Builders and trades** — quote for jobs in your area before the work is advertised.
- **Building suppliers and manufacturers** — see what is about to be built, and where.
- **Architects, planners and private certifiers** — a pipeline of new projects by council
  and development type.
- **Arborists, surveyors and other consultants** — find the jobs that need your part of the
  process.
- **Anyone watching their own area** — know what is proposed near you.

### How to use it

1. Set the inputs: how many days back, DA or CDC, councils, development types, keywords or
   a minimum cost.
2. Run it once, or save it as a task and schedule a daily or weekly run, so new applications
   arrive on their own.
3. Take the results from the dataset tab as CSV, Excel or JSON, or read them through the
   Apify API into Google Sheets, Airtable, Zapier, Make or your own tools.

### Input fields

| Field | Default | What it does |
|---|---|---|
| `daysBack` | 7 | Applications lodged today or in the previous days back - 1 days (1–90). |
| `applicationKinds` | DA and CDC | Which kinds to include: DA for development applications, CDC for complying development certificates. Leave empty for both. |
| `councils` | none | Council name contains one of these words, case-insensitive, e.g. "Blacktown". Leave empty for every NSW council. |
| `developmentTypes` | none | Development type contains one of these words, e.g. "dwelling", "demolition", "retail". Leave empty for every type. |
| `keywords` | none | Title, description or address contains one of these words, case-insensitive. Leave empty for every application. |
| `minCostAud` | 0 | Estimated cost at or above this many Australian dollars. Applications with no published cost are left out when this is set. 0 means no minimum. |
| `maxResults` | 1000 | Stop after this many applications (1–10000). Each one is charged as one result. |
| `failIfEmpty` | off | For monitoring: mark the run as failed when nothing is found. Leave off for normal use. |

### Output example

Two rows, for the real fixture records `PAN-666354` (a Burwood dwelling house) and
`PAN-662382` (a Burwood commercial development). A record's own missing fields are simply
missing; results download as CSV, Excel or JSON from the dataset tab.

```json
{
  "applicationNumber": "PAN-666354",
  "kind": "DA",
  "lodgementDate": "2026-09-21T00:00:00Z",
  "status": "Under Assessment",
  "council": "Burwood Council",
  "developmentTypes": "Dwelling house; Alterations or additions to an existing building or structure",
  "costAud": 79981,
  "address": "BURWOOD ROAD, BURWOOD 2134",
  "suburb": "BURWOOD",
  "postcode": "2134",
  "homeRelated": true,
  "councilReference": "DA.2026.68",
  "source": "nsw-planning",
  "licence": "Contains NSW Planning Portal data (NSW Government), licensed under Creative Commons Attribution"
}
```

```json
{
  "applicationNumber": "PAN-662382",
  "kind": "DA",
  "lodgementDate": "2026-09-21T00:00:00Z",
  "status": "Under Assessment",
  "council": "Burwood Council",
  "developmentTypes": "Demolition; Commercial development; Office Premise; Alterations or additions to an existing building or structure; Retail Premise; Take away food and drink",
  "costAud": 492140,
  "address": "12 THE STRAND CROYDON 2132",
  "suburb": "CROYDON",
  "postcode": "2132",
  "homeRelated": false,
  "councilReference": "DA.2026.69",
  "source": "nsw-planning",
  "licence": "Contains NSW Planning Portal data (NSW Government), licensed under Creative Commons Attribution"
}
```

The first row is home-related: the street number has been removed. The `homeRelated`
column is `true` whenever that happened.

### Pricing

You pay per result: one application is one result, charged when its row is written. Rows
you never receive are not charged for, and the run stops by itself if it reaches the
maximum cost per run set on the run. The price per result is set by the publisher in the
Apify Console.

### FAQ

**How fresh is the data?**
The run reads the NSW Planning Portal live. A council lists an application once it has
entered it, and councils differ in how quickly they do that, so a day that has just passed
may still be thin. Schedule a daily run and give it a few days to fill in.

**How much does a run cost?**
You pay only for the rows you receive: one application, one charge. Set a maximum cost per
run and the run stops by itself when it is reached; rows that are never returned are never
charged for.

**Can I track the DAs and CDCs I care about?**
Yes. Filter by council, development type, keyword and minimum cost, or by application kind
(DA, CDC or both) — for example, new dwelling houses in Blacktown over $500,000.

**Is this official data?**
Yes. It comes from the NSW Planning Portal's public Online DA and Online CDC data, published
by the NSW Government under Creative Commons Attribution, and every row carries the
attribution line.

**Why is the street number missing on some rows?**
An application for a home is a record about a private address, so for home-related records
the street number, the exact coordinates and the lot/plan are removed. The `homeRelated`
column is `true` when that has happened.

**Does it name the applicant?**
No. The applicant's name is not in this data and is never output, and a CDC's certifier
details are dropped as well.

### Data source and licence

The NSW Planning Portal "Online DA Data" API, NSW Government:

- `https://api.apps1.nsw.gov.au/eplanning/data/v0/OnlineDA` (development applications)
- `https://api.apps1.nsw.gov.au/eplanning/data/v0/OnlineCDC` (complying development certificates)

Published under Creative Commons Attribution. Every row carries the attribution line:

> Contains NSW Planning Portal data (NSW Government), licensed under Creative Commons Attribution

### Privacy

Privacy comes first. Every application is treated as being about somebody's home unless it
is plainly business or large-scale: a commercial, industrial, retail, office, warehouse,
shop, medical, hotel, club, school, childcare or similar development, or one proposing
more than two new dwellings. For home-related records the street number, the exact
coordinates and the lot/plan are removed before the row is written, inside the stored
record too. The address then shows only the street, suburb and postcode (for example
`EXAMPLE STREET, SUBURB 2000` instead of `12 EXAMPLE STREET SUBURB 2000`). Business and
larger developments keep the address the portal published.

The applicant's name is not in this data and is never output, and a CDC's certifier
details are dropped as well. Where the portal has not published street fields for a
home-related record, no address is output at all rather than reconstructed.

### Limitations

- The portal lists an application once the council has entered it, and councils differ in
  how quickly they do, so a day that has just passed may still be thin.
- The cost is the applicant's own estimate, and some applications publish no cost at all.
- The status is the one in the record when the run fetched it; earlier status changes are
  not tracked.
- The home-related rule hides an address whenever the work could be at a house, so
  "Demolition" with nothing else in the record is treated as home-related even if it is
  not a home.
- A home-related row names the street and the suburb, not the property.
- When the list is longer than `maxResults`, the run stops at the limit and the rest are
  neither returned nor charged for.

# Actor input Schema

## `daysBack` (type: `integer`):

Look for applications lodged today or in the previous days back - 1 days.

## `applicationKinds` (type: `array`):

DA looks at development applications, CDC at complying development certificates. Leave empty for both.

## `councils` (type: `array`):

Only applications from councils whose name contains one of these words (case-insensitive), e.g. "Blacktown". Leave empty for every NSW council.

## `developmentTypes` (type: `array`):

Only applications with a development type containing one of these words (case-insensitive), e.g. "dwelling", "demolition", "retail". Leave empty for every type.

## `keywords` (type: `array`):

Only applications whose title, description or address contains at least one of these words (case-insensitive). Leave empty for every application.

## `minCostAud` (type: `integer`):

Only applications with an estimated cost of at least this many Australian dollars. Applications with no published cost are left out when this is set. 0 means no minimum.

## `maxResults` (type: `integer`):

Stop after this many applications. Each one is charged as one result.

## `failIfEmpty` (type: `boolean`):

For monitoring: mark the run as failed when nothing is found. Leave off for normal use.

## Actor input object example

```json
{
  "daysBack": 7,
  "applicationKinds": [
    "DA",
    "CDC"
  ],
  "councils": [],
  "developmentTypes": [],
  "keywords": [],
  "minCostAud": 0,
  "maxResults": 1000,
  "failIfEmpty": false
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ausgovdata/nsw-planning-applications").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("ausgovdata/nsw-planning-applications").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 ausgovdata/nsw-planning-applications --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ausgovdata/nsw-planning-applications"
        }
    }
}
```

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/u0gVJ99f1EjaSUcBI/builds/4PvLD8OGcDdr3Gceq/openapi.json
