Guides / Estimer un bien

Estimer la valeur d'un bien

Construisez une estimation fiable basée sur des transactions DVF réelles.

L'estimation par comparables est la méthode de référence des professionnels de l'immobilier. Elle consiste à trouver des biens similaires vendus récemment dans la même zone, puis à en déduire une fourchette de valeur pour le bien cible.

1

Trouver les comparables

Biens similaires vendus récemment, classés par score de similarité

2

Analyser les prix

Distribution des prix au m², fourchette basse/médiane/haute

3

Affiner si nécessaire

Élargir rayon ou période si peu de comparables

Étape 1 — Appeler find_property_comparables

L'endpoint GET /v1/comparables (ou l'outil MCP find_property_comparables) prend latitude, longitude et surface cible comme paramètres obligatoires.

import requests

API_KEY = "normi_votre_token"
BASE_URL = "https://mcp.normi.fr/v1"

def find_property_comparables(lat, lon, surface, type_local="Appartement", radius_m=500):
    r = requests.get(
        f"{BASE_URL}/comparables",
        params={
            "latitude": lat,
            "longitude": lon,
            "type_local": type_local,
            "surface_min": surface * 0.8,
            "surface_max": surface * 1.2,
            "radius_m": radius_m,
            "max_age_months": 12,
            "exclude_bulk_sales": True,
        },
        headers={"X-API-Key": API_KEY},
    )
    r.raise_for_status()
    return r.json()

# Appartement de 65m² à Paris 11e (lat/lon approximatifs)
result = find_property_comparables(48.8581, 2.3790, 65)
print(f"Comparables retournés : {len(result['comparables'])}")
Coordonnées GPS
Pour obtenir les coordonnées d'une adresse, utilisez l'API BAN gratuite : api-adresse.data.gouv.fr/search/?q=15+rue+de+la+Roquette+Paris

Étape 2 — Lire la réponse

La réponse contient deux blocs : comparables (liste triée par score) et valuation_estimate (ou null lorsque moins de trois comparables sont disponibles après repli).

estimate = result["valuation_estimate"]
if estimate is None:
    print("Moins de trois comparables après repli : pas d'estimation publiée.")
    raise SystemExit(0)

price_m2 = estimate["price_per_m2"]
estimated = estimate["price_range"]

print("=== Prix au m² ===")
print(f"  Médiane : {price_m2['median']:,} €/m²")

print("\n=== Fourchette d'estimation (65m²) ===")
print(f"  Basse   : {estimated['low']:,} €")
print(f"  Médiane : {estimated['mid']:,} €")
print(f"  Haute   : {estimated['high']:,} €")

# Afficher les 3 meilleurs comparables
print("\n=== Top 3 comparables ===")
for comp in result["comparables"][:3]:
    property = comp["property"]
    print(f"  {property['address']}")
    print(f"    {property['surface']}m² — {property['price']:,} € ({property['price_per_m2']:,} €/m²)")
    print(f"    Distance: {comp['distance_m']}m — Score: {comp['similarity_score']:.2f}")
    print(f"    Vendu le: {property['date']}")
ChampSignification
similarity_scoreScore 0–1 : surface 40 %, distance 30 %, ancienneté 20 %, pièces 10 %.
valuation_estimate.price_per_m2.medianMédiane non pondérée du prix au m² des comparables sélectionnés.
valuation_estimate.price_range.lowValeur centrale moins 10 % : ce n'est pas un P25 ni un intervalle calibré.
valuation_estimate.price_range.midPrix médian × surface cible — valeur centrale de l'estimation.
valuation_estimate.price_range.highValeur centrale plus 10 % : ce n'est pas un P75 ni un intervalle calibré.

Étape 3 — Affiner si peu de comparables

Si valuation_estimate vaut null, moins de trois comparables ont été trouvés après les replis automatiques. Ajustez progressivement les critères.

# Si moins de 5 comparables : élargir le rayon
if len(result["comparables"]) < 3:
    print("Moins de trois comparables : vérifier fallback_used, puis ajuster les paramètres si nécessaire.")
    result = find_property_comparables(48.8581, 2.3790, 65, radius_m=1000)
    print(f"Après nouvel appel : {len(result['comparables'])} comparables")

# Si toujours peu : élargir la période
if len(result["comparables"]) < 3:
    r = requests.get(
        f"{BASE_URL}/comparables",
        params={
            "latitude": 48.8581,
            "longitude": 2.3790,
            "type_local": "Appartement",
            "surface_min": 65 * 0.7,   # fourchette élargie
            "surface_max": 65 * 1.3,
            "radius_m": 1000,
            "max_age_months": 24,       # 2 ans au lieu de 12 mois
        },
        headers={"X-API-Key": API_KEY},
    )
    result = r.json()
    print(f"Avec 24 mois : {len(result['comparables'])} comparables")
Compromis rayon vs pertinence
Augmenter le rayon au-delà de 1km peut introduire des biens dans des micro-marchés différents (arrondissement différent, quartier moins prisé). Préférez élargir la période temporelle plutôt que le rayon géographique.

Exemple JavaScript

const API_KEY = "normi_votre_token";

async function estimateProperty({ lat, lon, surface, typeLocal = "Appartement" }) {
  const params = new URLSearchParams({
    latitude: lat.toString(),
    longitude: lon.toString(),
    type_local: typeLocal,
    surface_min: (surface * 0.8).toString(),
    surface_max: (surface * 1.2).toString(),
    radius_m: "500",
    max_age_months: "12",
  });

  const res = await fetch(
    `https://mcp.normi.fr/v1/comparables?${params}`,
    { headers: { "X-API-Key": API_KEY } }
  );

  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const data = await res.json();

  const estimate = data.valuation_estimate;
  if (!estimate) return { comparablesCount: data.comparables.length, estimatedValue: null };

  return {
    comparablesCount: data.comparables.length,
    pricePerM2: { median: estimate.price_per_m2.median },
    estimatedValue: {
      low: estimate.price_range.low,
      median: estimate.price_range.mid,
      high: estimate.price_range.high,
    },
    topComparables: data.comparables.slice(0, 5),
    creditsUsed: data._credits.used,
  };
}

// Usage
const estimate = await estimateProperty({ lat: 48.8581, lon: 2.3790, surface: 65 });
console.log(`Estimation médiane : ${estimate.estimatedValue.median.toLocaleString("fr-FR")} €`);

Avec Claude (MCP)

Si Normi est connecté à Claude via MCP, vous pouvez simplement demander :

"Estime la valeur d'un appartement de 65m², 3 pièces, situé au 15 rue de la Roquette, Paris 11e. Utilise les ventes comparables des 12 derniers mois dans un rayon de 500m. Présente la fourchette basse/médiane/haute et liste les 3 meilleurs comparables avec leur adresse et prix."

Claude appellera automatiquement find_property_comparables et formatera les résultats de façon lisible.