# NSW Building Leads (`pradip2412/nsw-da-leads`) Actor

Get fresh NSW building and development application leads — filter by trade (pools, solar, new builds, renovations), council, suburb, and status. Monitor mode for daily lead alerts.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 Building Leads

Get fresh building and development application (DA) leads from all 131 NSW councils — filtered by trade, location, status, and date.

### Who is this for?

- **Pool builders** — find every new pool DA in your area
- **Solar & battery installers** — catch new solar/battery projects as they're lodged
- **Builders & developers** — track new dwellings, knockdown rebuilds, and dual occupancies
- **Kitchen & bathroom renovators** — find alterations and additions DAs in target suburbs
- **Landscapers & fencing contractors** — discover new builds that will need outdoor work
- **Building suppliers** — monitor construction activity by council area
- **Architects & designers** — find upcoming projects to pitch services
- **Property investors** — spot development activity in target postcodes

### Example output

```json
{
  "applicationNumber": "PAN-650353",
  "council": "Blacktown City Council",
  "status": "Under Assessment",
  "applicationType": "Development Application",
  "developmentDescription": "Dwelling house,Swimming pool,Fences",
  "tradeTags": ["new_dwelling", "pool"],
  "lodgementDate": "2026-10-20",
  "determinationDate": null,
  "address": "12 SMITH STREET ROOTY HILL 2766",
  "suburb": "ROOTY HILL",
  "postcode": "2766",
  "lat": -33.77,
  "lng": 150.84,
  "googleMapsUrl": "https://www.google.com/maps?q=-33.77,150.84",
  "sourceUrl": "https://www.planningportal.nsw.gov.au/map",
  "changeType": "new",
  "attribution": "© State Government of NSW and NSW Department of Planning, Housing and Infrastructure",
  "scrapedAt": "2026-10-28T03:00:00.000Z"
}
```

### How to use

1. **Click "Start"** with the default settings to get recent DAs from all councils.
2. **Filter by trade** — select one or more trade presets (e.g. "Swimming pools", "Solar & battery") to only get relevant leads.
3. **Narrow by location** — enter specific councils, suburbs, postcodes, or use radius search around a point.

### Input explained

| Field | Description | Default |
|---|---|---|
| **Councils** | Filter by specific NSW council names (exact match). | All councils |
| **Suburbs** | Filter by suburb name (case-insensitive). | All suburbs |
| **Postcodes** | Filter by 4-digit Australian postcode. | All postcodes |
| **Radius search** | Only return DAs within `km` of a `lat`/`lng` point. | Disabled |
| **Lodged from / to** | Date range for DA lodgement. | Last 7 days |
| **Application statuses** | Filter by status (On Exhibition, Under Assessment, Determined, etc.). | All statuses |
| **Trade presets** | Filter by trade category — pool, solar, new dwelling, demolition, etc. | All trades |
| **Keywords include** | Only return DAs whose description contains these words. | None |
| **Keywords exclude** | Exclude DAs whose description contains these words. | None |
| **Only new records** | Monitor mode — only output records not seen in previous runs. | Off |
| **Monitor key** | Key-value store name for tracking seen records across runs. | `nsw-da-leads-monitor` |
| **Track status changes** | Also output records whose status changed since last run. | Off |
| **Max results** | Maximum number of records to output. | 500 |

#### Trade presets

| Preset | What it matches |
|---|---|
| Swimming pools | Pool, spa, pool fencing |
| Solar & battery | Solar panels, photovoltaic, battery storage |
| New dwellings | New houses, dwelling construction |
| Knockdown rebuild | Demolition + new dwelling |
| Granny flat / secondary dwelling | Secondary dwellings, granny flats |
| Dual occupancy / duplex | Dual occupancy, duplex developments |
| Demolition | Demolition of existing structures |
| Alterations & additions | Renovations, extensions, alterations |
| Subdivision | Land subdivision, strata, Torrens title |
| Commercial fitout | Shop/office fitout, change of use |

### Pricing

**Pay per result:** $0.01 USD per DA record output.

- 100 leads = $1.00
- 500 leads = $5.00
- 1,000 leads = $10.00

No start fee. You only pay for records actually output.

### Scheduling & monitor mode

Set up a daily or weekly schedule and enable **monitor mode** to only receive new DAs:

