# Building Permits API — France, NSW Australia & Far North NZ (`gaelasao/planning-data-au-nz-fr`) Actor

Get building permits and planning applications for property research and local project tracking. Covers France (SDES), NSW Australia and Far North New Zealand. Filter by area and dates; export CSV or JSON with source attribution.

- **URL**: https://apify.com/gaelasao/planning-data-au-nz-fr.md
- **Developed by:** [Gaël GERARD](https://apify.com/gaelasao) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 planning records

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

Download **building permits and planning applications** from official sources in **France, NSW Australia and Far North New Zealand**. Choose an area and a date range, then export the records as JSON or CSV.

Follow local development activity, research a property market or add permit records to a dashboard. Each result keeps its original reference, dates and source, so you can check the record behind the numbers.

**Start with 10 records for about $0.05**, plus the $0.00005 start event at 512 MB. The default spending limit is $0.10. No monthly Actor rental and no separate source API key. Your Apify account and credits are required.

### Ready-to-run examples

Choose the data you need, open the example and try its preset. Each starts with **10 results**, a **$0.10 spending limit** and the **last 90 days** (France: the 90 days up to the end of the latest monthly SDES file). Adjust the area or dates in your own copy.

| Example | What is already configured |
| --- | --- |
| [France : permis de construire de logements](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/france-permis-construire-logements) | Autorisations SDES de logements, France entière |
| [France: non-residential building permits](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/france-commercial-building-permits) | SDES non-residential authorisations |
| [France : permis d’aménager (PA)](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/france-permis-amenager-pa) | Autorisations SDES d’aménagement |
| [France : permis de démolir (PD)](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/france-permis-demolir-pd) | Autorisations SDES de démolition |
| [Rhône (69) : permis de construire](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/rhone-69-permis-construire) | Logements, département 69 déjà configuré |
| [NSW: development applications](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/nsw-development-applications) | NSW Planning Portal, all councils |
| [City of Sydney: development applications](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/sydney-development-applications) | Exact City of Sydney council preselected |
| [Far North NZ: building applications](https://apify.com/gaelasao/planning-data-au-nz-fr/examples/far-north-nz-building-applications) | Far North District only; property points, no street addresses |

**Pour la France :** choisissez logements, locaux non résidentiels, aménagement ou démolition. Vous pouvez ensuite filtrer par département ou code INSEE de commune et télécharger les résultats en CSV. Chaque ligne décrit le projet (nature, destination, logements, surface créée). Quand le demandeur est une personne morale, sa dénomination, son SIREN, son SIRET et son code APE sont fournis. Les autorisations SDES sont publiées mensuellement : sans date, la période se termine à la fin de couverture du dernier fichier publié.

### What can you do with building permit data?

- **Follow projects in your area.** Review applications or issued authorisations for a council, French department or commune.
- **Research development activity.** Compare the records available for a territory and period before adding them to your own analysis.
- **Keep a repeatable workflow.** Use the same filters and output fields across supported sources, then export to a spreadsheet or call the Actor through the Apify API.

The official source data remains publicly available from its publishers. You pay for collection, filters and a consistent export, rather than exclusive access to those records. This is useful when you want to repeat a query or connect the data to an existing workflow without maintaining three separate source integrations.

### Which building permits and planning applications are covered?

| Country | Available records | Coverage and freshness |
| --- | --- | --- |
| Australia | NSW Planning Portal planning and complying-development applications, including modifications | NSW only. Source catalogue advertises daily updates. The tracker does not provide a per-record update timestamp. |
| New Zealand | Far North building applications published from Pathway | Far North District only. Publisher advertises daily refresh. Selected types/statuses; no street-address field. Property points are provided. |
| France | SDES housing, non-residential, development (PA) and demolition (PD) authorisations | Selected issued authorisations since 2013. Monthly publication; not a live feed of all pending applications. |

Coverage is specific to the sources above. Country names identify where the data comes from. The `COVERAGE` report gives the sources and publication snapshots used by your run; `SUMMARY` explains whether the run reached a limit or finished its query.

### How to get your first results

1. Open a ready-to-run example above, or use the **Input** form to choose a country.
2. Set the area: an INSEE commune or department code for France, or an exact council name for NSW. New Zealand uses the Far North dataset.
3. Choose your dates. Start with **10 results** and a **$0.10 maximum run cost**.
4. Run the Actor, then download JSON from the dataset or choose **CSV for spreadsheets** in the output menu. Read the summary before treating the export as a complete query.

Omitting dates uses the 90 days ending today (UTC) for NSW and Far North. France is published monthly, so its period ends at the coverage end of the latest SDES file: 31 August 2026 for the file published on 29 September 2026. For repeatable research, set dates explicitly. Apify schedules can run the same input again; stable record IDs help you remove duplicates in your own workflow.

### Examples

#### France: housing authorisations in Rhône

```json
{
  "country": "FR",
  "sourceIds": ["fr-sdes-housing"],
  "departmentCodes": ["69"],
  "maxResults": 10
}
```

#### Australia: NSW applications in City of Sydney

```json
{
  "country": "AU",
  "councils": ["Council of the City of Sydney"],
  "maxResults": 10
}
```

#### New Zealand: Far North building applications

```json
{
  "country": "NZ",
  "maxResults": 10
}
```

These examples use the default period: the last 90 days, or for France the 90 days up to the latest SDES coverage end. Add `dateFrom` and `dateTo` in `YYYY-MM-DD` format when you need a fixed research period. Leave `maxRequests` out: the Actor sizes source requests from `maxResults`.

### What does a result contain?

Results include the application or authorisation reference, published type and status, available dates and the responsible authority. NSW and Far North provide the publisher's project description. For France, the Actor composes a short French description from SDES codes (project nature, main destination, dwellings and floor area created). When the French applicant is a legal entity, records also carry its name, SIREN, SIRET, NAF (APE) code, legal category, postal code and locality. Address and location fields depend on the source. Each record also includes its source link, attribution, licence information and collection date.

The Output tab has a general view plus views for **France SDES** and **Far North NZ**. France shows the project description, status, commune, postal code, address, dates, applicant company and SIREN, with housing and floor-area measures; PA/PD rows describe the land area only. Far North shows application details and property coordinates. Its coordinates identify a property point, not a verified building entrance. Use the view that matches your source, then download the full JSON when you need every field.

Here is an extract from a real NSW result collected on 13 October 2026. The full output contains additional provenance and quality fields.

```json
{
  "country": "AU",
  "source_id": "au-nsw-tracker",
  "authority_name": "Council of the City of Sydney",
  "reference": "CDC-282727",
  "description": "Restaurant or cafe,Alterations or additions to an existing building or structure",
  "address": "305 BOTANY ROAD ZETLAND 2017",
  "submitted_date": "2026-10-09"
}
```

For spreadsheet use, the **CSV for spreadsheets** output escapes quotes and prefixes formula-like text with an apostrophe. This protects text starting with `=`, `+`, `-` or `@` from being treated as a formula. JSON preserves the original text. The CSV starts with a UTF-8 byte-order mark so that Excel shows accents. It includes the INSEE commune code (`authority_id`), postal code, commune, category, normalized status, dwellings, floor and land areas, the Far North property ID and the French applicant fields. Excel can drop leading zeros from codes such as 01034: import the file with Data → From Text/CSV and set those columns to Text, or use JSON. JSON contains the full record, including provenance and quality fields.

Missing values stay `null`. Descriptions remain in the original language. French state codes are kept in `raw_status`; `normalized_status` follows the SDES dictionary (approved, cancelled, works_started, works_completed). Each Far North result is an application/property pair: an application spanning several properties can produce several rows.

#### How do the filters work?

- One country per run; the same input/output contract serves each country.
- France: INSEE commune and department codes, plus the four source categories.
- NSW: exact council display names. AU/NZ also support keyword substrings in project/type fields.
- Date meaning matters: France defaults to issued authorisation dates; AU/NZ to submission dates. France also supports submission dates within its authorisation dataset; NZ also supports decision dates.
- `maxResults` caps output records. Leave `maxRequests` empty: the Actor sizes source requests from `maxResults` (France pages hold 100 rows; NSW and Far North pages 1,000). Responses are limited to 8 MiB each and 64 MiB in total per run.
- A run that stops at a limit (results, requests, maximum cost or timeout) still succeeds. Its status message names the limit and `SUMMARY.limit_reached` records it. Only a run that delivers no record because of a source error fails. No cap promises an exhaustive national dataset.

An issued permit establishes an authorisation, rather than the start of construction. Source coverage and publication delays matter when interpreting activity or comparing territories.

### How much does the Building Permits API cost?

The launch price is **$5 per 1,000 returned records** ($0.005 per row), plus Apify's standard **$0.00005 Actor start event** at the default 512 MB memory. Platform usage is included in this Actor's price.

| Returned records | Price at 512 MB | Suggested spending limit |
| --- | --- | --- |
| 10 | $0.05005 | $0.10 |
| 100 | $0.50005 | $0.51 |
| 1,000 | $5.00005 | $5.01 |

The spending limit caps charges; it does not guarantee a result count. When a run reaches it, the run keeps the rows it paid for, ends successfully and its status message names the limit, for example “Stopped by your maximum cost per run ($0.10) after 19 records.” A Far North row counts as one application/property pair. Every run is charged for the rows it returns, including records returned by an earlier run.

**Large exports take time.** France returns at most 100 rows per source request, about 4–5 seconds each: 1,000 French rows take about one minute, 2,000 about two minutes. NSW and Far North return 1,000 rows per request. Use a run timeout of at least 600 seconds for exports above 1,000 rows. If the timeout approaches, the Actor stops collecting early, keeps the delivered rows and still saves `SUMMARY` and the CSV.

There is no monthly rental fee for this Actor. Your Apify account's plan and available credits still apply. The current **Pricing** tab governs charges. Set a maximum run cost before starting; the Actor checks the remaining result budget before collecting or storing further rows.

### Frequently asked questions

#### Can I get permis de construire data for France?

Yes. The France sources are the SDES Sitadel files for housing, non-residential buildings, development (PA) and demolition (PD) authorisations. Filter with department or INSEE commune codes. These are selected issued authorisations, published monthly; use the source snapshot to check the reporting period.

#### Does it cover all of Australia and New Zealand?

Australian coverage is NSW. New Zealand coverage is Far North District. Additional territories will be listed here when a supported source is available.

#### Can I get applicant companies, contacts or Far North street addresses?

For France, companies yes. When the SDES file identifies the applicant as a legal entity found in Sirène, each record carries its name, SIREN, SIRET, NAF (APE) code, legal category, postal code and locality. Natural persons, sole traders (legal category 1000) and groupings of natural persons are never exported, including their postal code. A family property company (SCI) name can still identify a household: treat it as personal data under the GDPR. No email address or phone number is provided. Far North provides property points, with no street-address field in the source used by this Actor.

#### Can I connect it to my own application?

Yes. Use `gaelasao/planning-data-au-nz-fr` through the [Apify API](https://docs.apify.com/api/v2). Each run gives you a dataset of records and links to its `SUMMARY` and `COVERAGE` reports. Run one country at a time; the output field names remain consistent across sources.

#### How do I call it from a script?

Set your Apify token in the `APIFY_TOKEN` environment variable, then send your filters as JSON. This example returns up to three France records in one HTTP response:

```sh
curl --fail-with-body --request POST \
  'https://api.apify.com/v2/acts/gaelasao~planning-data-au-nz-fr/run-sync-get-dataset-items?memory=512&timeout=180&maxTotalChargeUsd=0.1&format=json' \
  --header "Authorization: Bearer $APIFY_TOKEN" \
  --header 'Content-Type: application/json' \
  --data '{"country":"FR","sourceIds":["fr-sdes-housing"],"departmentCodes":["69"],"maxResults":3}'
```

Use `AU` with an exact NSW council name or `NZ` for Far North, as shown in the examples above. Leave unused filters out of your request. Optional lists, dates and numeric limits also accept `null`. For `country` and `dateField`, use a listed value or omit the field to use its default. Do not put your token in a shared URL or source file.

If you adapt Apify's generated Python example, remove unset `None` values before calling the Actor:

```python
run_input = {key: value for key, value in run_input.items() if value is not None}
```

The initial run budget is $0.10, which allows up to 19 records plus the start event at this price. For up to 100 records, set `maxResults` to 100 and a run budget of $0.51; for 1,000, use $5.01 and `timeout=600`. The result limit and spending limit are separate, and a source can return fewer records. If the budget runs out first, the run still succeeds with the rows it paid for and its status message says so. See the [synchronous API endpoint](https://docs.apify.com/api/v2/actor-run-sync-get-dataset-items-post) for longer-running requests.

#### Can I use it through an MCP connector?

Yes. Apify hosts this Actor and exposes it through its [MCP server](https://docs.apify.com/mcp). In a compatible MCP client, connect to:

```text
https://mcp.apify.com?tools=actors,docs,gaelasao/planning-data-au-nz-fr
```

Authenticate with your own Apify account using the client’s supported login flow. No additional server or source login is needed. Ask the client to run this Actor for one country with `maxResults: 10` and set the run spending limit to $0.10. Spending limits are run options, not input fields. The client must fetch the dataset after the run; starting an Actor alone returns run and storage identifiers. Read the returned `SUMMARY` as well as the rows.

#### Can I repeat the query or send the results to another tool?

Save your input as an Apify task, then use Apify’s schedules or integrations to repeat it and retrieve the output. Daily runs can be useful for NSW and Far North; France is published monthly. Choose a frequency that matches the source. Keep `record_id` in your destination to recognise previously collected rows. Repeated rows are still charged on each run. This version does not return a change-only feed or send alerts by itself.

#### Why did my run return fewer results than expected?

Check the area, the meaning of your date filter and the source publication period. Then read the run's status message and `SUMMARY`: they name the limit that stopped the run (result cap, request cap, maximum cost or timeout) and list source errors. For France, a period without `dateTo` ends at the latest SDES coverage end; recent months are not published yet. A query finishing successfully does not independently verify the publisher's completeness.

#### Are source text and statuses cleaned up?

French addresses and communes often reach SDES with broken accents (repeated UTF-8 encoding, shown for example as CHAÃÂZERY instead of CHÉZERY): about a quarter of French rows in our checks. The Actor repairs them, keeps the publisher's original text in `source_text_raw` and adds the warning `text_encoding_repaired`. Rare ambiguous cases stay unchanged and carry `text_encoding_suspect`. Other source text and status codes are retained, and missing values stay empty. This version retrieves source records as they are available at run time; it has no shared historical change log.

### Attribution and data rights

This Actor selects fields, normalises schemas and filters records. Source text remains unchanged where available. It is not affiliated with or endorsed by the publishers.

- France: SDES, base Sitadel, [Licence Ouverte as declared by the official dataset](https://www.data.gouv.fr/datasets/liste-des-permis-de-construire-et-autres-autorisations-durbanisme). Publication dates and source links are retained.
- New Zealand: Far North District Council, [published building layer](https://www.arcgis.com/home/item.html?id=c8bacf7e5cd84893b51f52c09132c47a), [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
- NSW: © State of New South Wales and Department of Planning, Housing and Infrastructure. The [Portal copyright notice](https://www.planningportal.nsw.gov.au/copyright-and-disclaimer) identifies CC BY 4.0 for department material, subject to its stated exclusions. The Actor retrieves tracker metadata, not application documents, third-party plans, images or logos. [Original application tracker](https://www.planningportal.nsw.gov.au/map).

Publisher data is provided without a guarantee of accuracy, completeness or continued availability. Preserve source attribution, applicable licence terms and the notices accompanying any downstream reuse.

### Support

For an input or source problem, open an issue on this Actor’s **Issues** tab with the run ID, source ID and the filters you used. Those details help us reproduce the problem and check the source response. Do not include API tokens or private data.

If the export helped with your work, an honest review on Apify helps other users decide whether it fits their needs. Tell us what you used it for and what could be better.

# Actor input Schema

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

Select the source country. Initial coverage is NSW for Australia, Far North for New Zealand and the selected SDES datasets for France.

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

Start with 10 records (about $0.05 plus the start event at 512 MB). For a larger export, raise this and your maximum cost per run: about $0.005 per record. This cap is shared across selected sources.

## `dateFrom` (type: `string`):

Optional YYYY-MM-DD start date, inclusive. Leave blank for the 90 days before the end date. France uses the authorisation date by default; NSW and Far North use the application date.

## `dateTo` (type: `string`):

Optional YYYY-MM-DD end date, inclusive. Leave blank for today in UTC (NSW, Far North) or, for France, the coverage end of the latest monthly SDES file. France rows dated after that file's publication are not queried.

## `departmentCodes` (type: `array`):

For example 69, 2A or 971. Max 20. AND with communeCodes if both are supplied.

## `communeCodes` (type: `array`):

Exact codes, for example 69123 (Lyon). Max 20. Only for France.

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

For example Council of the City of Sydney or The Hills Shire Council. Max 5, OR between councils. Names are validated against the source's lookup.

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

Case-insensitive substrings in project/type fields; OR between keywords. Applied locally within date/area filters. Rare keywords can reach the request cap. Unsupported for France.

## `sourceIds` (type: `array`):

Leave blank to use the country's default. France: fr-sdes-housing, fr-sdes-nonresidential, fr-sdes-development, fr-sdes-demolition. Australia: au-nsw-tracker. NZ: nz-fndc-building. Max 4, processed in order.

## `dateField` (type: `string`):

Choose the event date used by the period filter. A submission, a decision and an issued authorisation are different events. Unsupported source/date combinations are rejected.

## `maxRequests` (type: `integer`):

Leave empty: the Actor sizes requests from maxResults, including metadata and retries. A value here is a hard cap; reaching it ends the run successfully with a status message. Not a monetary spending cap.

## Actor input object example

```json
{
  "country": "FR",
  "maxResults": 10,
  "dateField": "source_default"
}
```

# Actor output Schema

## `records` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `coverage` (type: `string`):

No description

## `safe_csv` (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 = {
    "country": "FR",
    "maxResults": 10,
    "dateField": "source_default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("gaelasao/planning-data-au-nz-fr").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 = {
    "country": "FR",
    "maxResults": 10,
    "dateField": "source_default",
}

# Run the Actor and wait for it to finish
run = client.actor("gaelasao/planning-data-au-nz-fr").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 '{
  "country": "FR",
  "maxResults": 10,
  "dateField": "source_default"
}' |
apify call gaelasao/planning-data-au-nz-fr --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gaelasao/planning-data-au-nz-fr"
        }
    }
}
```

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/eDl4a1F6MH7fMyGjm/builds/eBg8AdYPvOvmGlwP1/openapi.json
