Points de terminaisonCinq points, une même forme d’erreur
Toute erreur rend un objet { "erreur": "…" } dont le message nomme le paramètre en cause. Les codes communs à tous les points :
401clé absente, mal formée, inconnue ou révoquée402crédit insuffisant pour le prix de l’appel429cadence (60 appels par minute)503service momentanément indisponible ; l’en-tête retry-after dit quand réessayer
POST/api/v1/estimation
L’estimation d’un logement à une adresse, d’après les ventes conclues publiées par l’État (DVF) : la même méthode que la page Estimer de Huub. Avec le loyer attendu, le rendement brut et l’étiquette DPE lue au registre ADEME quand elle n’est pas fournie.GET accepte les mêmes paramètres en query.
Paramètres (corps JSON)
Localiser le bien par l’un des trois moyens, lus dans cet ordre : coordonnées, adresse, code commune.
| Paramètre | Type | Description |
|---|
latitude, longitude | décimaux | Position WGS84, les deux ensemble. La commune et l’adresse viennent du géocodage inverse de la BAN. |
adresse | texte, 3 à 200 | Texte libre géocodé par la Base Adresse Nationale. Donnez toujours la commune ou le code postal : la BAN répond toujours quelque chose. L’adresse retenue est rendue, vérifiez-la. |
insee | texte, 5 | Code commune (arrondissement pour Paris, Lyon, Marseille : 75104, 69383, 13208). Le bien n’est alors situé qu’à la commune : pas de pondération par la distance. |
typerequis | appartement | maison | Le type de logement. |
surfacerequis | m², > 8 et ≤ 5 000 | Surface habitable. |
pieces | entier, 1 à 30 | Nombre de pièces. |
terrain | m² | Surface du terrain, maisons seulement ; refusé sur un appartement. |
dpe | lettre A à G | L’étiquette énergie. Absente, elle est cherchée au registre ADEME à l’adresse, à la surface près ; jamais à la commune seule. |
Exemple
curl -X POST "https://huub.immo/api/v1/estimation" \
-H "Authorization: Bearer huub_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"adresse": "12 rue de la Loge 34000 Montpellier",
"type": "appartement",
"surface": 62,
"pieces": 3
}'
{
"adresse": {
"saisie": "12 rue de la Loge 34000 Montpellier",
"resolue": "12 Rue de la Loge 34000 Montpellier",
"insee": "34172", "commune": "Montpellier", "codePostal": "34000",
"latitude": 43.6108, "longitude": 3.8767,
"precision": "numero"
},
"bien": { "type": "appartement", "surfaceM2": 62, "pieces": 3, "terrainM2": null },
"estimation": {
"valeur": 248000, "basse": 221000, "haute": 276000, "prixM2": 4000,
"methode": "ventes DVF pondérées par la distance et la date",
"confiance": "bonne", "sousReserve": false,
"ventesRetenues": 41, "ventesParcourues": 312, "rayonM": 420,
"periode": { "de": "2023-01", "a": "2025-12" }
},
"loyer": { "mensuel": 870, "bas": 790, "haut": 960, "parM2": 14.0, "source": "loyers_observes", "segment": "T3", "observations": 128, "annee": 2026 },
"rendementBrut": 4.2,
"dpe": { "classe": "D", "source": "registre" },
"comparables": [
{ "distanceM": 85, "date": "2025-06-12", "prixM2": 4120, "surfaceM2": 58, "pieces": 3, "type": "appartement", "poids": 9.4 },
…
]
}
precision vaut numero, rue, lieu-dit, commune, coordonnees ou approximative. confiance vaut faible, moyenne ou bonne. loyer.source dit d’où vient le loyer : observations à l’adresse, carte des loyers, ou moyenne du département. Huit comparables au plus, sans adresse ni identifiant : distance, date, surface, pièces et prix au m², ce que DVF publie lui-même.
Erreurs
400paramètre manquant ou invalide ; le message nomme le paramètre404adresse introuvable, correspondance trop incertaine, commune inconnue, ou aucune adresse à ces coordonnées422estimation impossible : raison dit pourquoi (aucune vente comparable, département hors DVF…). L’appel est consommé.503BAN indisponible, ou service momentanément indisponible
GET/api/v1/communes/{insee}
Le marché d’une commune tel que Huub le mesure, par type de bien (appartement, maison) : prix des ventes conclues (DVF) et leur évolution, médiane des annonces en vente, délai de vente, tension locative et de revente, loyers observés et loyer de référence, rendement brut ; plus la démographie INSEE et le parc DPE (ADEME). Le même fond que les pages Prix par commune. Aucune annonce n’en sort : des médianes.
Paramètres
La réponse est mise en cache une heure par commune. Le segment d’URL prime ; sans lui, ?codePostal= puis ?nom= sur /api/v1/communes. Un code postal ou un nom qui désigne plusieurs communes rend 404 avec la liste des candidates : jamais un choix silencieux.
| Paramètre | Type | Description |
|---|
insee | chemin, 5 caractères | Code INSEE de la commune (75104, 69383, 13208 pour un arrondissement ; 2A004 en Corse). Paris, Lyon et Marseille existent aussi entiers (75056, 69123, 13055) : les ventes y cumulent tous les arrondissements. |
codePostal | query, 5 chiffres | À défaut du code INSEE. Paris, Lyon, Marseille : le code postal désigne l’arrondissement. |
nom | query, 2 à 80 | À défaut des deux autres : correspondance exacte d’abord, puis par préfixe. |
Exemple
curl "https://huub.immo/api/v1/communes/34172" \
-H "Authorization: Bearer huub_VOTRE_CLE"
{
"commune": {
"insee": "34172", "nom": "Montpellier", "codesPostaux": ["34000", "34070", "34080", "34090"],
"departement": { "code": "34", "nom": "Hérault" }, "region": { "code": "76", "nom": "Occitanie" },
"arrondissement": false, "communeMere": null,
"slug": "montpellier", "url": "https://huub.immo/prix-immobilier/montpellier",
"zoneAbc": "A", "annoncesEnVente": 1412
},
"marche": {
"appartement": {
"prixM2Median": 3720, "prixM2Bas": 2980, "prixM2Haut": 4610,
"periode": "2025-12-31", "fenetreAns": 1, "ventesEchantillon": 2860, "ventesParAn": 2860,
"evolution1An": -1.8, "evolution5Ans": 14.2, "evolutionDepuis": { "annee": 2021, "variation": 11.6 },
"prixM2Annonces": { "median": 3950, "echantillon": 1240, "periode": "2026-09" },
"delaiVente": { "medianJours": 74, "annoncesRetirees": 3120, "ancienneteEnLigneJours": 58, "annoncesEnLigne": 1240, "partPlusDeSixMois": 17.5 },
"tension": { "locative": 78, "locativeLibelle": "très facile à louer", "revente": 61, "reventeLibelle": "revente fluide" },
"rendementBrut": 4.7
},
"maison": { … même forme … }
},
"loyers": {
"appartement": {
"observes": { "nu": { "parM2": 14.2, "observations": 96 }, "meuble": { "parM2": 17.1, "observations": 32 },
"tous": { "parM2": 14.6, "bas": 12.0, "haut": 18.3, "observations": 128 }, "periode": "2026-09", "elargi": false },
"reference": { "parM2": 14.6, "bas": 12.0, "haut": 18.3, "source": "loyers_observes", "annee": 2026, "echantillon": 128 }
},
"maison": { … même forme … }
},
"demographie": {
"population": 299096, "anneePopulation": 2021, "evolution20Ans": 24.3,
"partLocataires": 68.1, "partProprietaires": 29.4, "logementsVacants": 8.2,
"logements": 178430, "residencesPrincipales": 158200, "residencesSecondaires": 5600, "maisons": 21400, "appartements": 155900,
"revenuMedian": 20310, "densiteHabKm2": 5230, "ageMedian": 32, "tauxChomage": 14.1, "logementSocial": 16.8,
"dpeParc": { "A": 1200, "B": 6400, "C": 21800, "D": 31500, "E": 17200, "F": 5100, "G": 2300, "total": 85500 }
},
"sources": ["DVF (DGFiP)", "INSEE", "ADEME", "Base Adresse Nationale", "relevés Huub"]
}
marche.*.prixM2Median : médiane des ventes conclues (DVF) ; prixM2Annonces : médiane des annonces en vente sur le parc de Huub, pas une annonce. evolution1An et evolution5Ans comparent des millésimes DVF exacts (null si l’un manque) ; evolutionDepuis part du premier millésime connu.tension.locative et tension.revente : 0 à 100, plus c’est haut, plus c’est facile.loyers.*.observes.elargi : vrai quand la commune n’a pas dix relevés ; la médiane est alors celle des communes à moins de 10 km.rendementBrut : loyer de référence annuel sur prix médian, en %.dpeParc compte les diagnostics déposés à l’ADEME, pas les logements.
{
"erreur": "3 communes correspondent à « Saint-Martin » : précisez par le code INSEE (/api/v1/communes/{insee}).",
"candidates": [ { "insee": "67426", "nom": "Saint-Martin", "departement": "67", "codesPostaux": ["67220"] }, … ]
}
Erreurs
400code INSEE invalide, codePostal ou nom mal formé, ou commune manquante404commune inconnue, ou plusieurs communes pour ce code postal ou ce nom (candidates les liste, 30 au plus)
GET/api/v1/annonces/{id}/adresse
L’adresse résolue par le moteur de Huub pour une annonce du catalogue, avec son niveau de confiance et, quand l’adresse n’est pas connue, le cercle dans lequel le bien se trouve. Aucune donnée brute du portail : seulement le résultat du moteur.
Paramètres
| Paramètre | Type | Description |
|---|
idrequis | chemin, uuid | L’identifiant Huub de l’annonce : celui de huub.immo/annonces/{id}, ou rendu par /annonces/rechercher. |
Exemple
curl "https://huub.immo/api/v1/annonces/6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f/adresse" \
-H "Authorization: Bearer huub_VOTRE_CLE"
{
"id": "6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f",
"niveau": "forte",
"confiance": "forte",
"adresse": "12 rue de la Loge 34000 Montpellier",
"numero": "12", "voie": "rue de la Loge", "codePostal": "34000", "commune": "Montpellier",
"insee": "34172",
"latitude": 43.6108, "longitude": 3.8767,
"zone": null,
"fiche": "https://huub.immo/annonces/6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f"
}
| niveau | confiance | Ce que ça veut dire |
|---|
forte | forte | adresse vérifiée par deux sources concordantes ; latitude et longitude sont renseignées |
proposee | proposee | une seule source : probable, à vérifier sur place |
hypothese | null | indicative seulement |
absente | null | l’annonce existe, le moteur n’a rien de montrable ; les autres champs valent null |
zone vaut { latitude, longitude, rayonM, source } quand le moteur n’a pas l’adresse mais un cercle : annonceur pour celui publié par l’annonceur (le bien est dedans), cadastre pour la parcelle déduite.
Erreurs
400identifiant mal formé : un uuid est attendu404annonce inconnue, retirée du catalogue ou plus en ligne
GET/api/v1/annonces/{id}/note
La note d’opportunité de Huub pour une annonce : les deux barèmes, louer et revendre, chacun sur 100, avec leurs critères et les chiffres qui les portent. Le prix au m² et la surface sont rendus parce que la note ne se lit pas sans eux ; le prix total et le texte de l’annonce restent chez le portail.
Paramètres
| Paramètre | Type | Description |
|---|
idrequis | chemin, uuid | L’identifiant Huub de l’annonce. |
Exemple
curl "https://huub.immo/api/v1/annonces/6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f/note" \
-H "Authorization: Bearer huub_VOTRE_CLE"
{
"id": "6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f",
"louer": {
"note": 71,
"rendementBrutPct": 5.1,
"loyerEstimeMensuel": 880,
"ecartPrixM2Pct": 8.5,
"referencePrix": "quartier",
"prixM2Reference": 3820,
"criteres": [
{ "cle": "prix_marche", "libelle": "Prix face au marché", "famille": "prix", "points": 18, "maxPoints": 25, "manquant": false },
{ "cle": "dpe", "libelle": "Étiquette énergie", "famille": "bien", "points": 0, "maxPoints": 10, "manquant": true },
…
]
},
"revendre": {
"note": 58,
"margeEstimeeEuros": 12400,
"prixDeSortieEuros": 251000,
"criteres": [ … ]
},
"prixM2": 3495, "surfaceM2": 62, "prixM2Commune": 3950,
"type": "Appartement",
"dpe": { "classe": null, "ges": null },
"commune": { "insee": "34172", "nom": "Montpellier" },
"publiee": "2026-09-14T08:12:00.000Z",
"fiche": "https://huub.immo/annonces/6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f"
}
ecartPrixM2Pct : (référence − prix au m²) / référence, en % ; positif = moins cher que la référence.referencePrix : quartier pour une valeur d’après les ventes réelles autour du bien, commune pour la médiane des annonces en cours de la commune.- Un critère
manquant n’a pas pesé : la donnée manquait, il est sorti du dénominateur plutôt que noté zéro. dpe vaut null aussi quand l’annonce porte un DPE de remplissage (un gabarit, pas un diagnostic).publiee : date de publication chez le portail ; à défaut, date d’entrée au catalogue.
Erreurs
400identifiant mal formé : un uuid est attendu404annonce inconnue, retirée du catalogue ou plus en ligne
GET/api/v1/annonces/rechercher
Deux usages selon le paramètre donné : retrouver l’annonce du catalogue derrière une page de portail, ou lister les annonces d’une commune.
1. Par URL de portail
| Paramètre | Type | Description |
|---|
urlrequis | URL http(s) | La page de l’annonce chez le portail (SeLoger, Leboncoin, Bien’ici, PAP, Logic-Immo…). Normalisée avant comparaison : hôte sans www, sans barre finale, sans fragment, sans paramètres de suivi. |
curl "https://huub.immo/api/v1/annonces/rechercher?url=https%3A%2F%2Fwww.exemple-portail.fr%2Fannonce%2F123456" \
-H "Authorization: Bearer huub_VOTRE_CLE"
{
"id": "6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f",
"fiche": "https://huub.immo/annonces/6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f",
"adresse": { … la réponse de /annonces/{id}/adresse … },
"note": { "louer": { … }, "revendre": { … } }
}
Un seul appel consommé pour l’adresse et la note ensemble. 404 si l’URL n’est pas une annonce du catalogue, ou plus en ligne.
2. Par filtres
| Paramètre | Type | Description |
|---|
inseerequis | texte, 5 | Code INSEE de la commune. |
type | appartement | maison | immeuble | Ou 0, 1, 2. Tous les types par défaut. |
surfaceMin | m², 1 à 100 000 | Surface minimale. |
surfaceMax | m² | Surface maximale. |
noteMin | 0 à 100 | Note « louer » minimale. |
limite | entier, 1 à 50 | 24 par défaut. |
curl "https://huub.immo/api/v1/annonces/rechercher?insee=34172&type=appartement¬eMin=60&limite=2" \
-H "Authorization: Bearer huub_VOTRE_CLE"
{
"annonces": [
{
"id": "6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f",
"fiche": "https://huub.immo/annonces/6f1c2a3e-8b4d-4c5e-9f60-1a2b3c4d5e6f",
"noteLouer": 71, "noteRevendre": 58,
"prixM2": 3495, "surfaceM2": 62,
"type": "Appartement",
"publiee": "2026-09-14T08:12:00.000Z",
"adresse": { "niveau": "forte" }
},
{ "id": "…", "noteLouer": 64, … }
],
"nombre": 2
}
Triées par note « louer » décroissante. Seules les annonces en ligne et visibles sur huub.immo sortent. Pas de total : appelez /adresse et /note sur celles qui vous intéressent.
Erreurs
400ni url ni insee ; URL qui n’est pas http(s) ; paramètre illisible404URL sans annonce au catalogue
GET/api/v1/annonces/{id}/rapport
Le rapport complet d’une annonce, celui de la fiche Huub : prix face au marché, ventes comparables, loyer et rendement, financement, quartier et trajets, immeuble et diagnostics, urbanisme, projection de revente. L’appel rend un lien signé vers la page imprimable (HTML prêt pour l’impression ou l’enregistrement en PDF), qui s’ouvre sans compte pendant sept jours. L’adresse exacte du bien n’y figure pas : elle se demande à part, par annonces/adresse.
| Paramètre | Type | Description |
|---|
idrequis | uuid | L’identifiant de l’annonce au catalogue (dans le chemin). |
curl "https://huub.immo/api/v1/annonces/01a0b71d-d40c-72ae-a5ab-2881e4c9f0a2/rapport" \
-H "Authorization: Bearer huub_…"
{
"id": "01a0b71d-d40c-72ae-a5ab-2881e4c9f0a2",
"fiche": "https://huub.immo/annonces/01a0b71d-d40c-72ae-a5ab-2881e4c9f0a2",
"rapport": {
"url": "https://huub.immo/annonces/01a0b71d-d40c-72ae-a5ab-2881e4c9f0a2/rapport?jeton=1759…",
"expire": "2026-09-27T18:40:00.000Z",
"validiteJours": 7,
"format": "HTML imprimable (PDF par impression du navigateur), sans compte"
},
"contenu": ["prix face au marché", "ventes comparables", "loyer et rendement", "financement", "quartier et trajets", "immeuble et diagnostics", "urbanisme", "projection de revente"]
}
Un appel = un lien ; le lien s’ouvre autant de fois qu’on veut pendant sa validité. Un jeton faux ou périmé rend 404.
Erreurs
400identifiant mal formé404annonce inconnue ou retirée