DVF brut vs DVF nettoyé : ventes en bloc, prix aberrants et VEFA
Le DVF publié par la DGFiP est un registre de mutations, pas une base de prix. Sur les 21 199 016 lignes des fichiers 2014 à 2025, Normi en écarte 3,3 % qui ne sont pas des ventes, 8,1 % sans surface exploitable et 3,2 % de prix au m² aberrants. Parmi les 18 119 513 lignes conservées, 6,7 % sont des ventes en bloc et 2,6 % des ventes en VEFA, exclues par défaut des statistiques mais toujours interrogeables.
Ces chiffres sont mesurés sur notre propre corpus, requête à l'appui. Selon la commune, ce nettoyage relève la médiane des appartements de près de 5 % ou ne la change pas du tout : les deux cas sont montrés plus bas.
Publié le 24 septembre 2026 · mesures en production le même jour · chaque chiffre renvoie à sa requête en bas de page · Read in English
Pourquoi ne pas utiliser le DVF brut directement ?
Les fichiers « Demandes de valeurs foncières » et l'API DVF d'Etalab sont gratuits, complets et fidèles à la source. C'est précisément leur rôle : restituer les mutations telles qu'elles ont été déclarées, sans les interpréter. Pour afficher les ventes d'une parcelle, c'est ce qu'il faut.
Pour calculer un prix au m², une médiane ou une tendance, en revanche, chaque ligne doit d'abord répondre à trois questions : est-ce une vente ? Le prix se rapporte-t-il à ce seul bien ? La surface permet-elle de le ramener au m² ? Le fichier ne donne pas la réponse. Il faut la calculer, et c'est ce travail que Normi fait une fois pour toutes, à l'ingestion.
Ce qui est écarté à l'ingestion
Trois catégories de lignes ne peuvent pas produire un prix au m² fiable. Elles ne sont pas chargées dans la base, et ne sont donc pas récupérables par l'API.
3,3 %
Des mutations qui ne sont pas des ventes
Échanges, adjudications, expropriations : le fichier des mutations les mêle aux ventes. Leur « prix » ne dit rien du marché. Normi ne garde que les natures de mutation qui sont des ventes.
690 160 lignes sur 21 199 016
8,1 %
Des lignes sans surface
Sans surface Carrez, bâtie ou de terrain supérieure à 9 m², aucun prix au m² n'est calculable. Ces lignes sont écartées plutôt que complétées par une surface inventée.
1 708 261 lignes sur 21 199 016
3,2 %
Des prix au m² aberrants
Cessions à l'euro symbolique, erreurs de saisie, lots annexes vendus seuls : sur du bâti, un prix inférieur à 500 € ou supérieur à 100 000 € le m² est écarté. Les bornes sont fixes et larges : elles retirent les valeurs impossibles, pas les biens chers.
681 082 lignes sur 21 199 016
Ce qui est gardé, mais marqué
Deux autres catégories ont un prix réel, mais qui ne décrit pas le marché de la revente d'un logement. Normi les conserve et les marque, pour que chacun décide.
Ventes en bloc : 6,7 % des lignes publiées (1 208 430)
Une mutation qui porte sur un immeuble, un lot de parkings ou un portefeuille de logements n'a qu'un prix global, répété sur chacune de ses lignes. Une ligne est marquée
is_bulk_salequand elle compte plus de 3 lots, ou quand la somme de ses surfaces Carrez dépasse 1,8 fois sa surface bâtie, signe que plusieurs biens ont été agrégés.Ventes en VEFA : 2,6 % des lignes publiées (468 970)
La vente en l'état futur d'achèvement est un achat de neuf sur plan, à un prix de promoteur. Mélangée à l'ancien, elle tire les médianes vers le haut dans les quartiers en construction. La ligne est marquée
is_vefaà partir de sa nature de mutation.
Au total, 1 648 774 lignes (9,1 %) sont en bloc ou en VEFA. Par ailleurs, 99,7 % des lignes publiées ont des coordonnées, ce qui les rend interrogeables par rayon.
Comment Normi applique ces filtres
| Catégorie | Par défaut | Réglable |
|---|---|---|
| Non-ventes, surfaces manquantes, prix aberrants | Écartés à l'ingestion | Non |
| Ventes en bloc | Exclues | exclude_bulk_sales=false sur search_property_transactions, analyze_market_statistics, analyze_price_trends, find_property_comparables |
| Ventes en VEFA | Exclues | exclude_vefa=false sur search_property_transactions, analyze_market_statistics, analyze_price_trends |
Les outils d'estimation et de comparaison (estimate_property_value, compare_locations, get_zonal_price_distribution) excluent la VEFA sans option. Deux outils ne l'excluent pas encore : analyze_market_activity, qui mesure les volumes, et score_market_health. Le paramètre exclude_outliers est obsolète : les prix aberrants ne sont jamais chargés, il n'a donc rien à exclure. Il reste accepté pour ne pas casser les appels existants, mais il est ignoré.
Pour comparer les deux versions vous-même, lancez la même requête avec et sans filtres. L'API limite les requêtes par commune aux deux dernières années : ses chiffres portent donc sur une fenêtre plus courte que le tableau ci-dessous et en diffèrent légèrement.
# Médiane avec les filtres par défaut curl -H "X-API-Key: $NORMI_API_KEY" \ "https://mcp.normi.fr/v1/stats/market?commune=MONTPELLIER&type_local=Appartement" # La même, ventes en bloc et VEFA incluses curl -H "X-API-Key: $NORMI_API_KEY" \ "https://mcp.normi.fr/v1/stats/market?commune=MONTPELLIER&type_local=Appartement&exclude_bulk_sales=false&exclude_vefa=false"
Avant / après : la médiane des appartements, 2024-2025
Six grandes communes, toutes celles que nous avons mesurées. « Avant » compte toutes les lignes publiées (les prix aberrants en sont donc déjà absents), « après » exclut les ventes en bloc et en VEFA.
| Commune | Lignes avant | Médiane avant | Lignes après | Médiane après | Écart |
|---|---|---|---|---|---|
| Bordeaux | 4 584 | 4 250 € | 4 021 | 4 286 € | +0,8 % |
| Lille | 3 420 | 3 773 € | 2 617 | 3 860 € | +2,3 % |
| Montpellier | 4 720 | 3 433 € | 3 168 | 3 600 € | +4,9 % |
| Nantes | 4 390 | 3 477 € | 3 057 | 3 597 € | +3,5 % |
| Paris 15e | 3 510 | 9 445 € | 1 773 | 9 443 € | 0,0 % |
| Toulouse | 7 413 | 3 358 € | 5 310 | 3 441 € | +2,5 % |
exclude_bulk_sales=false.Requête utilisée
SELECT commune,
count(*),
percentile_cont(0.5) WITHIN GROUP (ORDER BY prix_m2),
count(*) FILTER (WHERE NOT is_bulk_sale AND NOT is_vefa),
percentile_cont(0.5) WITHIN GROUP (ORDER BY prix_m2)
FILTER (WHERE NOT is_bulk_sale AND NOT is_vefa)
FROM dvf_transactions
WHERE commune IN ('BORDEAUX','LILLE','MONTPELLIER','NANTES','PARIS 15','TOULOUSE')
AND computed_type_local = 'Appartement' AND prix_m2 IS NOT NULL
AND date_mutation >= '2024-01-01' AND date_mutation < '2026-01-01'
GROUP BY commune;FAQ
Questions fréquentes sur la qualité du DVF
Les questions qui reviennent avant de choisir entre le DVF brut et une API nettoyée.
Pourquoi ne pas utiliser directement le DVF brut ou l'API DVF d'Etalab ?
On peut, et pour consulter les ventes d'une parcelle c'est souvent suffisant. Pour un prix au m² ou une médiane, il faut d'abord refaire le nettoyage : sur 21 199 016 lignes DVF lues de 2014 à 2025, 3,3 % ne sont pas des ventes, 8,1 % n'ont aucune surface exploitable et 3,2 % ont un prix au m² hors bornes. Parmi les lignes restantes, 6,7 % relèvent d'une vente en bloc et 2,6 % d'une vente sur plan. Les fichiers publics livrent ces lignes telles qu'elles ont été déclarées ; c'est à l'utilisateur de les filtrer.
Qu'est-ce qu'une vente en bloc dans le DVF ?
Une mutation qui porte sur plusieurs lots pour un prix global unique : un immeuble, un ensemble de parkings, un portefeuille de logements. Le DVF répète ce prix sur chaque ligne de la mutation, si bien qu'un prix au m² calculé ligne par ligne n'a plus de sens. Normi marque une ligne is_bulk_sale quand elle compte plus de 3 lots, ou quand la somme des surfaces Carrez dépasse 1,8 fois la surface bâtie.
Peut-on récupérer les ventes en bloc ou en VEFA si on en a besoin ?
Oui. Elles restent dans la base et sont seulement exclues par défaut. Passez exclude_bulk_sales=false ou exclude_vefa=false sur la recherche de transactions, les statistiques de marché ou les tendances de prix. Les prix aberrants, eux, sont écartés dès l'ingestion et ne sont pas récupérables par l'API.
Le nettoyage change-t-il vraiment la médiane ?
Cela dépend du marché, et la page montre toutes les communes mesurées, y compris celle où rien ne bouge. Sur les appartements vendus en 2024-2025, exclure les ventes en bloc et en VEFA relève la médiane de 4,9 % à Montpellier et de 3,5 % à Nantes, et ne la change pas à Paris 15e, alors que la moitié des lignes y est écartée. Le filtre agit toujours sur le volume ; son effet sur le prix est local.
Ces chiffres sont-ils à jour ?
Ils ont été mesurés le 2026-09-24 sur le corpus DVF de production, qui couvre les mutations de 2014 à fin 2025. Chaque chiffre est accompagné en bas de page de la requête SQL ou du comptage qui l'a produit.
Sources des chiffres
Les lignes écartées à l'ingestion ne sont jamais chargées en base : elles sont comptées dans les fichiers de rejet de l'étape de nettoyage, dont les fichiers conservés correspondent ligne pour ligne à la table de production. Les autres chiffres ont été mesurés en production par requête SQL. Source des données : DVF (DGFiP), sous licence ouverte.
- 21 199 016 lignes DVF lues, 2014 à 2025 · mesuré le 2026-09-24
python3: count rows by reject_reason over mcp-server/pipeline/temp/dvf/cleaned/*_rejects.csv (DVF 2014-2025) + rows of *_clean.csv — 3 079 503 rejected + 18 119 513 kept
- 690 160 mutations qui ne sont pas des ventes (échanges, adjudications, expropriations) · mesuré le 2026-09-24
python3: count rows by reject_reason over mcp-server/pipeline/temp/dvf/cleaned/*_rejects.csv (DVF 2014-2025) — reject_reason = 'nature_mutation'
- 1 708 261 lignes sans surface exploitable (ni Carrez, ni bâti, ni terrain au-delà de 9 m²) · mesuré le 2026-09-24
python3: count rows by reject_reason over mcp-server/pipeline/temp/dvf/cleaned/*_rejects.csv (DVF 2014-2025) — reject_reason = 'missing_surface'
- 681 082 prix au m² hors bornes sur du bâti (moins de 500 € ou plus de 100 000 €) · mesuré le 2026-09-24
python3: count rows by reject_reason over mcp-server/pipeline/temp/dvf/cleaned/*_rejects.csv (DVF 2014-2025) — reject_reason LIKE 'price_outlier:%' (670 025 extreme_value_low + 11 057 extreme_value_high)
- 18 119 513 lignes publiées dans l'API · mesuré le 2026-09-24
SELECT count(*), count(*) FILTER (WHERE is_bulk_sale), count(*) FILTER (WHERE is_vefa), count(*) FILTER (WHERE is_bulk_sale OR is_vefa) FROM dvf_transactions;
- 1 208 430 lignes de ventes en bloc (is_bulk_sale) · mesuré le 2026-09-24
SELECT count(*), count(*) FILTER (WHERE is_bulk_sale), count(*) FILTER (WHERE is_vefa), count(*) FILTER (WHERE is_bulk_sale OR is_vefa) FROM dvf_transactions;
- 468 970 lignes de ventes en VEFA, sur plan (is_vefa) · mesuré le 2026-09-24
SELECT count(*), count(*) FILTER (WHERE is_bulk_sale), count(*) FILTER (WHERE is_vefa), count(*) FILTER (WHERE is_bulk_sale OR is_vefa) FROM dvf_transactions;
- 1 648 774 lignes en bloc ou en VEFA (28 626 sont les deux) · mesuré le 2026-09-24
SELECT count(*), count(*) FILTER (WHERE is_bulk_sale), count(*) FILTER (WHERE is_vefa), count(*) FILTER (WHERE is_bulk_sale OR is_vefa) FROM dvf_transactions;
- 18 070 857 lignes publiées avec des coordonnées · mesuré le 2026-09-24
SELECT count(*) FILTER (WHERE latitude IS NOT NULL AND longitude IS NOT NULL) FROM dvf_transactions;
Aller plus loin
- Qualité des données : la référence technique des champs et des règles.
- Comparatif des API DVF : quelles solutions documentent leur nettoyage, et lesquelles non.
- Démarrage rapide : un premier appel en moins de cinq minutes.