1. Set **Only new records** to `true`.
2. Set a **Monitor key** (e.g. `my-pool-leads`). Use the same key every run.
3. Schedule the Actor to run daily or weekly.

Each run only outputs DAs that weren't in previous runs. Enable **Track status changes** to also get notified when a DA's status changes (e.g. from "Under Assessment" to "Approved").

### Integrations

#### API

Access results programmatically via the [Apify API](https://docs.apify.com/api/v2):

```bash
curl "https://api.apify.com/v2/datasets/{DATASET_ID}/items?token={YOUR_TOKEN}"
```

#### Webhooks & automation

- **n8n** — use the Apify node to trigger workflows on new leads
- **Make (Integromat)** — connect via the Apify module
- **Zapier** — use the Apify integration
- **Google Sheets** — export directly from the dataset

#### AI agents & MCP

This Actor works with the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) for AI agent integration. Ask Claude, ChatGPT, or other agents to fetch NSW DA data.

### FAQ

**How often is the data updated?**
The NSW Planning Portal updates its DA data daily. Run this Actor daily for the freshest leads.

**Which councils are covered?**
All 131 NSW councils that use the Planning Portal. Since 1 July 2021, all NSW councils are mandated to use the Portal for DAs.

**Does this include CDCs (Complying Development Certificates)?**
Yes — the API includes both DAs and CDCs. Filter by **Application type** if you only want DAs.

**Can I filter by estimated cost of development?**
Not currently — the NSW Planning Portal API does not include cost data in its open data feed.

**How far back does the data go?**
The Portal has data from January 2019 onwards.

**Does this include applicant contact details?**
No. We deliberately exclude personal information to comply with Australian privacy laws. This Actor provides project details and location data for lead generation, not personal data.

### Data source & attribution

Data sourced from the **NSW Planning Portal Online DA Data API**.

© State Government of NSW and NSW Department of Planning, Housing and Infrastructure.

Licensed under [Creative Commons Attribution 4.0](https://creativecommons.org/licenses/by/4.0/).

### Disclaimer

This Actor is not affiliated with or endorsed by the NSW Government, the NSW Department of Planning, Housing and Infrastructure, or the NSW Planning Portal. Data accuracy depends on the source API. Use at your own risk.

# Actor input Schema

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

Filter by specific NSW councils. Must be exact names (e.g. "Blacktown City Council", "Inner West Council"). Leave empty for all councils.

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

Filter by suburb names (case-insensitive). E.g. \["MINTO", "ZETLAND"].

## `postcodes` (type: `array`):

Filter by Australian postcodes. E.g. \["2566", "2017"].

## `radius` (type: `object`):

Only return DAs within a radius of a point. Set lat, lng (decimal degrees) and km.

## `lodgedFrom` (type: `string`):

Start date for DA lodgement (YYYY-MM-DD). Default: 7 days ago.

## `lodgedTo` (type: `string`):

End date for DA lodgement (YYYY-MM-DD). Default: today.

## `statuses` (type: `array`):

Filter by application status. Leave empty for all statuses.

## `tradePresets` (type: `array`):

Only return DAs matching these trade categories. Leave empty for all trades. Options: pool, solar_battery, new_dwelling, knockdown_rebuild, granny_flat_secondary_dwelling, dual_occupancy, demolition, alterations_additions, subdivision, commercial_fitout.

## `keywordsInclude` (type: `array`):

Only return DAs whose description contains at least one of these keywords.

## `keywordsExclude` (type: `array`):

Exclude DAs whose description contains any of these keywords.

## `onlyNew` (type: `boolean`):

Only output records not seen in previous runs. Requires a monitor key. Great for scheduled runs.

## `monitorKey` (type: `string`):

Name for the key-value store that tracks seen records. Use the same key across scheduled runs.

## `trackStatusChanges` (type: `boolean`):

Also output records whose status changed since the last run (with previousStatus field).

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

Maximum number of DA records to output.

## Actor input object example

```json
{
  "onlyNew": false,
  "trackStatusChanges": false,
  "maxItems": 500
}
```

# Actor output Schema

## `results` (type: `string`):

Development application leads with trade tags, location, and status.

# 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("pradip2412/nsw-da-leads").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("pradip2412/nsw-da-leads").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 pradip2412/nsw-da-leads --silent --output-dataset

```

## MCP server setup

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

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/XGFCnHYezxbTXG4Qq/builds/bHc9vnZFOqfLpVUTU/openapi.json
