# French Property Data — PLU Zoning, DPE, Risks, DVF Prices (`dalbian/french-property-due-diligence`) Actor

Enrich any French address, cadastral parcel or coordinate with its PLU zoning, nearby DPE energy ratings, the full Géorisques risk profile, and real recorded sale prices from the DVF register — in one flat row.

- **URL**: https://apify.com/dalbian/french-property-due-diligence.md
- **Developed by:** [Benjamin Jerez](https://apify.com/dalbian) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$100.00 / 1,000 property enricheds

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

## French Property Data — PLU Zoning, DPE, Risks, DVF Prices

Give this Actor a French address, a cadastral parcel or a coordinate pair, and it returns the four things anyone has to check before buying, valuing, insuring or building on a property — in one flat row, ready for a spreadsheet or a CRM.

Doing this by hand means four different official sites, four different search interfaces, and no way to batch it. Here it is one call per location, about a second each.

### The four blocks

**Urban planning.** The PLU zone covering the point, its official label and family (U, AU, A, N), and a link to the written *règlement*. This is what decides whether anything can be built at all. Protected sectors under a PSMV come back correctly labelled rather than blank.

**Energy performance.** The nearest energy-performance certificates from ADEME's national register: energy and greenhouse-gas classes, floor area, building type, year built and assessment date, each with its distance from your point. A property's rating means little on its own — it means a lot next to its immediate neighbours.

**Risk profile.** From Géorisques: clay shrink-swell exposure (the one that cracks foundations), seismic zone, radon potential, the commune's declared risks, its history of natural-disaster orders, plus classified industrial facilities (ICPE) and recorded polluted sites within your radius, each with a distance.

**Recorded sale prices.** Real transfer prices from the DVF register — what the tax administration recorded, not what an agency asked. You get the count of sales in the radius, the median price per square metre, the median sale price, and the most recent transactions with date, type, surface and distance.

### What a row looks like

A house in Vedène (Vaucluse), 400 m radius:

| Field | Value |
| --- | --- |
| Zone | `UB` — Première couronne d'urbanisation |
| Nearest DPE | `F` (maison, 147 m², 4 m away) |
| Clay shrink-swell | Exposition forte |
| Seismic zone | 3 — Modérée |
| Natural-disaster orders | 13 |
| Polluted sites nearby | 8 |
| Sales in radius | 170 |
| Median price per m² | 2 471 € |

The same address in the Marais, Paris 4e, returns zone `US` (Zone urbaine sauvegardée), 5 822 energy certificates within 400 m, and a median of **13 182 €/m²** across 1 255 recorded sales.

### Three ways to ask

**Addresses** — free text, matched against the official BAN address base, with the match score returned so a weak match is visible rather than silent:

```
39 rue du Félibrige, 84270 Vedène
```

**Cadastral parcels** — the right unit for permits and land deals. Both forms work:

```
84141,AW,1
84141000AW0001
```

**Coordinates** — `longitude,latitude` in WGS84, longitude first as in GeoJSON:

```
4.8055,43.9493
```

### Choosing the radius

The radius drives the energy records, the sales, the facilities and the polluted sites. 300 m is a sensible default. In a dense city centre, 100 m keeps comparables genuinely comparable. In open countryside, 1 000 m may be needed before a single recorded sale appears. Each detail row carries its own distance, so you can always tighten afterwards.

### Who uses this

Diagnostiqueurs and notaires assembling a sale file. Estate agents and valuers who need a defensible price per square metre rather than a portal estimate. Developers and land hunters screening plots before paying for a survey. Insurers and brokers pricing exposure. Proptech products enriching a portfolio. Anyone who has ever opened four government websites for one address.

### Data sources and licence

Everything is French public-sector open data, queried live so the answer reflects what is published today:

- **IGN APIcarto** — Géoportail de l'Urbanisme (zoning) and the cadastre (parcels)
- **Base Adresse Nationale** — address geocoding
- **ADEME** — the national energy-performance register
- **Géorisques** — natural and technological risks, classified facilities, polluted sites
- **DVF** — recorded property transfers, published on data.gouv.fr

All under the Licence Ouverte / Etalab. The Actor uses no credentials and stores nothing.

### Frequently asked

**Are the sale prices asking prices?**
No. DVF records what was actually transferred and registered. It is the same source a notaire uses.

**Why does a location sometimes return no energy certificate?**
Because none has been filed within your radius. Widen it, or read `dpeCount` — it tells you how many exist before the detail rows are capped.

**How far back do the sale prices go?**
Three years by default. Set `salePriceYears` to read further back; more years means more comparables and a slower run.

**Does a failed lookup cost me anything?**
No. An address the BAN cannot match, or a parcel that does not exist, comes back with an explanatory `error` and is not charged.

# Actor input Schema

## `addresses` (type: `array`):

French postal addresses, one per line. Each is geocoded against the official BAN address base before the surrounding records are gathered. Use this for a client file, a prospect list or a property portfolio.

## `parcels` (type: `array`):

Cadastral references as 'insee,section,number' (84141,AW,1) or a full 14-character id (84141000AW0001), one per line. The parcel is the right unit for permit and land-acquisition work, where a street address is ambiguous.

## `coordinates` (type: `array`):

WGS84 pairs as 'longitude,latitude', longitude first as in GeoJSON. Use this when your data is already geocoded and you want to skip address matching.

## `radiusMeters` (type: `integer`):

How far around each point to look for energy records, recorded sales, classified facilities and polluted sites. 300 m covers a neighbourhood; drop to 100 m in a dense city centre, raise to 1000 m in open countryside where the nearest comparable sale may be far away.

## `includeZoning` (type: `boolean`):

Return the PLU zone covering the point, its official label, and a link to the written règlement. This is what tells you whether anything can be built at all.

## `includeEnergyRating` (type: `boolean`):

Return the nearest energy-performance certificates from ADEME's register: energy and greenhouse classes, floor area, year built and assessment date. Useful to place a property against its immediate neighbours.

## `includeRisks` (type: `boolean`):

Return the Géorisques profile: clay shrink-swell exposure, seismic zone, radon potential, the commune's declared risks and past natural-disaster orders, plus classified industrial facilities and recorded polluted sites within the radius.

## `includeSalePrices` (type: `boolean`):

Return real recorded property sales around the point from the DVF register, with a median price per square metre. These are actual transfer prices from the tax administration, not asking prices.

## `salePriceYears` (type: `array`):

Which DVF years to read, such as 2024 and 2023. Leave empty for the three most recent available. More years means more comparable sales but a slower run.

## `maxRecordsPerSource` (type: `integer`):

How many individual energy certificates and recorded sales to list per location. Counts and medians are always computed over everything found in the radius; this only caps the detail rows.

## `maxLocations` (type: `integer`):

Hard stop on how many locations this run processes. Set it below your list size for a cheap trial before committing a full batch.

## Actor input object example

```json
{
  "addresses": [
    "39 rue du Félibrige, 84270 Vedène"
  ],
  "radiusMeters": 300,
  "includeZoning": true,
  "includeEnergyRating": true,
  "includeRisks": true,
  "includeSalePrices": true,
  "maxRecordsPerSource": 5,
  "maxLocations": 500
}
```

# Actor output Schema

# 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 = {
    "addresses": [
        "39 rue du Félibrige, 84270 Vedène"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dalbian/french-property-due-diligence").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 = { "addresses": ["39 rue du Félibrige, 84270 Vedène"] }

# Run the Actor and wait for it to finish
run = client.actor("dalbian/french-property-due-diligence").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 '{
  "addresses": [
    "39 rue du Félibrige, 84270 Vedène"
  ]
}' |
apify call dalbian/french-property-due-diligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dalbian/french-property-due-diligence"
        }
    }
}
```

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/fOgnWrNQgND4xrkZ8/builds/jPXt1tE00TTlBkvoH/openapi.json
