# France Building Permits API: Construction Leads (`japan-open-data/france-building-permits`) Actor

Get new French building permits filed by companies — SIREN, project size and site, from official Sitadel data. Construction leads by department, updated monthly: developer, social landlord or retailer, dwellings, floor area by use, dates. No API key; JSON via API or MCP, $5 per 1,000 rows.

- **URL**: https://apify.com/japan-open-data/france-building-permits.md
- **Developed by:** [Japan Open Data](https://apify.com/japan-open-data) (community)
- **Stats:** 2 total users, 1 monthly users, 60.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 permit rows

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

## France Building Permits API: Construction Leads

**Get new French building permits filed by companies — SIREN, project size and site, from official Sitadel data.** Pick a department (for example `69` Rhône or `Gironde`) and get one clean English JSON row per permit: the company that filed it (name, SIREN, SIRET, legal form, activity and a plain-English applicant type such as *property developer* or *social landlord*), the site (street, town, commune), dwellings and floor area by use (housing, offices, retail, industry, warehouses, hotels, farms, public facilities), and the authorisation, works-start and completion dates.

- **Official source, queried live:** the French Ministry for the Ecological Transition's statistics service (SDES) publishes *Sitadel*, the national register of authorised building permits (permis de construire) and prior declarations, every month under the Licence Ouverte. This Actor reads it through SDES's own DiDo API on every run — about 2.7 million permits since 2013.
- **Monthly lead list:** `isNewThisMonth: true` marks permits that first appeared in the newest monthly release. Run it once a month per department and you get the new projects of developers, social landlords, retailers, logistics firms and public bodies.
- **Companies and public bodies only.** Permits filed by private persons and sole traders are left out, company names that read as a person's name are withheld by a name check, and small family property companies have their street number and parcels removed (see [Privacy](#privacy-companies-and-public-bodies-only)).
- **One required input:** the department — code, French name or English name. Everything else has a default (latest month, 20 rows, largest projects first).
- **$5 per 1,000 permit rows, no subscription** — about $0.65 for a month of company permits in the Rhône (see [pricing](#how-much-does-it-cost)).
- Built for pipelines and AI agents: flat camelCase fields, a `status` on every row, plain-English error rows that are free.

### What can you do with France Building Permits API?

- **Building-materials makers and distributors, HVAC, lifts, solar, windows** — list the companies that just got a permit for a large project in your region and contact them before the tender.
- **Subcontractors and construction firms** — follow which developers and social landlords are building, where, and how big (`minDwellings`, `minFloorAreaM2`).
- **Commercial real estate and logistics** — new warehouses, offices, retail and hotels by department (`permitCategory: "non-residential"`), with floor area per use.
- **Market research** — monthly pipeline of new housing by developer, with SIREN to join company data.
- **AI agents** — answer "which companies got building permits in Gironde last month?" with one tool call and an official source.

### How it compares

| | PermisAPI | RegistreDesPermis | **This Actor** |
|---|---|---|---|
| Data | Sitadel (SDES) | Sitadel (SDES) | **Sitadel (SDES), queried live from the official DiDo API** |
| Language | French | French | **English labels and field names** (French names and addresses kept as published) |
| Pricing | Free 500 requests/month (1 department); €49/month (5,000 requests, 5 departments); €99/month (10,000); €199/month for all of France; €0.02 per extra request on the entry plans | €20/month excl. VAT (3 users, 3 departments; +€5 per extra department) | **$5 per 1,000 permit rows + $0.002 per run, no subscription, every department** |
| Access | API, MCP server | Web app | **API, JSON, schedules, webhooks, Google Sheets, MCP** |
| Rows returned | All permits | All permits | **Company and public-body applicants only** |

Prices as published on permisapi.fr and registredespermis.fr in September 2026.

### How to use

1. Click **Try for free**. The default input lists the 20 largest permits filed by companies in the **Rhône** department in the latest published month, in about 15-20 seconds.
2. Put your **Department** (a code such as `33`, `2A`, `974`, or a name such as `Gironde`, `Paris`, `French Guiana`).
3. Optionally narrow it down: a **Commune**, several **months**, a **permit category**, **applicant types**, a minimum number of dwellings or floor area.
4. Raise **Maximum rows** to get every permit (Rhône: about 130 company permits a month; Paris: about 60).

#### Run it every month

SDES publishes each month at the end of the following month (July 2026 data on 28 August 2026; the next update is announced for 29 September 2026). Schedule this Actor monthly (for example on the 1st) with `{"department": "33", "maxResults": 1000}` and keep the rows with `isNewThisMonth: true`, or connect a webhook, Google Sheets or your CRM.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `department` | text (required) | `"69"` | One department: code (`"69"`, `"2A"`, `"974"`), French name (`"Rhône"`) or English name (`"French Guiana"`). |
| `month` | text | `"latest"` | `latest` (read from the dataset metadata on every run), or a month such as `"2026-07"` (2013-01 or later). This is the month the permit was recorded in Sitadel. |
| `months` | integer | `1` | Number of months ending with `month` (1-12). |
| `commune` | text | empty | Commune name (`"Villeurbanne"`) or 5-digit INSEE code / postcode (`"69266"`). `75056`, `69123` and `13055` include all arrondissements of Paris, Lyon and Marseille. |
| `permitCategory` | `all` / `housing` / `non-residential` | `all` | Housing permits, non-residential permits, or both. |
| `applicantTypes` | list of text | all | e.g. `["property developer", "social landlord"]` (full list in the input form). |
| `minDwellings` | integer | `0` | Minimum dwellings created. |
| `minFloorAreaM2` | integer | `0` | Minimum floor area created (housing + non-residential), in m². |
| `maxResults` | integer | `20` | Maximum permit rows (charged). Largest projects first (floor area, then dwellings). |

#### Input examples

```json
{ "department": "Gironde", "months": 3, "applicantTypes": ["property developer"], "minDwellings": 20, "maxResults": 100 }
```

```json
{ "department": "75", "permitCategory": "non-residential", "minFloorAreaM2": 1000 }
```

```json
{ "department": "69", "commune": "Villeurbanne", "month": "2026-05", "months": 2 }
```

### Output

Example row (real data, Rhône, July 2026; attribution shortened, empty per-use fields omitted):

```json
{
  "status": "ok",
  "permitNumber": "0693852500333",
  "permitType": "building permit",
  "permitCategory": "housing",
  "projectStatus": "authorised",
  "isNewThisMonth": true,
  "recordedMonth": "2026-07",
  "authorisationDate": "2026-07-06",
  "filingDate": "2025-01-01",
  "worksStartDate": null,
  "completionDate": null,
  "applicantName": "VINCI IMMOBILIER RHONE ALPES AUVERGNE",
  "applicantSiren": "830853628",
  "applicantSiret": "83085362800022",
  "applicantType": "property developer",
  "applicantLegalForm": "General partnership (SNC)",
  "applicantLegalFormCode": "5202",
  "applicantActivity": "Property development - housing",
  "applicantActivityCode": "41.10A",
  "applicantPostcode": "69003",
  "applicantTown": "LYON 03",
  "siteStreetNumber": "71",
  "siteStreet": "RUE BENOIST MARY",
  "siteLocality": null,
  "sitePostcode": "69005",
  "siteTown": "LYON 5ÈME",
  "cadastralParcels": "AW 208; AW 192; AW 12",
  "siteDetailsRedacted": false,
  "communeCode": "69123",
  "departmentCode": "69",
  "departmentName": "Rhône",
  "region": "Auvergne-Rhône-Alpes",
  "projectNature": "conversion with extension",
  "mainUse": "housing",
  "housingType": "apartment building",
  "dwellingsCreated": 151,
  "individualDwellings": 1,
  "collectiveDwellings": 150,
  "socialRentalDwellings": 53,
  "housingFloorAreaM2": 10114,
  "nonResidentialFloorAreaM2": 0,
  "landAreaM2": 35919,
  "maxStoreys": 8,
  "architectInvolved": false,
  "lastUpdatedMonth": "2026-07",
  "latestMonthAvailable": "2026-07",
  "dataVersion": "2026-08",
  "sourceLastUpdated": "2026-08-28",
  "sourceUrl": "https://www.statistiques.developpement-durable.gouv.fr/donnees-des-permis-de-construire-et-autres-autorisations-durbanisme",
  "fetchedAt": "2026-09-25T08:08:28Z",
  "attribution": "Source: SDES, Sitadel (last updated 2026-08-28) - ... Licence Ouverte / Etalab. ... not affiliated with or endorsed by SDES ..."
}
```

Free rows: a `not_found` row when no permit matches (with the reason and what to change), and an `error` row for invalid input, e.g. `{"status": "error", "error": "\"Brittany\" is a region or country, not a department; give one department such as \"69\" (Rhône), \"33\" (Gironde) or \"75\" (Paris), and run once per department."}`.

#### Output fields

| Field | Meaning |
|---|---|
| `status` | `ok` (charged), `not_found` or `error` (free) |
| `permitNumber`, `permitType` | Sitadel permit number; `building permit` (PC), `prior declaration` (DP) or `development permit` (PA) |
| `permitCategory` | `housing`, `non-residential`, or `mixed` (in both Sitadel lists) |
| `projectStatus` | `authorised`, `works started`, `works completed` or `cancelled` |
| `isNewThisMonth`, `recordedMonth` | `true` when the permit was recorded in the newest monthly release (`latestMonthAvailable`) |
| `authorisationDate`, `filingDate`, `worksStartDate`, `completionDate` | Dates (`YYYY-MM-DD`); `filingDate` is empty for many older permits |
| `applicantName`, `applicantSiren`, `applicantSiret` | The company or public body, as matched by SDES in the Sirène register |
| `applicantType` | Plain-English label from the legal form and activity: property developer, social landlord, public body, semi-public company, construction company, property company or investor, farm or agricultural business, energy or utility, retailer, wholesaler, hotel or restaurant, health or social care, education, transport or logistics, manufacturer, non-profit, owners' association, other company |
| `applicantLegalForm(Code)`, `applicantActivity(Code)` | INSEE legal form (catégorie juridique) and NAF/APE activity, in English |
| `applicantPostcode`, `applicantTown` | The applicant's own address town (removed for small civil companies) |
| `siteStreetNumber`, `siteStreet`, `siteLocality`, `sitePostcode`, `siteTown`, `cadastralParcels` | Site of the works; number, locality and parcels are `null` when `siteDetailsRedacted` is `true` |
| `communeCode`, `departmentCode`, `departmentName`, `region` | INSEE commune code and area names |
| `projectNature`, `mainUse`, `housingType`, `residenceType`, `intendedUse`, `publicFacilityType` | Project labels in English |
| `dwellingsCreated`, `individualDwellings`, `collectiveDwellings`, `socialRentalDwellings`, `dwellingsDemolished` | Dwelling counts (housing list) |
| `housingFloorAreaM2`, `nonResidentialFloorAreaM2`, `officeFloorAreaM2`, `retailFloorAreaM2`, `industryFloorAreaM2`, `warehouseFloorAreaM2`, `hotelFloorAreaM2`, `agricultureFloorAreaM2`, `publicFacilityFloorAreaM2`, `hotelRooms` | Floor area created, new build plus conversions, in m² (per-use areas from the non-residential list) |
| `landAreaM2`, `maxStoreys`, `architectInvolved` | As declared (often incomplete in the source) |
| `lastUpdatedMonth`, `latestMonthAvailable`, `dataVersion`, `sourceLastUpdated`, `sourceUrl`, `fetchedAt`, `attribution` | Provenance |
| `error` | Plain-English reason on free rows |

Each run also saves a `RUN_SUMMARY` record in its key-value store: rows fetched from each list, permits filed by companies, how many were withheld by the name check, how many matched your filters and how many rows were returned.

### How much does it cost?

Pay per event, with two charges and no subscription:

| Event | Price | When it is charged |
|---|---|---|
| Permit row (`result-row`) | **$0.005** per row (**$5.00 per 1,000**) | Each row with `status: "ok"` |
| Run start (`apify-actor-start`) | **$0.002** per run | Once per run, including runs that return only a `not_found` or `error` row |

`not_found` and `error` rows themselves are free, but the $0.002 run start is charged on every run, so a run with a typo in the input costs $0.002.

| Use | Rows | Cost |
|---|---|---|
| Default run (20 largest company permits in the Rhône, latest month) | 20 | $0.102 |
| Every company permit in one department for one month, run monthly (Rhône about 130, Paris about 60) | 60-130 | about $0.30-$0.65 a month |
| Every company permit in one large department for 12 months (Nord: about 1,700) | about 1,700 | about $8.50 |
| Every department, every month (about 4,500 company permits a month nationally on average; one run per department) | about 4,500 | about $23 a month |
| Input error or no matching permit | 0 (one free row) | $0.002 |

On the Store this is shown as **$5.00 / 1,000 permit rows**.

For comparison, per department and month (French Sitadel services, September 2026):

| Coverage, every month | PermisAPI | RegistreDesPermis | This Actor |
|---|---|---|---|
| 1 department | Free plan (500 requests) | €20 (3 departments included) | about $0.30-$0.65 |
| 5 departments | €49 | €30 | about $2-$3 |
| All of France (101 departments) | €199 (Pro) | about €510 (€5 per extra department) | about $23 |

If you only need one department in French, PermisAPI's free plan may be enough. This Actor is for English field names and labels, a plain-English applicant type, company and public-body applicants only, and several departments or all of France with no subscription. Set **Maximum cost per run** in the run options to cap any run; the Actor stops when the cap is reached.

### Use via API & MCP (AI agents)

REST API (synchronous, returns the rows):

```bash
curl -X POST "https://api.apify.com/v2/acts/japan-open-data~france-building-permits/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"department": "33", "minDwellings": 10, "maxResults": 20}'
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("japan-open-data/france-building-permits").call(
    run_input={"department": "Rhône", "permitCategory": "non-residential", "maxResults": 100})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row["status"] == "ok":
        print(row["applicantName"], row["applicantSiren"], row["siteTown"], row["mainUse"], row["nonResidentialFloorAreaM2"])
```

MCP: add the Apify MCP server (`https://mcp.apify.com`) to Claude, Cursor or any MCP client and enable the tool `japan-open-data/france-building-permits`.

Recommended settings for agents:

- To answer "which companies got building permits in <department>?", pass `department` only (code or name) and `maxResults: 20`; rows come largest project first.
- For a region, run once per department (a region such as "Brittany" returns a free error row naming the fix).
- `isNewThisMonth: true` means "first published in the newest monthly release", not "filed this month"; `authorisationDate` is the real decision date.
- A permit is an authorisation, not a start of works: check `projectStatus` and `worksStartDate`.
- Quote the source as in `attribution` ("SDES, Sitadel", with `sourceLastUpdated`) and say that only company and public-body applicants are included.

Summary for AI assistants: *This tool lists French building permits and prior declarations filed by companies and public bodies in one department and month, from the official SDES Sitadel register (live DiDo API), one flat English JSON row per permit with SIREN, applicant type, site, dwellings, floor area by use, dates and a flag for permits new in the latest monthly release. Permits filed by private persons are excluded. Price: $5 per 1,000 permit rows plus $0.002 per run.*

### Privacy: companies and public bodies only

Sitadel names the applicant only when SDES has matched it to a legal person in the Sirène register; permits filed by private persons carry no name, but their site address would still point to a home, so **those permits are never returned**. On top of that, this Actor:

- returns only applicants with an INSEE legal form of 3000 or above — **sole traders (1000) and unincorporated groupings such as joint ownerships between private persons (2xxx) are excluded**;
- withholds names that read as a private person's name even when a company holds them (titles such as MME, "MR ET MME", INDIVISION, CONSORTS, HÉRITIERS; a forename followed by a surname, including surnames with a particle such as LE, DE or VAN; a surname followed by a forename; initials followed by a surname; such as one-person farms and companies named after their owner). Forenames come from the INSEE first-names file (about 6,400 forenames). Across every permit in both Sitadel lists (2,709,848 permits, August 2026 version), 730,263 have a legal-person applicant; this check withholds 20,303 of them (2.8%), including some genuine companies named after their founder, on the safe side. Public-law bodies (legal form 7xxx) keep honorific names such as a hospital or school named after a person;
- for **small family property companies** — civil companies (legal form 65xx: SCI, SCEA, GAEC, EARL...) with at most 2 dwellings, or with no dwelling and less than 200 m² of other floor space — removes the street number, the locality name (lieu-dit), the cadastral parcels and the applicant's own postcode and town (`siteDetailsRedacted: true`); the street name and town stay.

The check works from names, so a company name that contains a person's name in an unusual form can still pass; report one on the Issues tab and it will be fixed.

### FAQ

#### Can I get every department of France?

Yes, one department per run: schedule one run per department (or loop over the codes through the API). Each run costs $0.002 plus $0.005 per permit row.

#### Can I use it to find construction leads in France?

Yes. Filter by `permitCategory`, `applicantTypes`, `minDwellings` or `minFloorAreaM2` and schedule a monthly run: each row names the company behind a new project (with SIREN to look up its details), the site and the size, before works start. Keep the rows with `isNewThisMonth: true` to get only the new permits.

#### How fresh is the data?

SDES updates Sitadel once a month, at the end of the following month. `latest` always uses the newest month (read from the dataset metadata on every run, shown in `latestMonthAvailable` and `dataVersion`); every run queries SDES live, so there is nothing to rebuild.

#### Why do recent numbers change?

Sitadel is revised as late permits are recorded and permits are corrected or cancelled. Since March 2026 SDES has moved to its new *Sitadel3* collection system, and some recent figures have been revised downwards. A permit is recorded in the month it reaches Sitadel (`recordedMonth`), which can be later than its `authorisationDate`.

#### Does a permit mean the building will be built?

No. It is an authorisation; many projects start late, change or are abandoned. `projectStatus`, `worksStartDate` and `completionDate` show what is known.

#### Why is a permit I know missing?

It may have been filed by a private person or a sole trader, the applicant name may have been withheld by the name check, SDES may not have matched the applicant in Sirène, or it may not be recorded in Sitadel yet. Try more `months`.

#### Is this an official SDES service?

No. It re-publishes SDES open data under the Licence Ouverte, translated and reformatted. It is not affiliated with, or endorsed by, SDES or the French Ministry for the Ecological Transition.

### Troubleshooting

| Symptom | Fix |
|---|---|
| `error`: region or country, not a department | Give one department code or name; run once per department |
| `error`: month not covered yet | Use `latest`; SDES publishes each month at the end of the following month |
| `not_found` with a commune | Check the spelling, or use the 5-digit INSEE code |
| Few rows | Raise `months` (up to 12), or remove `applicantTypes` / minimums |
| An SDES DiDo error row | The SDES API was busy or down; run again in a few minutes (the row is free) |

### Known limitations

- One department per run; monthly data, published about four weeks after the month ends.
- Company and public-body applicants only (about 27% of all permits in Sitadel; most permits are for single houses built by private persons).
- Names and addresses are kept in French as published, with the broken accents of the source files repaired (for example `LYON 2AÃÂME` becomes `LYON 2ÈME`; 14,942 of 14,944 damaged values across the company rows are repaired).
- Floor areas, storeys, land area and the architect flag are as declared on the form and often incomplete.
- `filingDate` is a field SDES added in April 2026 and is empty for many older permits.

### Data source and licence

Source: SDES (Service des données et études statistiques, French Ministry for the Ecological Transition), Sitadel — [Liste des permis de construire et autres autorisations d'urbanisme](https://www.statistiques.developpement-durable.gouv.fr/donnees-des-permis-de-construire-et-autres-autorisations-durbanisme), via the [DiDo API](https://data.statistiques.developpement-durable.gouv.fr/dido/api/v1/datasets/6513f0189d7d312c80ec5b5b). Last updated by SDES on 28 August 2026 at the time of writing; every row carries the current date in `sourceLastUpdated`. Licence Ouverte / Open Licence (Etalab). Translated and reformatted; the information is not otherwise altered. This Actor is not affiliated with, or endorsed by, SDES or the French Ministry for the Ecological Transition.

### More from Japan Open Data

- [Taiwan Real Estate Sold Prices API in English](https://apify.com/japan-open-data/taiwan-property-sold-prices) — official Taiwan actual-price-registration sales (buildings, land, parking) by city and district, translated into English with price per ping and per m².
- [UK Importers & Exporters by Product (HMRC Data)](https://apify.com/japan-open-data/uk-importer-exporter-directory) — UK companies that imported or exported a product each month, by HS code or keyword, from official HMRC trade data, with new traders flagged.
- [UK Visa Sponsor Register Tracker (Daily Changes)](https://apify.com/japan-open-data/uk-visa-sponsor-register) — new, removed and downgraded UK visa sponsor licences from the official Home Office register, or check whether a company can sponsor workers.
- [US Flood Zone Lookup by Address (FEMA NFHL)](https://apify.com/japan-open-data/us-flood-zone-lookup) — official FEMA flood zone (A, AE, VE, X…), base flood elevation and FIRM panel for any U.S. address or coordinates.
- [UK NHS Organisation Lookup (Official ODS Codes)](https://apify.com/japan-open-data/uk-nhs-organisation-lookup) — official NHS ODS register by postcode, type or ODS code: GP practices, pharmacies, dentists, NHS trusts, care homes and more.
- [UK HGV Operator Licence Lookup (Official DVSA)](https://apify.com/japan-open-data/uk-hgv-operator-licence) — Great Britain's official HGV and bus / coach operator licences by company, postcode and fleet size.
- [UK Waste Carrier Licence Check (Environment Agency)](https://apify.com/japan-open-data/uk-waste-carrier-register) — check whether an English business is a registered waste carrier, broker or dealer.
- [UK Flood Risk Lookup by Postcode (England)](https://apify.com/japan-open-data/uk-flood-zone-lookup) — Environment Agency flood zone, recorded flood extents and flood defences for any postcode or coordinates in England.
- [England Listed Building & Conservation Area Check](https://apify.com/japan-open-data/england-heritage-constraint-lookup) — official listed buildings, scheduled monuments, conservation areas and Article 4 directions for any postcode or coordinates in England, one row per location.
- [France Property Risk Lookup by Address (Georisques)](https://apify.com/japan-open-data/france-property-risk-lookup) — official Géorisques risks for any French address or coordinates: flood, clay shrink-swell, seismic zone, radon, past natural-disaster declarations and nearby industrial sites.
- [US Hail History by Location (NOAA NEXRAD Radar)](https://apify.com/japan-open-data/us-hail-history) — every hail day near any U.S. latitude/longitude with max estimated hail size.
- [US Storm Reports API: Hail, Wind & Tornado (NWS)](https://apify.com/japan-open-data/us-storm-reports-live) — U.S. hail, wind, tornado and flood reports from official NWS Local Storm Reports.
- [Mexico Gas Prices API by Station (Official CNE)](https://apify.com/japan-open-data/mexico-fuel-station-prices) — today's gas and diesel prices at every Mexican gas station, from the official CNE feed.
- [Argentina Fuel Prices API by Station (Official)](https://apify.com/japan-open-data/argentina-fuel-station-prices) — last reported gasoline (nafta), diesel and CNG prices at every Argentine gas station.
- [TSA Checkpoint Travel Numbers (Daily, Weekly & YoY)](https://apify.com/japan-open-data/tsa-checkpoint-throughput) — daily U.S. TSA airport checkpoint traveler counts.
- [Japan Postal Code & Address in English](https://apify.com/japan-open-data/japan-postal-code-english) — Japanese postal codes and addresses in English/romaji, kanji and kana.

### Feedback

Found a wrong row, a label that reads oddly, a company withheld that should not be, or a name that should have been withheld? Open an issue on the **Issues** tab — it will be read.

# Actor input Schema

## `department` (type: `string`):

One French department: a code such as "69", "33", "2A" or "974", or its name in French or English, e.g. "Rhône", "Gironde", "Paris", "French Guiana". Run once per department.

## `month` (type: `string`):

"latest" (default): the newest month SDES has published (read from the dataset metadata on every run; SDES publishes each month at the end of the following month). Or a month such as "2026-07" (January 2013 or later). This is the month the permit was recorded in Sitadel.

## `months` (type: `integer`):

How many months to include, ending with "month": 1 (default) = that month only, 3 = that month and the two before it. Rows from the newest published month have isNewThisMonth = true.

## `commune` (type: `string`):

Only permits in this commune: its name (e.g. "Villeurbanne", "Lyon") or its 5-digit INSEE code or postcode (e.g. "69266"). Paris, Lyon and Marseille city codes (75056, 69123, 13055) include all their arrondissements. Leave empty for the whole department.

## `permitCategory` (type: `string`):

"all" (default), "housing" (permits creating dwellings) or "non-residential" (offices, retail, warehouses, industry, hotels, farms, public facilities).

## `applicantTypes` (type: `array`):

Only these applicant types, e.g. \["property developer", "social landlord"]. Values: property developer, social landlord, public body, semi-public company, construction company, property company or investor, farm or agricultural business, energy or utility, retailer, wholesaler, hotel or restaurant, health or social care, education, transport or logistics, manufacturer, non-profit, owners' association, other company. Leave empty for all.

## `minDwellings` (type: `integer`):

Only permits creating at least this many dwellings (0 = no minimum). For example 10 for apartment projects.

## `minFloorAreaM2` (type: `integer`):

Only permits creating at least this much floor area, housing plus non-residential, in square metres (0 = no minimum).

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

Maximum number of permit rows (each is charged). The largest projects (by floor area, then dwellings) come first.

## Actor input object example

```json
{
  "department": "69",
  "month": "latest",
  "months": 1,
  "permitCategory": "all",
  "applicantTypes": [],
  "minDwellings": 0,
  "minFloorAreaM2": 0,
  "maxResults": 20
}
```

# Actor output Schema

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

Company, SIREN, applicant type, permit type and status, site street and town, dwellings, floor area by use and dates per permit. Table view: overview.

# 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 = {
    "department": "69"
};

// Run the Actor and wait for it to finish
const run = await client.actor("japan-open-data/france-building-permits").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 = { "department": "69" }

# Run the Actor and wait for it to finish
run = client.actor("japan-open-data/france-building-permits").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 '{
  "department": "69"
}' |
apify call japan-open-data/france-building-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,japan-open-data/france-building-permits"
        }
    }
}
```

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/IbmX0iKsJCGNdRXye/builds/W8R849qw0aCdwUVGv/openapi.json
