foncier_dvf
Real-estate transactions from DVF+ open data (Cerema, since 2014) — price stats for a commune, or the raw mutations of a commune / around an address.
op:
"prix_m2" (default): price stats (€/m²) for a French commune. Median/mean/min/max €/m² + per-year breakdown, on clean mono-bien sales (one Appartement or Maison per mutation; outliers <100 or >50000 €/m² filtered). Use to value a property by comparables. Needs
code_commune."comparables": RAW transactions for a commune. NOT filtered: ALL property types (flats, houses, land, dependencies, mixed-use, commercial) and ALL natures (sale, VEFA off-plan, auction, exchange) — the agent decides the use (valuation, land analysis, market volume…). For a clean median €/m², use op="prix_m2" instead. Needs
code_commune."comparables_adresse": RAW transactions around a PRECISE address. Geocodes the address (BAN), returns ALL mutations whose parcel lies within
radius_mmetres (distance to nearest parcel vertex — robust to multi-parcel goods), nearest first, each withdistance_m. NOT filtered by property type/nature;median_prix_m2is computed on residential mono-bien rows only (indicative). Needsadresse.
Each raw row (both "comparables" ops): date_mutation, nature_mutation, valeur_fonciere, type_bien (raw DVF+ label) + type_local (set only for residential mono-bien, else null), surface_reelle_bati, surface_terrain, prix_m2 (null if not computable), nombre_locaux, vefa, id_parcelle(s), adresse (reverse-geocoded BAN), lat/lon. Most recent first (nearest first for "comparables_adresse").
⚠️ Dense communes (Paris arrondissements) can time out on a FIRST call. The public DVF+ API takes 20 to 35 s to serve the first page of one arrondissement-year it has not served lately (measured 26/10/2026: 75115, 75116, 75117), beyond this tool's wait; once served, the same query answers in ~1 s. Each year warms up on its own, so a few calls may be needed. A timeout here says nothing about the data: retry once or twice before concluding.
With with_dpe=True (op="comparables_adresse" only), each sale is enriched
with ADEME energy data: a HOUSE gets its matched dpe (etiquette +
dpe_match confidence by proximity & surface); a FLAT gets dpe_immeuble
(the building's DPE list — NO 1:1 match, as DVF and DPE share no dwelling key).
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "foncier_dvf"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | prix_m2 (default) | comparables | comparables_adresse. | prix_m2 |
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| limit | No | comparables ops — max rows (default 50). | |
| years | No | lookback in years WITH data (DVF lags ~6 months; up to ~2014). Defaults differ per op: 3 for "prix_m2" and "comparables_adresse", 2 for "comparables". | |
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| adresse | No | op="comparables_adresse" — free-form address (e.g. "44 la canebière marseille"). | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| radius_m | No | op="comparables_adresse" — search radius in metres (default 500). | |
| with_dpe | No | op="comparables_adresse" — attach ADEME DPE energy labels per sale (default False). | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| type_local | No | "Appartement" | "Maison". Default: both for "prix_m2", everything (all property types) for the two "comparables" ops. | |
| surface_max | No | ||
| surface_min | No | ||
| code_commune | No | op="prix_m2"/"comparables" — INSEE code, 5 digits (e.g. "13201" = Marseille 1er). |