API BDNB — Bâtiments

Quatre endpoints pour croiser les données DVF avec les 32 M bâtiments de la Base de Données Nationale des Bâtiments (CSTB).

Les données BDNB sont issues du millésime 2025-07-a (CSTB, Licence Ouverte 2.0). La jointure DVF×BDNB est réalisée par proximité spatiale (KNN ≤ 200 m). 16,8 M de transactions DVF sont matchées.
GET/v1/transactions/:id/bdnb2 crédits

Retourne les données du bâtiment BDNB le plus proche d'une transaction DVF donnée : année de construction, matériaux, nombre de logements et étages, usage, distance de correspondance.

Paramètres

ParamètreTypeDéfautDescription
id*stringID de la transaction DVF (paramètre de chemin)

Exemple

curl "https://mcp.normi.fr/v1/transactions/123456/bdnb" \
  -H "X-API-Key: normi_votre_token"
{
  "building": {
    "batiment_groupe_id": "bdnb-bg-KXVS-CAJR-C7E2",
    "annee_construction": 1914,
    "nb_logements": 17,
    "nb_etages": 8,
    "materiaux_murs": "PIERRE",
    "materiaux_toit": "ARDOISES - ZINC ALUMINIUM",
    "usage_principal": "Résidentiel collectif",
    "usage_niveau_1": "Résidentiel collectif",
    "dvf_nb_mutations": 12,
    "dvf_prix_m2_median": 9337,
    "match_distance_m": 6
  },
  "transaction_id": "123456",
  "_credits": { "used": 2, "remaining": 498 },
  "query_time_ms": 102
}
GET/v1/bdnb/age-stats10 crédits

Prix médian/m² DVF par tranche de construction (avant 1919, 1919–1945, 1946–1970, 1971–1990, 1991–2005, 2006+). Révèle si l'ancien se vend avec une prime ou une décote par rapport au neuf dans une zone donnée.

Au moins un filtre de localisation est requis.statistically_fragile: true signale les tranches avec moins de 30 transactions.

Paramètres

ParamètreTypeDéfautDescription
code_postalstringCode postal (ex. '75015')
communestringNom de commune en majuscules (ex. 'LYON')
code_departementstringCode département (ex. '69')
type_localenumMaison | Appartement — filtre le côté DVF

Exemple

curl "https://mcp.normi.fr/v1/bdnb/age-stats?code_postal=75015" \
  -H "X-API-Key: normi_votre_token"
{
  "tranches": [
    { "tranche": "avant_1919", "nb": 12648, "prix_m2_median": 9172, "prix_m2_moyen": 9278, "vs_zone_pct": 0, "statistically_fragile": false },
    { "tranche": "1919_1945", "nb": 4012,  "prix_m2_median": 9165, "prix_m2_moyen": 9271, "vs_zone_pct": 0, "statistically_fragile": false },
    { "tranche": "1946_1970", "nb": 3177,  "prix_m2_median": 8939, "prix_m2_moyen": 9076, "vs_zone_pct": -2, "statistically_fragile": false },
    { "tranche": "1971_1990", "nb": 2236,  "prix_m2_median": 9199, "prix_m2_moyen": 9296, "vs_zone_pct": 0, "statistically_fragile": false },
    { "tranche": "1991_2005", "nb": 1665,  "prix_m2_median": 9328, "prix_m2_moyen": 9467, "vs_zone_pct": 2, "statistically_fragile": false },
    { "tranche": "2006_plus", "nb": 833,   "prix_m2_median": 10484,"prix_m2_moyen": 11627,"vs_zone_pct": 14, "statistically_fragile": false }
  ],
  "prix_m2_median_zone": 9158,
  "nb_total": 24571,
  "_credits": { "used": 10, "remaining": 488 },
  "query_time_ms": 367
}

Lecture

  • vs_zone_pct positif — les biens de cette tranche se vendent au-dessus de la médiane de la zone
  • vs_zone_pct négatif — décote par rapport à la médiane
  • tranche "2006_plus" — inclut tous les biens construits depuis 2006 (neuf et récent)
GET/v1/bdnb/renovation-score10 crédits

Score de potentiel de rénovation (0–100) pour une zone : identifie les bâtiments construits avant 1975 vendus en dessous de la médiane du marché. Plus le score est élevé, plus il y a d'anciens biens sous-valorisés dans la zone.

Paramètres

ParamètreTypeDéfautDescription
code_postalstringCode postal (ex. '69001')
communestringCommune en majuscules (ex. 'MARSEILLE')
code_departementstringCode département (ex. '13')
type_localenumMaison | Appartement — filtre le côté DVF

Exemple

curl "https://mcp.normi.fr/v1/bdnb/renovation-score?code_postal=69001&type_local=Appartement" \
  -H "X-API-Key: normi_votre_token"
{
  "score": 72,
  "nb_opportunites": 3471,
  "prix_m2_median_vieux": 4200,
  "prix_m2_median_zone": 5100,
  "annee_construction_moy": 1932,
  "materiaux_murs_principal": "PIERRE",
  "decote_vs_zone_pct": 18,
  "total_transactions_zone": 3664,
  "_credits": { "used": 10, "remaining": 478 },
  "query_time_ms": 280
}

Lecture

  • score = 0 — les vieux biens se vendent au prix du marché (pas de décote mesurable)
  • score élevé (≥ 60) — décote significative sur l'ancien, potentiel de valorisation après travaux
  • nb_opportunites < 10 — score non calculé, zone trop peu liquide
GET/v1/bdnb/stats5 crédits

Stock de bâtiments pour une commune ou un département : répartition par tranche de construction, par usage (résidentiel/tertiaire), nombre total de logements et médiane d'année de construction. Interroge directement les 32 M bâtiments BDNB — pas uniquement ceux avec des transactions DVF.

Utilisez code_commune_insee pour une précision commune (ex. 75115 pour Paris 15e). Avec code_postal, les stats sont retournées au niveau du département (BDNB n'a pas de champ code postal).

Paramètres

ParamètreTypeDéfautDescription
code_commune_inseestringCode INSEE commune (ex. '75115' pour Paris 15e) — précision maximale
code_postalstringCode postal — retourne les stats au niveau du département
communestringNom de commune en majuscules (ex. 'BORDEAUX')
code_departementstringCode département (ex. '33')

Exemple

curl "https://mcp.normi.fr/v1/bdnb/stats?code_commune_insee=75115" \
  -H "X-API-Key: normi_votre_token"
{
  "nb_batiments": 6172,
  "nb_avec_annee": 5411,
  "nb_logements_total": 153055,
  "annee_construction_median": 1914,
  "par_tranche": {
    "avant_1919": 2868, "1919_1945": 791, "1946_1970": 555,
    "1971_1990": 477, "1991_2005": 455, "2006_plus": 265
  },
  "par_usage": {
    "residentiel": 4961, "tertiaire": 878, "mixte": 0, "autre": 20
  },
  "pct_vieux": 80,
  "_credits": { "used": 5, "remaining": 473 },
  "query_time_ms": 256
}