Taxon Partner API
1.Aperçu
Une requête par adresse, un paquet de données pour le dossier d'expertise : le pack de base (points de référence, statistiques de quartier, équipements, parcelle et carte des prix) et, en option distincte, une estimation indicative (AVM). Destinée aux partenaires revendeurs qui affichent les données dans leur propre logiciel.
| URL de base | https://taxonapi.be/api/v1/partner/ |
|---|---|
| Format | JSON (UTF-8). Noms de champs et valeurs d'énumération en anglais ; libellés, messages et messages d'erreur en nl, fr ou en via Accept-Language |
| Authentification | En-tête X-Api-Key |
| Spécification | openapi.yaml (OpenAPI 3.1, version 2.5.1) |
| Guide d'intégration | guide-fr.md (démarrage rapide, curl, PHP, Python, plan de test) ; EN integration-guide.md, NL gids-nl.md |
| Endpoints | GET /address GET /usage GET /health |
| Packs | Pack de base (sections=basic, par défaut) : les sections basic, parcel et price_map ensemble, un prix par dossier. Option AVM (sections=basic,avm) : tarifée séparément. Voir section 5. |
| Fuseau horaire | Europe/Brussels ; horodatages ISO 8601 avec décalage |
/adres et /verbruik répondent 404 not_found, les anciens noms de paramètres répondent 400 invalid_request. Seuls les alias d'en-tête X-Gebruiker-Ref, X-Kantoor-Ref et X-Dossier-Ref continuent de fonctionner (obsolètes).
2.Authentification
Chaque requête porte l'en-tête X-Api-Key. La clé est de longue durée, liée à votre compte partenaire, et Taxon n'en conserve qu'un hachage. Elle ne vous est montrée qu'une seule fois, dans le tableau de bord partenaire (voir « Gérer vos clés » ci-dessous).
| Clé | Usage | Propriétés |
|---|---|---|
tx_live_ + 32 hex | Production | La consommation est comptée et facturée mensuellement selon la convention. |
tx_test_ + 32 hex | Développement et tests du pilote | Jamais facturée, maximum 20 requêtes par jour, mêmes endpoints et même format de réponse ; chaque réponse contient "environment": "test" et un message test_environment. |
- Confidentialité. La clé reste dans votre backend. Jamais dans un navigateur, une application mobile ou un dépôt public. Appelez l'API de serveur à serveur.
- Rotation. Vous renouvelez vous-même une clé live dans le tableau de bord partenaire (voir « Gérer vos clés » ci-dessous) : la nouvelle clé est affichée une fois, l'ancienne continue de fonctionner 7 jours avec le message
key_rotation_pending, puis répond403 key_revoked. - Liste d'adresses IP autorisées. En option, la clé peut être limitée aux adresses IP de vos serveurs (
403 ip_not_allowedpour toute autre adresse). - Fuite ou soupçon d'abus : renouvelez ou révoquez la clé vous-même sans attendre dans le tableau de bord et signalez-le dans les 48 heures ; Taxon révoque alors immédiatement l'ancienne clé si nécessaire.
Gérer vos clés 2.3.0
Depuis le 08-09-2026, vous gérez vos clés vous-même dans le tableau de bord partenaire sur taxon.be (taxon.be/api_partner, section « Gestion »). Chaque action y est journalisée (qui, quand, depuis quelle adresse IP) et signalée à Taxon ; la valeur d'une clé n'apparaît jamais dans un journal ni dans un e-mail.
| Action | Fonctionnement |
|---|---|
| Afficher une clé une seule fois | Une nouvelle clé n'est pas envoyée par e-mail. Le tableau de bord l'affiche exactement une fois (« Afficher la clé une seule fois »), dans les 7 jours suivant sa création ; copiez-la aussitôt dans votre coffre à secrets. Jusqu'à ce moment, Taxon n'en conserve qu'une copie chiffrée : après le premier affichage, ou après 7 jours, la copie est détruite et la clé ne peut plus être affichée. Les clés délivrées avant le 08-09-2026 ne peuvent pas être affichées ; demandez-en une nouvelle ou créez-en une vous-même. |
| Clés de test | Créez-les vous-même (« Créer une clé de test », avec un libellé), au plus 3 clés de test actives ; révoquez-les vous-même (« Révoquer » : la clé cesse immédiatement de fonctionner, 401 invalid_api_key). |
| Première clé live | Délivrée par Taxon après la signature de la convention, prête à être affichée une fois dans votre tableau de bord. Vous ne pouvez pas créer vous-même une première clé live (live_key_not_allowed) ; le formulaire « Demander une clé live » du tableau de bord envoie un e-mail à Taxon. |
| Renouveler une clé live | « Renouveler la clé live » crée une nouvelle clé live (affichez-la une fois, mettez-la en production). La clé live précédente continue de fonctionner pendant 7 jours ; durant cette période, chaque réponse de /address et de /usage obtenue avec l'ancienne clé porte le message key_rotation_pending (section: null, message avec la date de fin). Après 7 jours, l'ancienne clé est refusée (403 key_revoked, ensuite 401 invalid_api_key). Une clé live n'est jamais révoquée depuis le tableau de bord : renouvelez-la, ou demandez à Taxon de la révoquer immédiatement. |
| Fuite ou soupçon d'abus | Renouvelez (live) ou révoquez (test) immédiatement et prévenez info@taxon.be si l'ancienne clé doit cesser sur-le-champ plutôt qu'après 7 jours. |
Codes d'erreur des actions du tableau de bord (affichés en texte dans le tableau de bord, jamais sur /address ni /usage) : key_already_revealed, reveal_expired, not_revealable, key_limit_reached, live_key_not_allowed, not_self_revocable.
3.En-têtes
| En-tête | Statut | Signification |
|---|---|---|
X-Api-Key | obligatoire | Votre clé partenaire (voir 2). |
X-User-Ref | obligatoire | Votre propre identifiant de l'utilisateur pour lequel la requête est faite. Un utilisateur est l'unité que vous transmettez vous-même à chaque requête : une agence, un collaborateur, une succursale ou un gestionnaire de dossier. Ce choix détermine la facturation : le même utilisateur qui redemande le même bien dans les 30 jours ne paie pas une seconde fois (dédoublonnage) ; un autre utilisateur, oui. Un plafond journalier s'applique par utilisateur, un plafond global par clé. Jeu de caractères ^[A-Za-z0-9._:@-]{1,64}$ ; normalisé (espaces supprimés, minuscules : [a-z0-9._:@-]{1,64}) ; les caractères invalides donnent 400 invalid_request avec details[].field = "X-User-Ref". billing.user_ref renvoie la valeur normalisée. Gardez-le stable par utilisateur : la répétition gratuite (dédoublonnage), le plafond journalier par utilisateur (20 par jour) et le relevé de consommation par utilisateur reposent tous sur lui. S'il manque : 400 user_ref_required. |
X-Gebruiker-RefX-Kantoor-Ref | obsolète | Alias de X-User-Ref issus des contrats 1.1/1.2 et 1.0. Même jeu de caractères et même normalisation. Si deux de ces en-têtes ou plus sont envoyés avec des valeurs différentes (après normalisation) : 400 user_ref_conflict (le details[].issue nomme les en-têtes concernés). N'utilisez que X-User-Ref dans tout nouveau code. |
X-Case-Ref | optionnel | Votre numéro de dossier, jeu de caractères ^[A-Za-z0-9._:@/ -]{1,64}$. Renvoyé dans billing.case_ref et dans le CSV de consommation, pour relier chaque requête à un dossier (techniquement optionnel : sans lui, la requête est acceptée et billing.case_ref vaut null ; contractuellement obligatoire : chaque requête appartient à un dossier d'expertise concret, envoyez-le donc toujours). L'alias X-Dossier-Ref (contrat 1.x) est encore accepté ; X-Case-Ref l'emporte si les deux sont envoyés. |
Idempotency-Key | optionnel | Clé unique par requête (par exemple un UUID), 8 à 128 caractères (A-Z a-z 0-9 . _ : @ -). Seul cet en-tête compte : X-Request-ID est réécrit par nginx et n'est pas une clé d'idempotence. La même clé dans les 24 heures renvoie exactement la même réponse, avec l'en-tête de réponse X-Idempotent-Replay: true, sans nouvelle facturation ni nouveau comptage. La même clé avec une autre adresse, un autre utilisateur ou d'autres sections : 409 idempotency_conflict. À utiliser pour toute nouvelle tentative après un délai dépassé. |
Accept-Language | optionnel | nl (par défaut), fr ou en. Détermine la langue des libellés (*_label, condition d'un point de référence, confidence.label), des messages, des messages d'erreur, de la mention de la source et de la clause de non-responsabilité, ainsi que du nom de la commune (Flandre en néerlandais ; Wallonie en français ; Bruxelles en néerlandais pour nl, en français pour fr et en). Les clés JSON et les valeurs d'énumération sont toujours en anglais. |
Chaque réponse (y compris une erreur) contient l'en-tête X-Request-ID et le champ request_id. Mentionnez-le dans toute demande de support.
4.GET /address
Fournit les sections demandées pour une adresse en Flandre, en Wallonie ou à Bruxelles. Traitement : validation, contrôle des plafonds, géocodage, contrôle de dédoublonnage, récupération parallèle des sections, facturation, réponse. Temps de réponse typique de 1 à 8 secondes (AVM et parcelle sont les plus lentes ; plusieurs parcelles : 3 à 12 secondes) ; réglez le délai d'attente de votre client à 60 secondes au minimum.
Paramètres de requête
| Paramètre | Statut | Signification |
|---|---|---|
address | obligatoire | Adresse complète : rue, numéro, code postal, commune. 8 à 255 caractères. À encoder en URL. |
type | obligatoire | house, apartment ou land (2.5.0). Pilote la sélection des points de référence et l'AVM. Les alias huis, appartement, grond, terrain et bouwgrond sont acceptés ; la réponse affiche toujours la valeur anglaise. land = terrain à bâtir : les points de référence sont des annonces de terrains à vendre (5 km, étendu à 10 km s'il y en a moins de 10), neighbourhood.land_price_level remplace les statistiques de logements, pas d'AVM (voir Terrains). |
sections | optionnel | basic (par défaut) = le pack de base : fournit ensemble les sections basic, parcel et price_map, un prix par dossier. basic,avm = pack de base plus l'option AVM (tarifée séparément). Demander parcel ou price_map séparément (ou basic,parcel) reste techniquement possible mais est normalisé vers le pack et facturé comme le pack ; il n'existe pas de voie partielle moins chère. Les alias néerlandais basis et prijskaart restent acceptés. Une section hors de votre plan donne 403 section_not_allowed (avec section) ; un nom inconnu donne 400 invalid_request. Votre plan est visible dans GET /usage (plan.sections_allowed). sections_delivered liste toujours les sections réellement fournies (basic, parcel, avm, price_map, dans cet ordre). |
living_area_m2 | optionnel | Surface habitable en m² (10 à 5000). Nécessaire pour avm : si elle manque, la réponse reste HTTP 200, mais avm est absente de sections_delivered, un message living_area_required avec section: "avm" est ajouté et la section AVM n'est pas facturée. Inutile pour type=land (pas d'AVM pour un terrain ; voir Terrains). |
year_built | optionnel | Année de construction (1500 à 2100). Améliore l'AVM. |
epc | optionnel | Label A+ à G, tel que communiqué par le donneur d'ordre ou tel qu'annoncé. Taxon ne consulte aucun certificat PEB et ne vérifie pas le label dans un registre. |
condition | optionnel | poor, average, good, very_good, excellent. Entrée de l'AVM (prime entre -5 % et +3 %). Alias te_renoveren, matig, goed, zeer_goed, nieuw acceptés. |
bedrooms | optionnel | Nombre de chambres (0 à 20). Filtre les points de référence à plus ou moins 1 chambre (s'il en reste moins de 8, le filtre est abandonné avec le message bedrooms_filter_dropped ; voir bedrooms_filter sur le bloc) et est transmis à l'AVM. |
plot_area_m2 | optionnel | Superficie du terrain en m² selon vous (1 à 100000). Valeur de repli pour l'AVM si le cadastre ne donne rien, ou si vous n'indiquez pas de capakeys mais connaissez le total. Avec capakeys, le cadastre l'emporte toujours. Si votre valeur est effectivement utilisée, le message plot_area_not_cadastral suit et avm.inputs_used.plot_area_source vaut partner. |
capakeys | optionnel | Plusieurs parcelles par bien. Clés cadastrales (CaPaKeys) séparées par des virgules de toutes les parcelles qui appartiennent au bien (parcelle bâtie, jardin, garage, prairie), au format CadGIS 33016A0299/00K000 (la forme avec tiret 33016A0299-00K000 est acceptée et normalisée). Maximum 10 ; la section parcel fait partie du pack de base, aucune section supplémentaire n'est donc nécessaire (400 invalid_request uniquement lorsque votre plan n'autorise pas la section parcel). La section parcel fournit alors parcels[] avec les totaux et l'AVM utilise la superficie totale du terrain. Erreurs : 422 capakey_invalid (format ou plus de 10), 422 capakey_too_far (une parcelle à plus de 2 km de l'adresse, frein anti-abus). Une parcelle inexistante ne donne qu'un message capakey_not_found ; le reste est fourni. Voir le flux. |
Exemple de requête
GET /api/v1/partner/address?address=Doorniksestraat%2040%2C%208500%20Kortrijk§ions=basic,avm&type=apartment&living_area_m2=95 HTTP/1.1
Host: taxonapi.be
X-Api-Key: tx_live_<32 hex>
X-User-Ref: office-kortrijk-03
X-Case-Ref: DOS-2026-0452
Idempotency-Key: 2c6a8b1e-3f4d-4a5b-9c7e-1d2f3a4b5c6d
Accept-Language: en
Exemple de réponse (200)
Réponse réelle du 08-09-2026 (clé live, utilisateur office-kortrijk-03, requête cf514c7de2714c11806e2ebf053d0247), abrégée à un point de référence par bloc et trois équipements ; le bloc price_map (partie du pack de base) est omis ici, voir la section 5. Avec une clé live, environment vaut live, charged vaut true et free_reason vaut null ; les montants de billing.price sont ceux de la convention du client utilisé pour la capture, les vôtres suivent votre propre convention. Avec une clé de test, environment vaut test, charged vaut false, free_reason vaut test et chaque montant vaut 0.00.
{
"request_id": "cf514c7de2714c11806e2ebf053d0247",
"environment": "live",
"address": {
"input": "Doorniksestraat 40, 8500 Kortrijk",
"normalized": "Doorniksestraat 40, 8500 Kortrijk",
"box": null,
"postal_code": "8500",
"municipality": "Kortrijk",
"lat": 50.82541,
"lon": 3.267149,
"region": "VL",
"nis_code": "34022",
"geocoder": "geo.api.vlaanderen.be",
"geocode_score": 0.95,
"precision": "house_number"
},
"sections_delivered": ["basic", "parcel", "avm", "price_map"],
"basic": {
"comparables": [
{
"type": "apartment",
"type_label": "apartment",
"transaction": "sale",
"transaction_label": "for sale",
"address_mode": "house_number",
"radius_m": 1000,
"count": 25,
"excluded_subject_property": 0,
"max_age_months": 24,
"items": [
{
"ref": "r_1a30b3b90e",
"address": "Schouwburgplein 10, 8500 Kortrijk",
"distance_m": 157,
"type": "apartment",
"transaction": "sale",
"price": 250000,
"price_kind": "asking_price",
"price_kind_label": "asking price",
"price_per_m2": 2427,
"living_area_m2": 103,
"plot_area_m2": null,
"bedrooms": 2,
"epc_label": "B",
"epc_kwh_m2": 108.0,
"epc_source": "as advertised",
"year_built": 1980,
"condition": "good condition",
"building_type": "terraced",
"new_build": false,
"published": "2026-07-16",
"days_online": 12,
"last_seen": "2026-07-28",
"status": "offline",
"status_label": "offline",
"source": "listing",
"source_label": "listing",
"features": {
"garage": true,
"parking_spaces": 1,
"terrace": true,
"terrace_m2": null,
"garden": null,
"garden_m2": null,
"cellar": true,
"attic": null,
"floor": 2,
"floors_count": 5,
"elevator": false,
"kitchen": "semi_equipped",
"bathrooms": 1,
"shower_rooms": null,
"toilets": 1,
"heating": "gas",
"solar_panels": false,
"double_glazing": true,
"orientation_garden": null,
"renovation_year": null,
"inspections": {"electrical_compliant": null, "asbestos_certificate": null, "oil_tank": null},
"flood_zone": "none"
},
"summary": "Apartment on the 2nd floor of 103 m² with garage, terrace and cellar, 2 bedrooms, EPC B, built in 1980.",
"thumbnail": {"url": "https://taxonapi.be/api/v1/marketexplorer/foto/<token>?w=160", "valid_until": "2026-09-08T09:39:16Z"},
"photo_count": 12,
"history": [
{"date": "2026-04-29", "price": 250000, "event": "published", "label": "published"},
{"date": "2026-07-28", "price": null, "event": "offline", "label": "offline"}
],
"photos": [
{"url": "https://taxonapi.be/api/v1/marketexplorer/foto/<token>?w=640", "download_token": "b71c6e8f1c51a562f33d", "valid_until": "2026-09-08T09:39:16Z"},
{"url": "https://taxonapi.be/api/v1/marketexplorer/foto/<token>?w=640", "download_token": "4bdfcfbd9ea0c282e886", "valid_until": "2026-09-08T09:39:16Z"}
]
}
]
},
{
"type": "apartment",
"type_label": "apartment",
"transaction": "rent",
"transaction_label": "for rent",
"address_mode": "house_number",
"radius_m": 1000,
"count": 25,
"excluded_subject_property": 0,
"max_age_months": 24,
"items": ["…"]
}
],
"neighbourhood": {
"sector": {"code": "34022A00-", "name": "KORTRIJK-CENTRUM", "level": "sector", "municipality": "Kortrijk"},
"building_stock": {
"level": "sector",
"reference_date": "2026-01-01",
"total": 2882,
"distribution": [
{"category": "residential", "label": "Residential", "count": 1908, "pct": 66.2},
{"category": "commerce_services", "label": "Commerce & services", "count": 383, "pct": 13.3},
{"category": "industry", "label": "Industry", "count": 7, "pct": 0.2},
{"category": "agriculture", "label": "Agriculture", "count": 0, "pct": 0.0},
{"category": "other", "label": "Other", "count": 584, "pct": 20.3}
],
"source": "FPS Finance - open patrimonial data"
},
"price_level": {
"type": "apartment",
"radius_m": 2000,
"sale_per_m2": {"n": 430, "p25": 2260.25, "median": 2856.5, "p75": 3747.0},
"rent_per_m2_year": {"n": 346, "p25": 89.12, "median": 105.85, "p75": 126.7},
"gross_yield_pct": 3.71,
"gross_yield_p25_p75": [3.12, 4.44],
"price_kind": "asking_price"
},
"epc_prices": {
"type": "apartment",
"radius_m": 5000,
"labels": {
"B": {"median_per_m2": 2578.1, "count": 132},
"C": {"median_per_m2": 2441.6, "count": 56},
"A": {"median_per_m2": 3849.2, "count": 83},
"D": {"median_per_m2": 2208.5, "count": 16},
"F": {"median_per_m2": 1645.3, "count": 10},
"A+": {"median_per_m2": 5432.6, "count": 6},
"E": {"median_per_m2": 2521.7, "count": 4}
},
"price_kind": "asking_price"
},
"safety": {
"level": "municipality",
"municipality": "Kortrijk",
"year": 2025,
"burglaries_per_1000": 2.7,
"crimes_per_1000": 89.0,
"region_burglaries_per_1000": 2.1,
"region_crimes_per_1000": 63.3,
"years": [
{"year": 2025, "burglaries_per_1000": 2.7, "crimes_per_1000": 89.0},
{"year": 2024, "burglaries_per_1000": 3.2, "crimes_per_1000": 100.1},
{"year": 2023, "burglaries_per_1000": 3.3, "crimes_per_1000": 101.9}
],
"source": "Federal Police - Police Crime Statistics (PCS)"
}
},
"amenities": {
"score": 9.3,
"scale": "0-10",
"radius_m": 1000,
"sub_scores": {
"public_transport": {"score": 9.2, "label": "Public transport", "count": 17},
"healthcare": {"score": 9.2, "label": "Healthcare", "count": 7},
"shops": {"score": 9.8, "label": "Shops and catering", "count": 87},
"sport_culture": {"score": 9.3, "label": "Sport and culture", "count": 12},
"education": {"score": 8.9, "label": "Education", "count": 9}
},
"poi_count": 158,
"top_10": [
{"name": "Muskat Pureebar", "type": "shops", "type_label": "Shops and catering", "distance_m": 52},
{"name": "KBC", "type": "shops", "type_label": "Shops and catering", "distance_m": 66},
{"name": "Vork", "type": "shops", "type_label": "Shops and catering", "distance_m": 79}
],
"attribution": "© OpenStreetMap contributors (ODbL)"
}
},
"parcel": {
"capakey": "34022G0494/00E000",
"region": "VL",
"area_m2": 259.14,
"cadastral_area_m2": 259.14,
"width_m": 4.79,
"depth_m": 53.61,
"frontage_m": 7.31,
"built_area_m2": 164.1,
"buildings_count": 2,
"garden_orientation": "SW",
"garden_orientation_deg": 247,
"zoning": {"category": "residential", "label": "woongebieden", "plan": "gewestplan"},
"preemption_right": {"status": "none", "source": "RVV thematic layer, right of pre-emption (Flanders)"},
"source": "CadGIS (FPS Finance) / GRB Gbg - building at ground level (Digitaal Vlaanderen)",
"main_parcel": "34022G0494/00E000",
"parcels": [
{
"capakey": "34022G0494/00E000",
"area_m2": 259.14,
"cadastral_area_m2": 259.14,
"width_m": 4.79,
"depth_m": 53.61,
"built_area_m2": 164.1,
"buildings_count": 2,
"zoning": {"category": "residential", "label": "woongebieden", "plan": "gewestplan"},
"preemption_right": {"status": "none", "source": "RVV thematic layer, right of pre-emption (Flanders)"},
"source": "CadGIS (FPS Finance) / GRB Gbg - building at ground level (Digitaal Vlaanderen)",
"is_main": true,
"distance_to_address_m": 0
}
],
"parcels_count": 1,
"total_area_m2": 259.14,
"cadastral_total_area_m2": 259.14,
"zoning_combined": {"category": "residential", "label": "woongebieden", "plan": "gewestplan"},
"preemption_right_combined": {"status": "none", "parcels": []},
"parcels_not_found": [],
"plot_area_source": "cadastre_main_parcel",
"parcel_candidates": [
{"capakey": "34022G0495/00C000", "area_m2": 370.75, "direction": "S", "built": true, "distance_m": 7},
{"capakey": "34022G0493/00L000", "area_m2": 1224.37, "direction": "W", "built": true, "distance_m": 12},
{"capakey": "34022G0490/00C000", "area_m2": 249.56, "direction": "W", "built": true, "distance_m": 32}
],
"parcel_candidates_source": "CadGIS (FPS Finance), adjacent within 0.5 m; built-up via the regional buildings layer",
"parcel_candidates_remark": null
},
"avm": {
"value": 243995,
"range": [190804, 312014],
"range_90": [162820, 365641],
"rental_value": 885,
"rental_value_range": [859, 954],
"confidence": {"score": 72.7, "label": "low", "fsd_pct": 24.59},
"comparables_count": 19,
"comparables_count_500m": 19,
"comparables_count_1km": 19,
"inputs_used": {
"type": "apartment",
"living_area_m2": 95.0,
"year_built": null,
"epc_label": null,
"condition": null,
"bedrooms": null,
"plot_area_m2": null,
"plot_area_source": null
},
"price_basis": "asking_price_model",
"model": "taxon-avm v3.1"
},
"billing": {
"user_ref": "office-kortrijk-03",
"case_ref": "DOS-2026-0452",
"charged": true,
"pilot": false,
"free_reason": null,
"price": {"package": 3.0, "avm": 2.0, "total": 5.0, "currency": "EUR", "excl_vat": true},
"dedup_of": null,
"dedup_valid_until": "2026-10-08T10:39:24+02:00",
"month": "2026-09",
"month_to_date": {"cases": 3, "amount": 10.0},
"pilot_status": null,
"today": {"client_today": 13, "user_today": 1}
},
"notices": [],
"upstream_errors": {},
"attribution": "References: Taxon (taxon.be)",
"disclaimer": "Asking prices from listings, not notarial sale prices. Data for internal use per case only; building a derived database is prohibited. The valuer decides, the AVM is a support tool.",
"generated_at": "2026-09-08T10:39:24+02:00"
}
sections_delivered, la raison figure dans upstream_errors (clé par section ou sous-bloc : parcel, avm, price_map, basic.comparables, basic.neighbourhood, basic.amenities, neighbourhood.building_stock, neighbourhood.safety, neighbourhood.price_level, neighbourhood.epc_prices ; valeur timeout ou upstream_error), un message section_missing est ajouté. La facturation suit le pack : le pack de base est facturé une fois par dossier dès que la section basic est fournie, aussi lorsque parcel ou price_map manque à cause d'une panne (une répétition dans la fenêtre de dédoublonnage est gratuite et reconstruit la section manquante) ; l'option AVM n'est facturée que lorsqu'elle est fournie. Pour price_map, la valeur no_coverage (avec le message price_map_unavailable) signifie qu'aucun quartier avec des prix ne se trouve dans un rayon de 3 km : pas une panne, le pack reste facturé. Un sous-bloc en échec dans basic vaut null ; basic reste fournie. Zéro point de référence (message no_comparables) : pack non facturé (free_reason: no_result), sauf disposition contraire de votre plan. La réponse reste HTTP 200 tant que la section basic est fournie. Si la section basic échoue elle-même : 502 upstream_unavailable, rien n'est facturé.
5.Sections
Pack de base et option AVM (2.4.0). Les sections basic, parcel et price_map forment un seul pack de base par dossier : sections=basic fournit les trois ensemble à un seul prix (billing.price.package). L'AVM est une option distincte (sections=basic,avm, billing.price.avm). sections_delivered continue de lister les sections réelles.
basic (pack de base, toujours)
- Points de référence (
comparables) : une liste de blocs par type et transaction (saleetrent; avectypeindiqué, 2 blocs au maximum), chacun avec au plus 25 biens comparables, publiés dans les 24 mois, dans un rayon adaptatif (1 000 m pour les appartements, 1 500 m pour les maisons, doublé jusqu'à 15 km tant que moins de 5 biens sont trouvés). Par bien : prix demandé, prix au m², surfaces, chambres, année de construction, état, type de bâti (detached,semi_detached,terraced,apartment), neuf ou non, label et indice PEB tels qu'annoncés (epc_source), date de publication, jours en ligne, dernière observation, statut en ligne/hors ligne et l'historique complet des prix (published,price_drop,price_increase,republished,offline). Le champaddressest la rue + le numéro sans boîte, ou la rue et la commune seulement, selon votre convention (champaddress_modepar bloc :house_numberoustreet) ; les points de référence ne contiennent jamais de coordonnées, uniquementdistance_m. Ni nom de portail, ni lien, ni texte d'annonce. Avectype=landil y a un seul bloc (saleuniquement, pas de bloc location), voir Terrains. - Photos (
photos) : par bien, au plus 5 objets{url, download_token, valid_until}, photo principale (façade) en premier.urlest une URL signée (capability URL) sur taxonapi.be (vignette serveur de 640 px au plus :w160, 320 ou 640, autres valeurs arrondies vers le haut et plafonnées à 640, sanswaussi 640 px ; l'original n'est jamais servi), valable 1 heure (lors d'une demande répétée, dédoublonnage ou Idempotency-Key, les liens photo sont renouvelés : nouveauxurletvalid_until, mêmedownload_token), utilisable directement dans un<img>sans clé : ne pas l'analyser, ne pas la reconstruire, la charger dans l'heure. Après expiration ou en cas de manipulation, elle répond404(invalid_or_expired_token).download_tokenest un identifiant opaque stable pour votre propre comptabilité, pas pour récupérer quoi que ce soit. Intégration dans le rapport du dossier : voir 11. - Caractéristiques, résumé et vignette (
features,summary,thumbnail,photo_count, depuis 2.2.0) : chaque point de référence porte un objetfeaturesavec les caractéristiques structurées de l'annonce (garage,parking_spaces,terraceetterrace_m2,gardenetgarden_m2,cellar,attic,floor(appartements),floors_count,elevator,kitchen: not_equipped|semi_equipped|equipped|fully_equipped,bathrooms,shower_rooms,toilets,heating: gas|oil|electric|heat_pump|wood|district|other,solar_panels,double_glazing,orientation_garden: N|NE|E|SE|S|SW|W|NW,renovation_year,inspections {electrical_compliant, asbestos_certificate, oil_tank},flood_zone: none|possible|effective). Chaque clé est toujours présente ;nullsignifie inconnu, la couverture dépend donc de l'annonce.summaryest une phrase dans les mots de Taxon, construite uniquement à partir de ces champs, dans la langue deAccept-Language; les textes d'annonce ne sont jamais fournis.thumbnail {url, valid_until}est un lien signé vers la photo principale (façade) enw=160, valable 1 heure et renouvelé comme les autres liens photo ;photos[0]est la même photo en 640 px ;nullsans photos.photo_countest le nombre total de photos de l'annonce (photosreste limité à 5). - Statistiques de quartier (
neighbourhood) : secteur statistique, parc immobilier par catégorie (residential,commerce_services,industry,agriculture,other), niveau des prix demandés vente et location au m² (quartiles, indexés) avec rendement brut, prix médian par label PEB annoncé, et sécurité sous forme de chiffres policiers réels pour 1 000 habitants (cambriolages et total des infractions, 3 années, avec comparaison régionale) au niveau communal. Il n'existe pas de « score de sécurité ». Un sous-bloc en échec vautnullet figure dansupstream_errors. Avectype=land:price_leveletepc_pricesvalentnull(messagehousing_stats_not_available_for_land) etland_price_level{radius_m,count,price_per_m2_plot {p25, median, p75},price_kind: asking_price,max_age_months: 24} donne le niveau des prix demandés par m² de terrain d'après les annonces de terrains (2.5.0). - Équipements (
amenities) : score global 0-10, sous-scores avec libellé et nombre (public_transport,healthcare,shops,sport_culture,education), nombre d'équipements dans le rayon et les 10 plus proches (top_10: nom, type, distance). Attribution OpenStreetMap obligatoire.
parcel (pack de base)
- Clé cadastrale (CaPaKey) de la parcelle principale, superficie issue de la géométrie et superficie cadastrale, largeur et profondeur, largeur de façade, surface bâtie, nombre de bâtiments, orientation du jardin (abréviation dans la langue d'
Accept-Language, plus degrés ;nullpour les appartements). - Affectation (
category,label,plan) selon le plan de la région (voir tableau) et le droit de préemption (statusyes/none/unknown,source, éventuellement couverture et détails). Lelabeld'affectation est le texte du service régional (néerlandais pour VL, français pour WAL) ; il n'existe pas de traduction anglaise de ce texte. - Pas de géométrie, pas d'images ni de tuiles cartographiques : vous rendez les cartes avec votre propre licence cartographique à partir des coordonnées.
- Si le point se situe sur le domaine public,
parcelest absente avec le messageparcel_not_found(pas une panne ; le prix du pack de base ne change pas). - Plusieurs parcelles : voir ci-dessous.
- Pas de données d'inondation (voir tableau par région).
avm (option distincte)
- Valeur de marché estimée avec fourchette (68 %) et fourchette large (
range_90), loyer mensuel estimé avec fourchette, fiabilité (score 0-100, libellé élevée/moyenne/faible, dispersionfsd_pct), nombre de points de référence (total, à 500 m et à 1 km), données d'entrée utilisées et version du modèle. Toujoursprice_basis: "asking_price_model". - Nécessite
living_area_m2: sans surface, la section est omise avec le messageliving_area_required.year_built,epc,conditionetbedroomsaméliorent l'estimation. Données insuffisantes : messageavm_insufficient_data, section non fournie, l'option AVM n'est pas facturée. Non fournie pourtype=land(messageavm_not_available_for_land, non facturée ; 2.5.0). - Une sortie de modèle indicative, pas une expertise : l'expert décide. En Wallonie et à Bruxelles, toujours accompagnée du message
avm_indicative_not_regionally_calibrated.
price_map (pack de base) 2.0
- Niveau des prix demandés par quartier autour de l'adresse, avec les contours en GeoJSON pour que vous dessiniez la carte vous-même. Voir ci-dessous.
Source des données parcellaires (2.4.2). La section parcel lit le plan parcellaire cadastral actuel du SPF Finances (CadGIS PlanParcellaire, situation fiscale courante, aujourd'hui 01-01-2027). L'extrait annuel INSPIRE (01-01-2026) n'est plus que la solution de repli en cas de panne ou de réponse vide. Le champ fiscal_situation (sur parcel, sur chaque élément de parcels[] et sur chaque élément de parcel_candidates[]) donne la date ISO de la situation fiscale dont provient la parcelle ; source mentionne la couche. La date est la situation fiscale depuis laquelle la version actuelle de cette parcelle s'applique : une parcelle inchangée depuis des années porte une date plus ancienne (p. ex. 2019-01-01), alors que le plan dont elle est lue est toujours la situation fiscale courante. Une date plus ancienne ne signifie donc pas des données obsolètes ; seul 2026-01-01 combiné à un source INSPIRE indique le repli sur l'extrait annuel. Une parcelle divisée ou fusionnée après le dernier extrait (p. ex. 45043C0460/00R000 à Kluisbergen : une parcelle de 921 m² dans l'extrait, 460R 392 m² + 460X 529 m² dans le plan actuel) est donc livrée sous sa forme actuelle.
Plusieurs parcelles par bien : d'abord les candidates, puis les capakeys
Une maison mitoyenne avec un garage ou une parcelle de jardin séparés, une ferme avec des prairies, une villa sur deux parcelles cadastrales : la parcelle du point à l'adresse n'est alors qu'une partie du bien. L'API résout cela en deux étapes.
- Étape 1 : requête sans
capakeys. La section parcel contient la parcelle du point (main_parcel,parcels[]avec 1 élément) etparcel_candidates[]: les parcelles contiguës (au plus 12), chacune aveccapakey,area_m2cadastrale,directionpar rapport à la parcelle principale (toujoursN,E,SouW, indépendant de la langue),built(couche régionale des bâtiments ;nullsi cette couche n'était pas disponible) etdistance_mentre les centroïdes. Uniquement des données cadastrales de base, aucune donnée de propriétaire. Affichez cette liste à l'utilisateur (par exemple « 33011I0172/00G000, 40 m², sud, bâtie » = le garage) et laissez-le cocher ce qui appartient au bien. - Étape 2 : nouvelle requête avec
capakeys(la parcelle principale plus les parcelles cochées, séparées par des virgules, au plus 10). La section fournit alorsparcels[](par parcelle : capakey, superficie issue de la géométrie et du cadastre, largeur/profondeur, surface bâtie, nombre de bâtiments, affectation, droit de préemption,distance_to_address_m,is_main) et les totauxtotal_area_m2,cadastral_total_area_m2,zoning_combined(un objet si toutes les parcelles sont identiques, sinon une liste avecparcels[]par affectation),preemption_right_combined(yesdès qu'une parcelle tombe dans un périmètre, avec les capakeys concernées),main_parcel(la parcelle sur laquelle se trouve l'adresse, sinon la première, avec le messagemain_parcel_not_in_capakeys) etparcels_not_found[]. Les champs au niveau de la section restent ceux de la parcelle principale. L'AVM (type house) utilisetotal_area_m2;avm.inputs_used.plot_area_sourceindiquecadastre_main_parcel,cadastre_<n>_parcels(n = nombre de parcelles fournies, 2 à 10) oupartner; le champ de sectionparcel.plot_area_sourcene porte que les deux valeurs cadastre. Pour un appartement, aucune superficie de terrain n'est transmise au modèle (même aveccapakeys). - Dédoublonnage. Même utilisateur, même adresse : le pack de base fourni à l'étape 1 n'est pas refacturé (message
dedupavecsection: basic;billing.free_reasonne vautdedupque lorsque rien de nouveau n'est fourni, sinonnull(facturé),testoupilot), même si la section parcel est reconstruite avec les nouvelles parcelles. Si vous ajoutez l'option AVM à l'étape 2, vous ne payez que cette option. Les mêmescapakeysà nouveau dans les 30 jours = réponse issue du grand livre (from_cache: true). La mêmeIdempotency-Keyavec d'autrescapakeys=409 idempotency_conflict.parcel_candidates,parcel_candidates_sourceetparcel_candidates_remarksont toujours présents et valentnulllorsquecapakeysa été donné. Une analyse parcellaire à froid peut prendre jusqu'à 21 s ; surupstream_errors.parcel: timeout(messagesection_missing; le pack de base est facturé une fois, la répétition est gratuite dans la fenêtre de dédoublonnage), redemandez après quelques secondes avec une nouvelleIdempotency-Key. - Chemins d'erreur.
422 capakey_invalid(format erroné ou plus de 10 clés ;details[]nomme les parties erronées) ;422 capakey_too_far(une parcelle à plus de 2 km de l'adresse ; rien n'est fourni ni facturé). La section parcel fait partie du pack de base,capakeysne requiert donc aucune section supplémentaire. Une capakey qui n'existe pas dans le plan parcellaire : messagecapakey_not_found(section parcel) etparcels_not_found[]; les autres parcelles sont fournies. Si l'analyse parcellaire échoue pour une parcelle, seule sa superficie cadastrale compte (messageparcel_analysis_incomplete). - Charge. Limitez-vous aux parcelles du dossier. Chaque requête avec
capakeyseffectue une consultation du cadastre plus une analyse parcellaire par parcelle (jusqu'à 10) ; une ferme avec 3 parcelles prend 3 à 12 s.
Exemple complet avec des réponses réelles (Rijselstraat 62, Ieper) : guide d'intégration, section 3.
Terrains (type=land) 2.5.0
type=land (alias grond, terrain, bouwgrond) demande le paquet pour un terrain à bâtir. Ce qui change par rapport à une maison ou un appartement :
- Points de référence : un seul bloc (
type: land,transaction: sale, pas de bloc location) avec des annonces de terrains à vendre (terrains à bâtir, terrains à projet et terrains sans sous-type plus précis ; les terres agricoles, prairies, bois, vergers, terrains industriels et PME, emplacements de parking, garages et terrains récréatifs sont exclus sur la base du sous-type annoncé) de toutes les années de publication (2.5.1 : plus de limite d'âge, pour que vous puissiez actualiser les prix demandés des annonces plus anciennes selon l'évolution du marché dans le cadre du dossier (indexation des prix) ; les conditions de licence restent inchangées : pas de fusion, d'indexation ni de conservation entre dossiers), dans un rayon de 5 km autour de l'adresse ; s'il y en a moins de 10 au total, le rayon est étendu une fois à 10 km (radius_m). Classement : d'abord les annonces des 24 derniers mois (triées par distance), puis les plus anciennes (triées par distance), 25 au plus par bloc ; chaque élément porteage_months(mois civils entiers entrepublishedet aujourd'hui) et le champ de blocmax_age_monthsvautnullpour un terrain. Toujours moins de 10 : champ de bloclow_sample: trueet messagelow_sample(section basic). Chaque élément porte les champs habituels lorsqu'ils ont un sens (address,distance_m,price,price_kind,source,published,status,history,photos,thumbnail,photo_count) plusplot_area_m2etprice_per_m2_plot(prix demandé par m² de terrain) ; les champs de logement (living_area_m2,price_per_m2,bedrooms,epc_label,year_built,condition,building_type,new_build) valentnull.featuresse limite à{plot_area_m2, zoning, flood_zone, land_type}(zoningvaut actuellement toujoursnull: l'affectation d'une annonce n'est pas consultée ; celle de la parcelle du bien se trouve dansparcel.zoning;land_typevautbuilding_plot,project_landouotheret détermine le premier mot desummary: « Terrain à bâtir », « Terrain à projet » ou « Terrain »).summarydonne par exemple « Terrain à bâtir de 694 m² à Kluisbergen, proposé depuis le 10-09-2026. » - Quartier :
land_price_level(voir ci-dessus) à partir des mêmes annonces de terrains (mêmes exclusions) des 24 derniers mois ; un niveau de prix doit être actuel : avec moins de 10 annonces utilisables dans les 24 mois, la fenêtre est élargie à 60 mois etmax_age_monthsindique la fenêtre utilisée (24 ou 60 ; 2.5.1) ; seules les annonces avec une superficie et un prix demandé entre 15 et 5 000 EUR par m² de terrain entrent dans les quartiles (count), afin que les terres agricoles annoncées comme constructibles et les superficies fictives ne faussent pas le niveau (les éléments hors de cette bande restent dans la liste avec leur propreprice_per_m2_plot) ;price_leveletepc_pricesvalentnullavec le messagehousing_stats_not_available_for_land;building_stock,safetyetamenitiescomme d'habitude. - Pas d'AVM : Taxon ne fournit ni évaluation automatique ni valeur indicative du terrain.
sections=basic,avmreste HTTP 200 :avmvautnullet n'est pas danssections_delivered, message{code: avm_not_available_for_land, section: avm}, l'option AVM n'est pas facturée.living_area_m2peut être omis. - Parcelle et carte des prix : inchangées. La section parcelle (affectation, droit de préemption, plusieurs parcelles via
capakeys) est l'essentiel pour un terrain ;price_mapreste la carte des logements (prix demandés au m² des maisons et appartements par quartier), pas une carte des prix des terrains. - Facturation : le pack de base comme d'habitude (un prix par dossier, dédoublonnage 30 jours, pilote et clé de test comme pour les maisons) ; pas d'option AVM.
Couverture (15-09-2026, annonces des 24 derniers mois avec un prix ; au 16-09-2026, sur toutes les années de publication, environ 73 000 annonces de terrains, dont environ 38 200 dans les 24 mois) : Flandre environ 30 800 annonces de terrains, Wallonie environ 8 300, Bruxelles environ 330 ; environ 95 % portent une superficie. Certaines communes rurales wallonnes ont peu d'annonces de terrains (alors low_sample).
Exemple : réponse réelle du 15-09-2026 avec une clé de test (Accept-Language: en, requête f0c372798b3f285b66ab4b584819be57 ; champs 2.5.1 age_months et max_age_months: null ajoutés), raccourcie à un point de référence avec une photo, les champs principaux de la parcelle et les blocs de quartier qui changent pour un terrain ; building_stock, safety, amenities, parcels, parcel_candidates et price_map sont remplacés par "..." :
{
"request_id": "f0c372798b3f285b66ab4b584819be57",
"environment": "test",
"address": {
"input": "Buissestraat 17, 9690 Kluisbergen",
"normalized": "Buissestraat 17, 9690 Kluisbergen",
"box": null,
"postal_code": "9690",
"municipality": "Kluisbergen",
"lat": 50.76716,
"lon": 3.484313,
"region": "VL",
"nis_code": "45060",
"geocoder": "geo.api.vlaanderen.be",
"geocode_score": 0.95,
"precision": "house_number"
},
"sections_delivered": [
"basic",
"parcel",
"price_map"
],
"basic": {
"comparables": [
{
"type": "land",
"type_label": "land",
"transaction": "sale",
"transaction_label": "for sale",
"address_mode": "house_number",
"radius_m": 5000,
"count": 25,
"excluded_subject_property": 0,
"max_age_months": null,
"low_sample": false,
"items": [
{
"ref": "r_9965f5493e",
"address": "Buissestraat 19, 9690 Kluisbergen",
"distance_m": 25,
"type": "land",
"transaction": "sale",
"price": 80000,
"price_kind": "asking_price",
"price_kind_label": "asking price",
"price_per_m2": null,
"price_per_m2_plot": 115,
"living_area_m2": null,
"plot_area_m2": 694,
"bedrooms": null,
"epc_label": null,
"epc_kwh_m2": null,
"epc_source": null,
"year_built": null,
"condition": null,
"building_type": null,
"new_build": null,
"published": "2026-09-10",
"days_online": 4,
"last_seen": "2026-09-14",
"age_months": 0,
"status": "online",
"status_label": "online",
"source": "listing",
"source_label": "listing",
"features": {
"plot_area_m2": 694,
"zoning": null,
"flood_zone": null,
"land_type": "building_plot"
},
"summary": "Building plot of 694 m² in Kluisbergen, listed since 10-09-2026.",
"thumbnail": {
"url": "https://taxonapi.be/api/v1/marketexplorer/foto/fp_WzI3NDc1OTEsIjAxYTA0NzM2LTE5OGUtN2Q3ZC1iZjNjLWYyZDQ2NzliOTI3ZSIsMTc4OTQ2MzYyNiwicCJd.QB9ILrzzIwQxlyOV?w=160",
"valid_until": "2026-09-15T09:13:46Z"
},
"photo_count": 13,
"history": [
{
"date": "2026-08-28",
"price": 80000,
"event": "published",
"label": "published"
}
],
"photos": [
{
"url": "https://taxonapi.be/api/v1/marketexplorer/foto/fp_WzI3NDc1OTEsIjAxYTA0NzM2LTE5OGUtN2Q3ZC1iZjNjLWYyZDQ2NzliOTI3ZSIsMTc4OTQ2MzYyNiwicCJd.QB9ILrzzIwQxlyOV?w=640",
"download_token": "b17f02c8feb98b013e60",
"valid_until": "2026-09-15T09:13:46Z"
}
]
}
]
}
],
"neighbourhood": {
"sector": {
"code": "45060A010",
"name": "BUISESTRAAT",
"level": "sector",
"municipality": "Kluisbergen"
},
"building_stock": "...",
"price_level": null,
"epc_prices": null,
"safety": "...",
"land_price_level": {
"radius_m": 5000,
"count": 116,
"price_per_m2_plot": {
"p25": 126,
"median": 160,
"p75": 224
},
"price_kind": "asking_price",
"max_age_months": 24
}
},
"amenities": "..."
},
"parcel": {
"capakey": "45043C0460/00X000",
"region": "VL",
"area_m2": 528.79,
"cadastral_area_m2": 528.78,
"fiscal_situation": "2027-01-01",
"zoning": {
"category": "residential",
"label": "woongebieden",
"plan": "gewestplan"
},
"preemption_right": {
"status": "none",
"source": "RVV thematic layer, right of pre-emption (Flanders)"
},
"source": "CadGIS PlanParcellaire (FPS Finance) / GRB Gbg - building at ground level (Digitaal Vlaanderen)",
"main_parcel": "45043C0460/00X000",
"parcels_count": 1,
"total_area_m2": 528.79,
"plot_area_source": "cadastre_main_parcel",
"parcels": "...",
"parcel_candidates": "..."
},
"avm": null,
"price_map": "...",
"billing": {
"user_ref": "office-oudenaarde-02",
"case_ref": "DOS-2026-0518",
"charged": false,
"pilot": false,
"free_reason": "test",
"price": {
"package": 0.0,
"avm": 0.0,
"total": 0.0,
"currency": "EUR",
"excl_vat": true
},
"dedup_of": null,
"dedup_valid_until": "2026-10-15T10:13:47+02:00",
"month": "2026-09",
"month_to_date": {
"cases": 0,
"amount": 0.0
},
"pilot_status": {
"active": true,
"quota": 200,
"used": 0,
"remaining": 200,
"ends": "2026-11-03",
"expired": false
},
"today": {
"client_today": 10,
"user_today": 1
}
},
"notices": [
{
"code": "avm_not_available_for_land",
"section": "avm",
"message": "AVM not delivered: Taxon does not provide an automated valuation for land (type land); not charged."
},
{
"code": "housing_stats_not_available_for_land",
"section": "basic",
"message": "price_level and epc_prices are housing statistics and are not delivered for land; see neighbourhood.land_price_level."
},
{
"code": "price_map_sparse",
"section": "price_map",
"message": "price map: fewer than 30 listings in the subject neighbourhood (small sample)."
},
{
"code": "test_environment",
"section": null,
"message": "test key: not invoiced"
}
],
"upstream_errors": {},
"attribution": "References: Taxon (taxon.be)",
"disclaimer": "Asking prices from listings, not notarial sale prices. Data for internal use per case only; building a derived database is prohibited. The valuer decides, the AVM is a support tool.",
"generated_at": "2026-09-15T10:13:47+02:00"
}
Carte des prix (section price_map) 2.0
Niveaux des prix demandés par quartier dans un rayon de radius_m (3 000 m) autour de l'adresse, triés par distance, au plus 40 quartiers (le quartier du bien toujours inclus), fournis sous forme de données plus géométrie GeoJSON. Taxon ne fournit ni images ni tuiles cartographiques : vous dessinez les polygones vous-même avec votre propre bibliothèque et licence cartographiques (par exemple Leaflet, MapLibre ou Mapbox) et les colorez selon price_per_m2_house ou price_per_m2_apartment. Fait partie du pack de base depuis la 2.4.0 : pas de prix distinct (le prix du pack figure dans billing.price.package) ; le dédoublonnage suit le pack. Taille du bloc de 20 à 50 Ko ; réponse à chaud sous 0,5 s, la première requête après un redémarrage du service peut prendre jusqu'à 20 s. Mesuré en réel le 07-09-2026 : Braine-l'Alleud 40 quartiers, Ieper 38, Schaerbeek 40.
| Champ | Signification |
|---|---|
radius_m | Rayon autour de l'adresse, 3000. |
price_kind | Toujours asking_price. |
reference_period, updated_at | Date de référence de la couche de prix sur laquelle reposent les chiffres ("2026-03-30") et moment de la dernière reconstruction de cette couche (ISO 8601). |
subject_neighbourhood | id (chaîne) du quartier qui contient l'adresse : l'élément avec is_subject: true et distance_m: 0. |
neighbourhoods[] | Par quartier : id, name, municipality (dans la langue d'Accept-Language), postal_code, distance_m, is_subject, price_per_m2_house, price_per_m2_apartment (niveau de prix demandé au m² issu de la couche de prix Taxon de reference_period, null lorsque la couche n'a pas de chiffre), listings_count_house, listings_count_apartment (nombre d'annonces Taxon des 24 derniers mois dans ce quartier : une mesure de l'appui de l'offre actuelle sur le chiffre, pas l'échantillon derrière lui ; 0 = chiffre de la couche de référence sans annonce Taxon récente), low_sample (moins de 30 annonces de ce type : à présenter comme indicatif) et geometry (GeoJSON Polygon ou MultiPolygon, WGS84 lon/lat). |
source | Ligne de source, à afficher à côté de la carte (traduite ; indique toujours qu'il s'agit de prix demandés, pas de prix de vente notariés). |
Message price_map_sparse (section price_map) lorsque le quartier du bien lui-même compte moins de 30 annonces ; la section est tout de même fournie. Lorsqu'aucun quartier avec des prix ne se trouve dans un rayon de 3 km, la section vaut null, le message price_map_unavailable est ajouté, upstream_errors.price_map vaut no_coverage ; ce n'est pas une panne et le pack de base reste facturé. Ne conservez pas la géométrie au-delà du dossier (règles d'utilisation, section 11). Exemple réel : réponse réelle du 08-09-2026 (clé live, sections=basic, Grote Markt 34, 8900 Ieper, requête f5569dd2c231469abaa2536b1bc4dd61), 2 des 38 quartiers, géométrie du quartier du bien complète :
"price_map": {
"radius_m": 3000,
"price_kind": "asking_price",
"reference_period": "2026-03-30",
"updated_at": "2026-07-09T10:26:08+00:00",
"subject_neighbourhood": "7220",
"source": "Taxon asking prices (advertised prices, not notarial sale prices)",
"neighbourhoods": [
{
"id": "7220",
"name": "Ieper-Centrum",
"municipality": "Ieper",
"postal_code": "8900",
"distance_m": 0,
"is_subject": true,
"price_per_m2_house": 1937.91,
"price_per_m2_apartment": 2693.77,
"listings_count_house": 76,
"listings_count_apartment": 59,
"low_sample": false,
"geometry": {
"type": "Polygon",
"coordinates": [[[2.89239, 50.84819], [2.89082, 50.84804], [2.88999, 50.84756], [2.88856, 50.84716], [2.88727, 50.84885], [2.88559, 50.84838], [2.88386, 50.84823], [2.88343, 50.84899], [2.88207, 50.8487], [2.88188, 50.84888], [2.88017, 50.8484], [2.87996, 50.84875], [2.87954, 50.84865], [2.87908, 50.84969], [2.87869, 50.84955], [2.87772, 50.85146], [2.88352, 50.85238], [2.88367, 50.85225], [2.88646, 50.85268], [2.88857, 50.85268], [2.89005, 50.85297], [2.89134, 50.853], [2.89214, 50.85059], [2.89239, 50.84819]]]
}
},
{
"id": "7226",
"name": "Diksmuidse Poort",
"municipality": "Ieper",
"postal_code": "8900",
"distance_m": 121,
"is_subject": false,
"price_per_m2_house": 1991.52,
"price_per_m2_apartment": 2374.19,
"listings_count_house": 41,
"listings_count_apartment": 22,
"low_sample": false,
"geometry": {"type": "Polygon", "coordinates": ["…"]}
}
]
}
Par région
| Flandre (VL) | Wallonie (WAL) | Bruxelles (BXL) | |
|---|---|---|---|
| Géocodage | geo.api.vlaanderen.be, repli BeSt (fedservices.be) | BeSt (fedservices.be) | BeSt (fedservices.be) |
| Affectation (parcel) | Gewestplan ou RUP (plan: gewestplan | RUP) | Plan de secteur (plan: "plan de secteur") | GBP / PRAS (plan: "GBP/PRAS") |
| Source parcellaire | SPF Finances (CadGIS) + GRB | SPF Finances (CadGIS) + SPW (PICC) | SPF Finances (CadGIS) + UrbIS |
Nom de la commune (une seule règle pour address, les points de référence, neighbourhood.sector, neighbourhood.safety et price_map) | Néerlandais dans toutes les langues | Français dans toutes les langues, aussi pour nl (pas d'exonymes : Liège, Braine-l'Alleud) | Néerlandais pour nl, français pour fr et en |
| AVM | Entièrement calibrée | Message avm_indicative_not_regionally_calibrated : modèle pas encore calibré au niveau régional, fourchette plus large, vérification explicite par l'expert | Même message, idem |
| Données d'inondation, NON incluses | Pas d'obligation d'information sur la sensibilité aux inondations (fluviale/pluviale, réglementation 2023), pas de P-score/G-score | Pas d'aléa d'inondation (cartes SPW) | Pas de cartes d'inondation de Bruxelles Environnement |
Les données d'inondation arriveront dans une version ultérieure comme champ supplémentaire de la section parcel. D'ici là, l'expert consulte lui-même les données d'inondation auprès de la région ; l'API ne se prononce pas à ce sujet.
6.Dédoublonnage (répétition gratuite) et Idempotency-Key
La facturation se fait par utilisateur + bien. Le bien est déterminé par le géocodage (arrondi à environ 1 m), pas par l'orthographe littérale de l'adresse. Une requête facturée reste valable 30 jours pour le même utilisateur. Un bien est le point géocodé plus le numéro de boîte ; un autre type, d'autres paramètres AVM, d'autres capakeys ou une autre langue ne font pas un autre bien : une telle répétition est reconstruite avec la nouvelle entrée et reste gratuite pour les sections déjà fournies (le dédoublonnage ne fige rien).
| Situation | Résultat |
|---|---|
L'utilisateur A demande basic ; à nouveau le même jour ; une troisième fois deux jours plus tard (« trois clics ») | Une seule facturation. Les deuxième et troisième requêtes renvoient charged: false, dedup_of = request_id de la première, price.total = 0, free_reason: "dedup", from_cache: true (la réponse provient du grand livre de la première requête) et un message dedup avec section: null. |
L'utilisateur A avait demandé basic ; une semaine plus tard, il demande basic,avm pour le même bien | Seule la nouvelle option AVM est facturée (price.avm) ; le pack de base est à 0 (price.package) avec un message dedup pour section: basic (message : pack de base déjà fourni). La différence, rien de plus. |
L'utilisateur A avait demandé basic,avm ; une semaine plus tard à nouveau basic,avm | Entièrement gratuit jusqu'à dedup_valid_until (30 jours après la première facturation). free_reason vaut dedup dès que chaque section fournie l'avait déjà été pour cet utilisateur et ce bien (réponse du grand livre ou reconstruction, aussi avec une clé de test) ; sinon test, pilot ou null (facturé) avec des messages dedup par section. |
| L'utilisateur B demande le même bien une heure après l'utilisateur A | Nouvelle facturation : l'utilisateur A et l'utilisateur B sont deux dossiers (dedup_of: null). |
| L'utilisateur A demande le même bien après 31 jours | Nouvelle facturation ; une nouvelle période de 30 jours commence. |
Adresse introuvable, zéro point de référence (free_reason: no_result), section en échec, erreur au niveau de la requête | Non facturé, et la période de dédoublonnage ne démarre pas : la requête suivante pour le même bien par le même utilisateur est reconstruite et facturée normalement dès que des points de référence existent (une option AVM fournie avec le résultat vide garde bien sa propre fenêtre). |
Idempotency-Key est une protection technique pour les nouvelles tentatives : la même clé dans les 24 heures renvoie octet pour octet la même réponse (même request_id) sans comptage, y compris vis-à-vis du plafond journalier, reconnaissable à l'en-tête de réponse X-Idempotent-Replay: true. Utilisez un nouvel UUID par requête et ne le réutilisez qu'en cas de nouvelle tentative après un délai dépassé ou une erreur 5xx. Deux requêtes identiques simultanées sans clé sont également interceptées : une seule est facturée, l'autre reçoit dedup_of et un prix 0.
Attention au chien de garde : si un seul X-User-Ref porte une part anormalement élevée du trafic, ou si un utilisateur présente un schéma de balayage systématique (numéros de maison ou codes postaux consécutifs en peu de temps), cet utilisateur est suspendu (403 user_suspended) ; les autres utilisateurs continuent de fonctionner. La suspension frappe l'utilisateur, pas le client (votre clé) ; ce n'est qu'à partir de trois utilisateurs suspendus ou plus en 24 heures que suit 403 client_suspended. Utilisez donc toujours le véritable identifiant de l'utilisateur.
7.Plafonds et codes d'erreur
Plafonds
| Niveau | Valeur | En cas de dépassement |
|---|---|---|
| Par clé, par minute | 60 requêtes (rafale 20 : au plus 20 peuvent arriver d'un coup ; au-delà, 429 suit même sous 60 par minute) | 429 rate_limited + en-tête Retry-After (ainsi que retry_after dans le corps), ou la variante nginx 429 rate_limit_exceeded sans en-tête |
| Par clé, par jour | 300 requêtes (plafond global par clé) | 403 quota_exceeded avec scope: "day" et limit + en-tête Retry-After (secondes jusqu'à minuit, Europe/Brussels) |
| Par utilisateur, par jour | 20 requêtes | 403 quota_exceeded avec scope: "user_day", limit et user_ref + en-tête Retry-After ; les autres utilisateurs continuent de fonctionner |
| Par clé, par mois | Selon la convention | Notification aux deux parties ; blocage uniquement après concertation |
| Pilote | 200 dossiers dans les 60 jours suivant la signature | 403 pilot_exhausted (corps pilot{active, quota, used, remaining, ends, expired}) jusqu'à l'activation du contrat annuel |
| Balayage systématique par utilisateur | Chien de garde sur numéros de maison/codes postaux consécutifs, pics nocturnes, répartition anormale par utilisateur | 403 user_suspended avec user_ref, reason (raster_scan, handmatig (manuel) ou texte libre) et since, sans Retry-After ; seul cet utilisateur est suspendu, les autres continuent ; dédoublonnage et consommation inchangés ; pas d'expiration automatique ; levée uniquement par l'administration Taxon (info@taxon.be, en mentionnant user_ref). Trois utilisateurs suspendus ou plus en 24 heures : le client lui-même reçoit 403 client_suspended |
| Clé de test | 20 requêtes par jour (comptées, pour chaque plafond journalier : toutes les requêtes qui atteignent la recherche d'adresse, accès dédoublonnés et erreurs d'adresse 404/422 compris ; non comptés : 400, 401, 403, 405, 409, 422 capakey_invalid, 429, 503 et les rejeux par Idempotency-Key) | 403 quota_exceeded, scope: "day" |
| Protection contre la surcharge | Trop de paquets en cours sur le service | 503 overloaded + Retry-After, rien n'est facturé ni compté |
| Délai du paquet | 40 secondes | 504 timeout, rien n'est facturé |
Chaque réponse 200 indique le compteur du jour dans billing.today (client_today, user_today), pour voir venir un plafond. Les répétitions en dédoublonnage comptent aussi comme trafic.
Conseil pour les nouvelles tentatives. En cas de 429 : attendez le délai Retry-After (ou retry_after du corps si l'en-tête manque, variante nginx), puis réessayez avec la même Idempotency-Key. En cas de 502, 503, 504 ou 500 : maximum 3 tentatives avec attente exponentielle (2, 4, 8 s ; pour 503, la valeur de Retry-After), même Idempotency-Key. En cas de 403 quota_exceeded : attendez le délai Retry-After (jusqu'à minuit). Pour les autres 4xx : ne pas réessayer, la requête elle-même est erronée.
Codes d'erreur
Corps d'erreur uniforme : {"error": "...", "message": "...", "request_id": "...", "charged": false}, éventuellement complété par details[] ({field, issue}), retry_after, scope et limit, section, user_ref, reason, since ou pilot. message suit Accept-Language.
| HTTP | error | Quand | Ce que fait le client |
|---|---|---|---|
| 400 | invalid_request | Paramètre ou en-tête manquant ou invalide (y compris un X-User-Ref avec des caractères interdits, une section inconnue, un nom de paramètre 1.x, un paramètre envoyé deux fois) ; details[] indique le champ et le problème. | Corrigez la requête ; ne réessayez pas telle quelle. |
| 400 | user_ref_required | En-tête X-User-Ref manquant (et aucun alias). | Ajoutez l'en-tête utilisateur. |
| 400 | user_ref_conflict | Deux ou plus de X-User-Ref, X-Gebruiker-Ref, X-Kantoor-Ref envoyés avec des valeurs différentes (après normalisation). | N'envoyez qu'un seul en-tête, de préférence X-User-Ref. |
| 401 | missing_api_key | En-tête X-Api-Key manquant. | Erreur de configuration ; alertez votre équipe d'exploitation. |
| 401 | invalid_api_key | Clé inconnue. | Idem ; ne réessayez pas. |
| 403 | key_revoked | Clé révoquée (après rotation ou incident). | Passez à la nouvelle clé. |
| 403 | ip_not_allowed | Requête hors de la liste d'adresses IP autorisées. | Communiquez la nouvelle IP du serveur à Taxon. |
| 403 | client_suspended | Accès suspendu (schéma d'abus, défaut de paiement). | Contactez Taxon ; ne réessayez pas. |
| 403 | section_not_allowed | La section demandée ne fait pas partie de votre plan (section dans le corps). | Retirez la section ou étendez le plan. |
| 403 | quota_exceeded | Plafond journalier du partenaire (scope: "day") ou de l'utilisateur (scope: "user_day", avec user_ref) ; limit dans le corps. En-tête Retry-After et retry_after (secondes jusqu'à minuit). | Mettez en file d'attente jusqu'à Retry-After ; les autres utilisateurs continuent de fonctionner. |
| 403 | pilot_exhausted | Quota pilote de 200 dossiers atteint ou 60 jours écoulés ; pilot{} dans le corps. | Contactez Taxon (contrat annuel). |
| 403 | user_suspended | Utilisateur suspendu (balayage systématique ou manuellement) ; user_ref, reason et since dans le corps. Levée uniquement via l'administration Taxon (info@taxon.be). | Bloquez cet utilisateur dans votre interface ; ne réessayez pas. |
| 404 | address_not_found | Aucun géocodeur ne trouve l'adresse. Vérifiez le code postal et le numéro. | Laissez l'utilisateur corriger l'adresse. |
| 404 | not_found | Chemin inconnu sous /api/v1/partner/ (y compris les chemins 1.x /adres et /verbruik). | Corrigez le chemin. |
| 405 | method_not_allowed | Méthode autre que GET. | Utilisez GET. |
| 409 | idempotency_conflict | Même Idempotency-Key dans les 24 heures avec une autre adresse, un autre utilisateur, d'autres sections ou d'autres paramètres. | Utilisez une nouvelle clé. |
| 422 | address_imprecise | Adresse trouvée, mais pas au numéro près (rue ou commune seulement), ou sans code postal ni commune. | Laissez l'utilisateur ajouter le numéro. |
| 422 | type_unsupported | L'adresse trouvée ou le géocodeur ne prend pas en charge le type indiqué. | Changez le type. |
| 422 | capakey_invalid | capakeys au mauvais format ou plus de 10 (details[]). | Corrigez les capakeys. |
| 422 | capakey_too_far | Une parcelle se trouve à plus de 2 km de l'adresse ; rien n'est fourni. | Retirez cette parcelle. |
| 429 | rate_limited | Plafond par minute dans l'application. En-tête Retry-After et retry_after dans le corps. | Attendez Retry-After, réessayez avec la même Idempotency-Key. |
| 429 | rate_limit_exceeded | Plafond par minute dans nginx : corps {"error": "rate_limit_exceeded", "retry_after": 60}, sans en-tête Retry-After ni request_id. | Attendez le retry_after du corps, puis réessayez. |
| 502 | upstream_unavailable | La section basic n'a pas pu être fournie (base de données ou géocodeur inaccessible) ; details[] nomme le bloc et la raison. | Réessayez jusqu'à 3 fois avec attente exponentielle, même Idempotency-Key. |
| 503 | overloaded | Trop de paquets en cours ; Retry-After et retry_after. | Attendez Retry-After, puis réessayez. |
| 504 | timeout | Le paquet a pris plus de 40 secondes. | Réessayez avec la même Idempotency-Key. |
| 500 | internal_error | Erreur inattendue. | Réessayez une fois ; puis communiquez le request_id. |
Aucune erreur n'est jamais facturée (charged: false).
avm (living_area_required), une section en panne (section_missing) ou zéro point de référence (no_comparables) donnent HTTP 200 avec une ligne dans notices[] (code, section, message) ; la section concernée est alors absente de sections_delivered. La facturation suit le pack (voir 4) : une option AVM manquante n'est pas facturée, une parcel ou price_map manquante laisse le pack de base facturé, zéro point de référence laisse le pack non facturé (free_reason: no_result). Autres codes : dedup (section: basic = pack de base déjà fourni, section: avm = option AVM déjà fournie, section: null = réponse complète du grand livre), avm_indicative_not_regionally_calibrated (WAL/BXL), avm_type_unsupported, avm_insufficient_data, parcel_not_found, address_street_level, region_conflict, geocoder_partially_unavailable, subject_property_excluded (des annonces du bien à estimer lui-même ont été retirées des points de référence : même rue et même numéro dans un rayon de 300 m, avec la même boîte si vous en avez indiqué une ; le nombre figure dans excluded_subject_property sur le bloc), capakey_not_found, main_parcel_not_in_capakeys, parcel_analysis_incomplete, plot_area_not_cadastral, bedrooms_filter_dropped, price_map_sparse (section fournie), price_map_unavailable (pas de couverture dans un rayon de 3 km, section non fournie, pack inchangé), pilot_exhausted (uniquement pour un plan dont le dépassement de pilote est facturé), key_rotation_pending (la clé utilisée a été renouvelée et fonctionne encore jusqu'à la date indiquée dans le message ; aussi dans /usage), test_environment, info ; pour section_missing, le message vaut timeout ou upstream_error. Ignorez les codes inconnus.8.GET /usage
Votre propre consommation par mois civil : total, par utilisateur, par clé API (2.4.1), par jour, par section et un bloc qualité (taux d'erreur, latence p50/p95, nombre de requêtes avec pannes en amont). requests compte toutes les requêtes, cases celles en HTTP 200, charged celles avec un prix ; sections compte les unités facturées avec les clés package (pack de base) et avm (option AVM) ; sections_delivered (depuis la 2.4.0 aussi dans total) compte les quatre sections réelles basic, parcel, avm, price_map ; per_section utilise package et avm. Sert à vérifier vous-même ce que Taxon facture et à refacturer vos utilisateurs. X-User-Ref est ici optionnel et fait office de filtre. Le bloc plan montre votre plan sans prix : sections_allowed, max_per_minute, max_per_day, max_per_user_per_day, test_max_per_day, dedup_days, idempotency_hours, address_mode. requests compte les mêmes requêtes que les plafonds journaliers (voir 7).
| Paramètre | Signification |
|---|---|
month | YYYY-MM, par défaut le mois en cours (Europe/Brussels). |
format | json (par défaut) ou csv. |
user_ref | Filtre optionnel sur un utilisateur (équivalent à l'en-tête X-User-Ref, qui l'emporte si les deux sont indiqués), insensible à la casse. |
Les paramètres inconnus (y compris les noms 1.x maand, formaat, gebruiker_ref) donnent 400 invalid_request avec details[].field. Réponse réelle du 08-09-2026 (clé live, deux utilisateurs, deux clés, quatre requêtes ; le code client est remplacé par un espace réservé) :
GET /api/v1/partner/usage?month=2026-09 HTTP/1.1
X-Api-Key: tx_live_<32 hex>
{
"client": "<client code>",
"month": "2026-09",
"environment": "live",
"user_ref": null,
"total": {
"requests": 4,
"cases": 4,
"charged": 4,
"free_dedup": 0,
"free_pilot": 0,
"free_error": 0,
"sections": {"package": 3, "avm": 2},
"sections_delivered": {"basic": 4, "parcel": 4, "avm": 2, "price_map": 4},
"amount": 13.0,
"currency": "EUR",
"excl_vat": true,
"duration_ms_avg": 3531
},
"per_user": [
{
"user_ref": "office-kortrijk-03",
"requests": 2,
"cases": 2,
"charged": 2,
"free_dedup": 0,
"sections": {"package": 2, "avm": 1},
"sections_delivered": {"basic": 2, "parcel": 2, "avm": 1, "price_map": 2},
"amount": 8.0,
"last_activity": "2026-09-08T10:39:27+02:00"
},
{
"user_ref": "office-ieper-01",
"requests": 2,
"cases": 2,
"charged": 2,
"free_dedup": 0,
"sections": {"package": 1, "avm": 1},
"sections_delivered": {"basic": 2, "parcel": 2, "avm": 1, "price_map": 2},
"amount": 5.0,
"last_activity": "2026-09-08T10:39:16+02:00"
}
],
"per_day": [{"day": "2026-09-08", "requests": 4, "cases": 4, "charged": 4, "amount": 13.0}],
"per_section": {"package": {"delivered": 4, "charged": 3, "amount": 9.0}, "avm": {"delivered": 2, "charged": 2, "amount": 4.0}},
"quality": {"error_pct": 0.0, "latency_p50_ms": 3065, "latency_p95_ms": 7531, "upstream_errors": 0},
"pilot": null,
"generated_at": "2026-09-08T10:39:27+02:00",
"plan": {
"sections_allowed": ["basic", "parcel", "avm", "price_map"],
"max_per_minute": 30,
"max_per_day": 300,
"max_per_user_per_day": 80,
"test_max_per_day": 80,
"dedup_days": 30,
"idempotency_hours": 24,
"address_mode": null
},
"request_id": "c535faa3301644c1af51f3901fea7e2c"
}
Le bloc pilot (et billing.pilot_status) n'est que le compteur du pilote. Le statut du client dans le grand livre (pilote, actif, suspendu, terminé) n'est pas fourni dans la réponse ; une suspension se manifeste par 403 client_suspended ou 403 user_suspended. Avec une clé de production, sections et charged portent les nombres facturés et amount les montants selon votre convention.
Par clé API 2.4.1
Depuis la 2.4.1, la réponse porte aussi le bloc per_key (entre per_user et per_day) : la consommation par clé API, avec les mêmes filtres que le reste de la réponse (mois, l'environnement de la clé appelante, user_ref). Par clé : prefix (les 12 premiers caractères, comme dans votre liste de clés), label (null si vide), environment, active, revoked_at (null tant que la clé est active), requests, cases, charged, sections, sections_delivered, amount et last_activity ; triées par amount, puis requests, par ordre décroissant. Les clés sans requête dans le mois ne sont pas listées ; une clé révoquée avec des requêtes dans ce mois l'est (active: false, revoked_at renseigné). Les sommes sur per_key sont égales à total. Pour l'exemple ci-dessus (trois requêtes avec la clé live actuelle, une avec une clé live précédente révoquée depuis) :
"per_key": [
{
"prefix": "tx_live_3f9a",
"label": "production",
"environment": "live",
"active": true,
"revoked_at": null,
"requests": 3,
"cases": 3,
"charged": 3,
"sections": {"package": 2, "avm": 2},
"sections_delivered": {"basic": 3, "parcel": 3, "avm": 2, "price_map": 3},
"amount": 10.0,
"last_activity": "2026-09-08T10:39:27+02:00"
},
{
"prefix": "tx_live_b71c",
"label": "old key",
"environment": "live",
"active": false,
"revoked_at": "2026-09-08T10:39:20+02:00",
"requests": 1,
"cases": 1,
"charged": 1,
"sections": {"package": 1, "avm": 0},
"sections_delivered": {"basic": 1, "parcel": 1, "avm": 0, "price_map": 1},
"amount": 3.0,
"last_activity": "2026-09-08T10:39:15+02:00"
}
]
CSV
?format=csv fournit une ligne par requête, UTF-8 avec BOM, séparateur ;, chaque champ entre guillemets doubles, décimale , (s'ouvre directement dans Excel nl-BE/fr-BE), fins de ligne CRLF. Nom de fichier taxon-usage-<client>-<month>.csv (Content-Disposition). C'est la même liste que l'annexe de consommation jointe à la facture mensuelle. Les sections sont séparées par | ; charged vaut 0 ou 1. Lignes réelles du 08-09-2026 (les quatre requêtes de l'exemple de consommation ci-dessus, 16 colonnes depuis la 2.4.1) : la ligne 1 est le pack de base pour Grote Markt 34 Ieper, la ligne 2 l'option AVM ajoutée une seconde plus tard pour le même dossier (dedup_of = ligne 1, pack à 0), la ligne 3 l'exemple principal de la section 4, la ligne 4 une requête avec sections=parcel normalisée vers le pack :
"request_id";"timestamp";"user_ref";"case_ref";"address";"region";"sections_requested";"sections_delivered";"charged";"free_reason";"dedup_of";"price_package";"price_avm";"price_total";"status_code";"key_prefix"
"f5569dd2c231469abaa2536b1bc4dd61";"2026-09-08T10:39:15+02:00";"office-ieper-01";"DOS-2026-0451";"Grote Markt 34, 8900 Ieper";"VL";"basic|parcel|price_map";"basic|parcel|price_map";"1";"";"";"3,00";"0,00";"3,00";"200";"tx_live_b71c"
"76cddf8bb6fc4a299283f85aa2be799e";"2026-09-08T10:39:16+02:00";"office-ieper-01";"DOS-2026-0451";"Grote Markt 34, 8900 Ieper";"VL";"basic|parcel|avm|price_map";"basic|parcel|avm|price_map";"1";"";"f5569dd2c231469abaa2536b1bc4dd61";"0,00";"2,00";"2,00";"200";"tx_live_3f9a"
"cf514c7de2714c11806e2ebf053d0247";"2026-09-08T10:39:24+02:00";"office-kortrijk-03";"DOS-2026-0452";"Doorniksestraat 40, 8500 Kortrijk";"VL";"basic|parcel|avm|price_map";"basic|parcel|avm|price_map";"1";"";"";"3,00";"2,00";"5,00";"200";"tx_live_3f9a"
"3aa7ba378561487fad54fd5fbbe83f1e";"2026-09-08T10:39:27+02:00";"office-kortrijk-03";"";"Rijselstraat 20, 8900 Ieper";"VL";"basic|parcel|price_map";"basic|parcel|price_map";"1";"";"";"3,00";"0,00";"3,00";"200";"tx_live_3f9a"
free_reason est vide (facturé) ou vaut dedup, pilot, pilot_exhausted (ligne en statut 403 : la requête a reçu pilot_exhausted), test, no_result (zéro point de référence, ou une erreur d'adresse : lignes en statut 404 ou 422), error, timeout. price_package est le prix du pack de base (basic + parcel + price_map), price_avm celui de l'option AVM (colonnes depuis la 2.4.0 ; les trois anciennes colonnes de prix par section ont disparu). sections_requested est la liste normalisée : le pack écrit en toutes lettres, basic|parcel|price_map. key_prefix (dernière colonne, 2.4.1) est le préfixe de la clé API qui a fait la requête, comme dans per_key[].prefix.
9.GET /health
Public, sans clé, sans données. Adapté à votre monitoring. Les clés de cet endpoint sont volontairement conservées de la 1.x (noms néerlandais) : versie = version, tijd = heure, bundel = mode du paquet, db = base de données.
{"status": "ok", "service": "taxon-partner-api", "versie": "2.5.1", "tijd": "2026-09-16T10:47:16+02:00", "bundel": "live", "db": "ok"}
versie est la version du service (2.4.2 = contrat 2.0 plus la section price_map, les caractéristiques des points de référence, les corrections du premier test d'intégration externe, la gestion des clés par le partenaire, le pack de base et la consommation par clé), pas la version de ce contrat (2.0). bundel vaut live (sections réelles) ou stub (montage de test) ; db vaut ok ou fout (erreur). En cas d'erreur de base de données, l'endpoint répond HTTP 503 avec "status": "degraded". Il n'y a pas de drapeau de maintenance distinct ; les maintenances planifiées sont annoncées par e-mail.
10.Mention de la source et clause de non-responsabilité (obligatoires)
Tout écran, rapport ou document affichant des données de l'API porte de manière visible et indissociable la mention de la source et la clause de non-responsabilité. L'API fournit les deux textuellement dans les champs attribution et disclaimer, dans la langue d'Accept-Language. Ils ne peuvent être ni abrégés, ni déplacés en annexe, ni supprimés.
Mention de la source
Clause de non-responsabilité
Lignes de source par couche de données
Outre la mention générale de la source, l'API fournit par couche une ligne de source (source, attribution) que vous reprenez également à côté de ces données, y compris en marque blanche :
- Parcelle et parc immobilier : Source : SPF Finances, plan parcellaire cadastral (CadGIS) plus la couche régionale des bâtiments nommée dans
parcel.source - Secteurs statistiques et indices : Source : Statbel, CC BY 4.0
- Wallonie (affectation, géocodage) : Source : Service public de Wallonie
- Flandre : Source : Autorité flamande, Gratis Open Data Licentie v1.2
- Bruxelles : Source : perspective.brussels / Bruxelles Environnement, CC BY
- Sécurité : Source : Police fédérale, statistiques policières de criminalité (PCS)
- Équipements : © OpenStreetMap contributors (ODbL)
- Carte des prix : la ligne
sourcede la section
Qualifications complémentaires à reprendre textuellement dans vos modèles de rapport : les points de référence sont des prix demandés issus de l'offre publique, pas des prix de transaction ; la valeur AVM est une sortie de modèle indicative avec fourchette, pas une expertise ; les données parcellaires, planologiques et publiques sont fournies « en l'état » et à titre informatif, avec leur date de référence ; les données ne contiennent aucune donnée de performance énergétique (EPC/PEB).
11.Règles d'utilisation
Résumé des règles contractuelles également appliquées techniquement par l'API. La convention prime.
- Par dossier. Les données ne sont montrées qu'à l'expert et reprises uniquement dans le rapport d'expertise du dossier pour lequel la requête a été faite. Chaque requête appartient à un dossier concret et à un utilisateur identifié (
X-User-Ref, de préférence aussiX-Case-Ref). - Conservation 30 jours maximum. Les réponses brutes de l'API disparaissent des systèmes opérationnels, journaux et caches au plus tard 30 jours après la requête. Seul le rapport finalisé (PDF) reste dans l'archive légale du dossier.
- Pas de base de données dérivée. Ne pas agréger, indexer ou stocker les données de plusieurs requêtes dans une base de données, couche cartographique, index ou modèle de prix propre ; cela inclut la géométrie de la carte des prix.
- Pas d'alimentation de modèle. Ne pas utiliser les données pour entraîner, calibrer, valider ou améliorer un algorithme, un modèle ou un système d'IA.
- Pas de revente ni d'extraction en masse. Ne pas revendre, publier, exporter ou transmettre à des tiers en dehors du rapport ; ne pas interroger l'API de manière automatisée ou systématique en dehors d'un dossier.
- Photos (2.5.0). Récupérez les photos pendant la validité du lien (1 heure) et ne les utilisez que pour le dossier pour lequel la requête a été faite. Les intégrer dans le rapport d'expertise (PDF) de ce dossier est autorisé, toujours avec une mention de source visible à côté de chaque photo (attribution, voir 10), sous réserve de la convention de partenariat (le partenaire garantit Taxon contre les réclamations de portails ou d'agents immobiliers concernant les photos). Pas de republication, pas de conservation en dehors de ce rapport, pas de téléchargement en masse ; la résolution reste limitée à 640 px.
- Mention de la source visible dans votre interface et dans chaque rapport (voir 10). Marque blanche uniquement via un avenant distinct.
- PEB « tel qu'annoncé ». Ne jamais présenter les labels PEB des points de référence comme une valeur consultée ou vérifiée.
- Pas de prix notariés. Ne jamais communiquer que les données proviennent de notaires, de VLABEL ou de transactions ; ce sont des prix demandés.
- Décision humaine. Aucune décision produisant des effets juridiques (crédit, fiscalité, assurance) fondée exclusivement sur l'API ou l'AVM sans la responsabilité finale d'un expert.
- Clé secrète, fuite à signaler dans les 48 heures ; sur demande (au plus deux fois par an), fournir un extrait des numéros de dossier en regard des requêtes.
- Documentation confidentielle. Cette documentation est destinée à votre personnel technique ; ne pas la publier.
12.Changelog et correspondance 1.x
| Version | Date | Modifications |
|---|---|---|
| 2.5.1 | 16-09-2026 | Terrains sans limite d'âge. Avec type=land, les points de référence ne sont plus limités aux annonces publiées dans les 24 mois : toutes les annonces de terrains à vendre (mêmes exclusions de sous-type) dans un rayon de 5 km (étendu une fois à 10 km s'il y en a moins de 10 au total) sont fournies, d'abord les annonces des 24 derniers mois (triées par distance) puis les plus anciennes (triées par distance), 25 au plus par bloc, pour que vous puissiez actualiser les prix demandés plus anciens selon l'évolution du marché dans le cadre du dossier (indexation des prix) ; les conditions de licence restent inchangées : pas de fusion, d'indexation ni de conservation entre dossiers. Nouveau champ d'élément age_months (mois civils entiers depuis published, uniquement avec type: land) ; le champ de bloc max_age_months vaut null pour un terrain (reste 24 pour maison et appartement). neighbourhood.land_price_level garde les 24 derniers mois et s'élargit à 60 mois avec moins de 10 annonces utilisables dans les 24 mois ; son max_age_months indique la fenêtre utilisée (24 ou 60). Le message no_comparables reçoit un texte propre aux terrains. Maison et appartement inchangés. Additif. Version du service 2.5.1. Correctif du 16-09-2026 (même version 2.5.1) : days_online est documenté comme nullable (null lorsque la source n'a pas enregistré de durée en ligne, surtout des annonces plus anciennes hors ligne ; last_seen vaut alors published) ; la finalité des annonces plus anciennes est formulée comme une indexation des prix dans le cadre du dossier (licence inchangée) ; le scénario de test T24d utilise une adresse d'exemple qui renvoie effectivement des annonces plus anciennes ; les réponses terrain conservées sous 2.5.0 ne sont plus rejouées depuis le cache d'entrée. |
| 2.5.0 | 15-09-2026 | Terrains et règle photos. Nouvelle valeur type=land (alias grond, terrain, bouwgrond) pour les terrains à bâtir : un bloc de points de référence avec des annonces de terrains à vendre dans un rayon de 5 km (étendu une fois à 10 km s'il y en a moins de 10 ; champ de bloc low_sample et message low_sample), éléments avec plot_area_m2 et price_per_m2_plot (champs de logement null, features limité à plot_area_m2, zoning, flood_zone), neighbourhood.land_price_level {radius_m, count, price_per_m2_plot {p25, median, p75}, price_kind, max_age_months} tandis que price_level et epc_prices valent null (message housing_stats_not_available_for_land) ; pas d'AVM pour un terrain (message avm_not_available_for_land, section non fournie, non facturée) ; living_area_m2 facultatif ; parcel et price_map inchangés ; prix du pack de base. Règle photos assouplie : les photos peuvent être intégrées dans le rapport du dossier avec une mention de source visible par photo, sous réserve de la convention de partenariat (pas de republication, pas de conservation en dehors de ce rapport, pas de téléchargement en masse, 640 px au plus). Correctif du 15-09-2026 (même version) : les points de référence terrain et land_price_level sont limités aux terrains à bâtir, terrains à projet et terrains sans sous-type plus précis (terres agricoles, prairies, bois, terrains industriels et emplacements de parking exclus par sous-type) ; land_price_level ne compte que les annonces entre 15 et 5 000 EUR par m² de terrain ; nouvelle clé LandFeatures land_type (building_plot | project_land | other), le premier mot de summary la suit (additif). Additif : pas de changement de chemins ni de champs existants. Version du service 2.5.0. |
| 2.4.2 | 14-09-2026 | Plan parcellaire cadastral actuel. La section parcel lit désormais la couche PlanParcellaire du SPF Finances (situation fiscale courante, aujourd'hui 01-01-2027) au lieu de l'extrait annuel INSPIRE (01-01-2026) ; la couche INSPIRE reste la solution de repli en cas de panne ou de réponse vide. Nouveau champ fiscal_situation (date ISO de la situation fiscale du plan parcellaire, p. ex. 2027-01-01 ; 2026-01-01 si le repli INSPIRE a répondu ; null si inconnu) sur parcel, sur chaque élément de parcels[] et sur chaque élément de parcel_candidates[]. source mentionne la couche (CadGIS PlanParcellaire (SPF Finances) ou CadGIS INSPIRE (SPF Finances)). Additif : aucun changement aux chemins, paramètres ou champs existants. Version du service 2.4.2. |
| 2.4.1 | 08-09-2026 | Consommation par clé API. /usage reçoit le bloc per_key[] (par clé : prefix, label, environment, active, revoked_at, requests, cases, charged, sections, sections_delivered, amount, last_activity ; mêmes filtres que le reste de la réponse ; les clés sans requête dans le mois ne sont pas listées, les clés révoquées avec des requêtes le sont). CSV : nouvelle dernière colonne key_prefix (16 colonnes). Aucun changement aux chemins, paramètres ou champs existants. Version du service 2.4.1. |
| 2.4.0 | 08-09-2026 | Pack de base. basic + parcel + price_map forment désormais un seul pack par dossier ; l'AVM reste une option distincte. billing.price devient {package, avm, total, currency, excl_vat} ; dans /usage, total.sections, per_user[].sections et per_section utilisent package/avm, total.sections_delivered ajouté ; colonnes CSV price_package, price_avm, price_total. Demander parcel ou price_map séparément est normalisé vers le pack. Version du service 2.4.0. |
| 2.3.0 | 08-09-2026 | Gestion des clés par le partenaire. Les clés sont affichées exactement une fois dans le tableau de bord partenaire sur taxon.be (dans les 7 jours suivant leur création, puis la copie chiffrée est détruite) ; les partenaires créent et révoquent eux-mêmes leurs clés de test (au plus 3 actives) et renouvellent eux-mêmes leur clé live : l'ancienne clé live continue de fonctionner 7 jours et chaque réponse de /address et de /usage obtenue avec elle porte le nouveau message key_rotation_pending (section: null, message avec la date de fin) ; ensuite 403 key_revoked. La première clé live reste délivrée par Taxon après la signature de la convention. Aucun changement de chemin, de paramètre ni de champ. Version du service 2.3.0. |
| 2.2.2 | 07-09-2026 | Corrections après le premier test d'intégration externe (Propteo) : les liens photo livrent toujours une vignette serveur (640 px par défaut, jamais l'original) ; rental_value toujours dans rental_value_range ; parcel_candidates, parcel_candidates_source et parcel_candidates_remark toujours présents (null avec capakeys) ; parcel_candidates[].direction et garden_orientation indépendants de la langue (N/E/S/W) ; zoning.category est une énumération anglaise ; lignes source traduites pour fr/en ; une seule règle de nom de commune pour tout le paquet (pas d'exonymes) ; new_build seulement si year_built ne le contredit pas ; résumés français accordés en genre ; erreurs d'en-tête et de paramètre dans un seul 400 ; free_reason: dedup aussi avec une clé de test quand chaque section fournie l'avait déjà été ; pilot_status.expired partout ; bloc plan dans /usage ; Content-Type CSV avec un seul charset ; Cache-Control et X-Content-Type-Options une seule fois. Version du service 2.2.2. |
| 2.2.1 | 07-09-2026 | Ronde de QA adversariale (aucun changement de clé ni de chemin) : numéros de boîte box 3, b3, app 3 reconnus ; une adresse sans code postal ni commune donne 422 address_imprecise ; epc=A+ avec un plus brut donne 400 (envoyez A%2B) ; le cache d'entrée et la comparaison Idempotency-Key couvrent tous les paramètres et la langue (autre entrée = nouveau bundle, toujours gratuit pour les sections déjà fournies ; même clé avec d'autres paramètres = 409) ; section_missing pour un sous-bloc de basic porte section: basic avec le nom du bloc dans le message ; /usage refuse un paramètre envoyé deux fois ; géométries price_map toujours valides ; requêtes identiques simultanées en pilote/test comptées une fois. Version du service 2.2.1. |
| 2.2.0 | 07-09-2026 | Caractéristiques par point de référence. Chaque point de référence (vente et location) porte features (caractéristiques structurées de l'annonce, inconnu = null), summary (une phrase dans les mots de Taxon, nl/fr/en), thumbnail {url, valid_until} (photo principale en 160 px, même photo que photos[0]) et photo_count. Pas de texte d'annonce, pas de changement de prix (fait partie de basic). Version de service 2.2.0 dans /health. |
| 2.0.0 | 07-09-2026 | Contrat anglais. Chemins /address et /usage (anciens chemins en 404). En-tête X-User-Ref obligatoire (alias X-Gebruiker-Ref, X-Kantoor-Ref obsolètes), X-Case-Ref (alias X-Dossier-Ref), Accept-Language: en ajouté. Tous les paramètres de requête, clés JSON, valeurs d'énumération et codes de message en anglais (correspondance ci-dessous) ; les anciens noms de paramètres donnent 400 invalid_request. Corps d'erreur avec charged, details[] {field, issue}, user_ref, reason, since, limit, scope user_day ; codes d'erreur user_ref_required et user_ref_conflict. Nouvelle section price_map (service 2.1.0) : messages price_map_sparse et price_map_unavailable, upstream_errors.price_map: no_coverage, une clé de prix, une clé de consommation et une colonne CSV pour la carte des prix (remplacées par les clés du pack en 2.4.0). Changement de comportement : condition atteint désormais l'AVM. /health conserve ses clés ; versie affiche la version du service (2.1.0 à ce moment-là). |
| 1.2.0 | 07-09-2026 | Plusieurs parcelles par bien. Paramètre de requête capakeys (séparées par des virgules, au plus 10, format CadGIS, tiret accepté) : la section parcel fournit parcels[] plus les totaux ; les champs au niveau de la section restent ceux de la parcelle principale. Sans capakeys : parcel_candidates[] (parcelles contiguës, au plus 12, avec direction et bâti). Nouvelles erreurs 422 capakey_invalid et 422 capakey_too_far (plus de 2 km) ; messages pour parcelle introuvable, parcelle principale absente des capakeys, analyse parcellaire incomplète, superficie de terrain non cadastrale, filtre chambres abandonné. Paramètres superficie du terrain (repli pour l'AVM) et chambres (filtre plus ou moins 1 avec repli sous 8, et entrée AVM). Dédoublonnage : même bien avec d'autres capakeys dans la fenêtre = pas de nouvelle facturation. |
| 1.1.0 | 04-09-2026 | La notion d'« agence » est devenue « utilisateur » (décision Taxon). L'en-tête utilisateur est devenu obligatoire ; l'en-tête agence est resté comme alias obsolète (même normalisation ; les deux avec une valeur différente = 400 conflict). Définition de l'utilisateur en section 3. Plafonds fixés : 20 par utilisateur et par jour, 300 par clé et par jour, 60 par minute. Le chien de garde suspend l'utilisateur, pas le client. |
| 1.0.0 | 03-09-2026 | Première version du contrat d'interface : paquet adresse (basic, parcel, avm), consommation (JSON + CSV), health. Dédoublonnage par utilisateur + bien pendant 30 jours, Idempotency-Key 24 heures, plafonds par minute/jour/mois et par utilisateur, pilote de 200 dossiers. Données d'inondation non incluses. AVM sans surface habitable = HTTP 200 avec un message ; plafonds journaliers en 403 quota_exceeded ; 504 timeout ; en-tête de réponse X-Idempotent-Replay ; référence utilisateur normalisée en minuscules. Forme de réponse selon le paquet construit : points de référence en liste de blocs par type et transaction, objets photo (404 après expiration), sécurité en chiffres pour 1 000 habitants, pannes en amont, fourchette large et fourchette de loyer. |
| prévu | ultérieurement | Données d'inondation par région comme champ supplémentaire dans parcel ; POST /address avec corps JSON pour des entrées AVM plus riches ; traitement asynchrone des couches lentes. |
Les modifications de champs existants sont annoncées au moins 30 jours à l'avance ; de nouveaux champs peuvent être ajoutés sans préavis (votre analyseur doit ignorer les champs inconnus). Une nouvelle version majeure reçoit un nouveau chemin (/api/v2/partner/).
Correspondance 1.x (néerlandais) vers 2.0 (anglais)
Pour les équipes qui lisent la documentation 1.x. Les anciens noms ne fonctionnent plus, à l'exception des trois alias d'en-tête. Les clés non reprises (lat, lon, capakey, epc_label, score, label, plan, model, n, p25, p75, pct, ref, url, download_token, quota, code, status, type, request_id, pilot, details, top_10, comparables, parcel, avm, capakeys, epc, format) sont inchangées.
| Où | 1.x | 2.0 |
|---|---|---|
| Chemins | /adres, /verbruik | /address, /usage |
| En-têtes | X-Gebruiker-Ref (1.1), X-Kantoor-Ref (1.0), X-Dossier-Ref; Accept-Language: nl|fr | X-User-Ref, X-Case-Ref (les anciens noms restent comme alias); Accept-Language: nl|fr|en |
| Query /address | adres, secties (basis), type=huis|appartement, opp, bouwjaar, staat (nieuw|zeer_goed|goed|matig|te_renoveren), slaapkamers, opp_grond | address, sections (basic), type=house|apartment|land, living_area_m2, year_built, condition (excellent|very_good|good|average|poor), bedrooms, plot_area_m2 |
| Query /usage | maand, formaat, gebruiker_ref | month, format, user_ref |
| Niveau supérieur | omgeving, uit_cache, adres, secties_geleverd, basis, facturatie, meldingen, fouten_upstream, bronvermelding, gegenereerd_op | environment, from_cache, address, sections_delivered, basic, billing, notices, upstream_errors, attribution, generated_at |
address | invoer, genormaliseerd, bus, postcode, gemeente, gewest, niscode, geocode_bron, precisie: huisnummer | input, normalized, box, postal_code, municipality, region, nis_code, geocoder, precision: house_number |
Bloc basic.comparables[] | transactie: koop|huur, transactie_label, adres_modus: huisnummer|straat, straal_m, aantal, max_leeftijd_maanden, uitgesloten_eigen_pand, slaapkamers_filter {gevraagd, bereik, toegepast, aantal_binnen_filter} | transaction: sale|rent, transaction_label, address_mode: house_number|street, radius_m, count, max_age_months, excluded_subject_property, bedrooms_filter {requested, range, applied, count_within_filter}; nouveau en 2.5.0 (sans équivalent 1.x) : low_sample (terrain) |
items[] (point de référence) | adres, afstand_m, prijs, prijs_soort: vraagprijs, prijs_soort_label, prijs_per_m2, opp_wonen_m2, opp_grond_m2, slaapkamers, epc_kengetal_kwh_m2, epc_bron, bouwjaar, staat, bebouwing: open|halfopen|gesloten|appartement, nieuwbouw, publicatie, dagen_online, laatst_gezien, bron: advertentie, bron_label, historiek[] {datum, prijs, gebeurtenis: publicatie|prijsdaling|prijsstijging|herpublicatie|offline}, fotos[] {geldig_tot} | address, distance_m, price, price_kind: asking_price, price_kind_label, price_per_m2, living_area_m2, plot_area_m2, bedrooms, epc_kwh_m2, epc_source, year_built, condition, building_type: detached|semi_detached|terraced|apartment, new_build, published, days_online (null when the source recorded no online duration, mostly older offline listings; last_seen then equals published), last_seen, source: listing, source_label, history[] {date, price, event: published|price_drop|price_increase|republished|offline}, photos[] {valid_until} ; nouveau en 2.2.0 (sans équivalent 1.x) : features {...}, summary, thumbnail {url, valid_until}, photo_count; nouveau en 2.5.0 : price_per_m2_plot (terrain) |
basic.neighbourhood (anciennement buurtstats) | sector {naam, niveau, gemeente}, gebouwenpark {niveau, peildatum, totaal, verdeling[] {cat: residentieel|handel_diensten|industrie|landbouw|andere, aantal}, bron}, prijsniveau {koop_m2, huur_m2_jaar, brutorendement_pct, brutorendement_p25_p75, straal_m, prijs_soort} avec mediaan, epc_prijzen {straal_m, labels {mediaan_m2, aantal}}, veiligheid {niveau, gemeente, jaar, woninginbraak_per_1000, misdrijven_per_1000, gewest_woninginbraak_per_1000, gewest_misdrijven_per_1000, jaren[], bron} | sector {name, level, municipality}, building_stock {level, reference_date, total, distribution[] {category: residential|commerce_services|industry|agriculture|other, count}, source}, price_level {sale_per_m2, rent_per_m2_year, gross_yield_pct, gross_yield_p25_p75, radius_m, price_kind} avec median, epc_prices {radius_m, labels {median_per_m2, count}}, safety {level, municipality, year, burglaries_per_1000, crimes_per_1000, region_burglaries_per_1000, region_crimes_per_1000, years[], source}; nouveau en 2.5.0 : land_price_level {radius_m, count, price_per_m2_plot {p25, median, p75}, price_kind, max_age_months} (terrain) |
basic.amenities (anciennement voorzieningen) | schaal, straal_m, aantal_pois, deelscores {openbaar_vervoer, zorg, winkels, sport_cultuur, onderwijs, groen} {aantal}, top_10[] {naam, afstand_m}, attributie | scale, radius_m, poi_count, sub_scores {public_transport, healthcare, shops, sport_culture, education, green_space} {count}, top_10[] {name, distance_m}, attribution |
parcel | gewest, oppervlakte_m2, oppervlakte_kadastraal_m2, perceel_breedte_m, perceel_diepte_m, gevel_breedte_m, bebouwde_opp_m2, gebouwen_aantal, orientatie_tuin, orientatie_tuin_graden, bestemming {categorie}, voorkooprecht {status: ja|geen|onbekend, bron, dekking_pct, percelen, percelen_onbekend}, opmerking, bron, hoofdperceel, percelen[] {hoofdperceel, afstand_tot_adres_m}, percelen_aantal, oppervlakte_totaal_m2, oppervlakte_kadastraal_totaal_m2, bestemming_gezamenlijk, voorkooprecht_gezamenlijk, percelen_niet_gevonden, opp_grond_bron: "kadaster hoofdperceel" | "kadaster n percelen" | partner, perceel_kandidaten[] {oppervlakte_m2, richting, bebouwd, afstand_m}, perceel_kandidaten_bron, perceel_kandidaten_opmerking | region, area_m2, cadastral_area_m2, fiscal_situation (2.4.2, aussi dans parcels[] en parcel_candidates[]; sans équivalent 1.x), width_m, depth_m, frontage_m, built_area_m2, buildings_count, garden_orientation, garden_orientation_deg, zoning {category}, preemption_right {status: yes|none|unknown, source, coverage_pct, parcels, parcels_unknown}, remark, source, main_parcel, parcels[] {is_main, distance_to_address_m}, parcels_count, total_area_m2, cadastral_total_area_m2, zoning_combined, preemption_right_combined, parcels_not_found, plot_area_source: cadastre_main_parcel | cadastre_<n>_parcels (n = 2 to 10; partner only in avm.inputs_used), parcel_candidates[] {area_m2, direction, built, distance_m}, parcel_candidates_source, parcel_candidates_remark |
avm | waarde, vork, vork_90, huurwaarde, huurwaarde_vork, betrouwbaarheid, n_comparables, n_comparables_500m, n_comparables_1km, invoer_gebruikt {opp_wonen_m2, bouwjaar, staat, slaapkamers, opp_grond_m2, opp_grond_bron}, prijs_soort: vraagprijs | value, range, range_90, rental_value, rental_value_range, confidence, comparables_count, comparables_count_500m, comparables_count_1km, inputs_used {living_area_m2, year_built, condition, bedrooms, plot_area_m2, plot_area_source}, price_basis: asking_price_model |
billing (anciennement facturatie) | gebruiker_ref (1.0 : kantoor_ref), dossier_ref, aangerekend, reden_gratis: geen_resultaat|fout|pilot_uitgeput, prijs {basis, totaal, munt, excl_btw}, dedup_van, dedup_geldig_tot, maand, verbruik_maand_tot_nu {dossiers, bedrag}, pilot_stand {actief, gebruikt, resterend, einde, verlopen}, dag {klant_vandaag, gebruiker_vandaag} | user_ref, case_ref, charged, free_reason: no_result|error|pilot_exhausted, price {package, avm, total, currency, excl_vat} (2.4.0), dedup_of, dedup_valid_until, month, month_to_date {cases, amount}, pilot_status {active, used, remaining, ends, expired}, today {client_today, user_today} |
notices[] (anciennement meldingen) | {code, sectie, bericht}; codes opp_required, avm_indicatief, geen_comparables, adres_straatniveau, geocoder_deels_onbereikbaar, gewest_conflict, eigen_pand_uitgesloten, hoofdperceel_niet_in_capakeys, perceel_analyse_onvolledig, opp_grond_niet_kadastraal_bevestigd, slaapkamers_filter_losgelaten, sectie_ontbreekt (upstream_fout), test_omgeving, pilot_uitgeput | {code, section, message}; codes living_area_required, avm_indicative_not_regionally_calibrated, no_comparables, address_street_level, geocoder_partially_unavailable, region_conflict, subject_property_excluded, main_parcel_not_in_capakeys, parcel_analysis_incomplete, plot_area_not_cadastral, bedrooms_filter_dropped, section_missing (upstream_error), test_environment, pilot_exhausted ; nouveau en 2.3.0 (sans équivalent 1.x) : key_rotation_pending |
Clés upstream_errors | basis, basis.comparables, basis.buurtstats, basis.voorzieningen, buurtstats.gebouwenpark, buurtstats.veiligheid, buurtstats.prijsniveau, buurtstats.epc_prijzen; valeur upstream_fout | basic, basic.comparables, basic.neighbourhood, basic.amenities, neighbourhood.building_stock, neighbourhood.safety, neighbourhood.price_level, neighbourhood.epc_prices; valeur upstream_error |
| Corps d'erreur | aangerekend, details[] {veld, fout}, sectie, gebruiker_ref, reden, sinds, limiet, scope: gebruiker_day; codes gebruiker_ref_required, gebruiker_ref_conflict | charged, details[] {field, issue}, section, user_ref, reason, since, limit, scope: user_day; codes user_ref_required, user_ref_conflict |
/usage | klant, maand, omgeving, gebruiker_ref, totaal {opvragingen, dossiers, aangerekend, gratis_dedup, gratis_pilot, gratis_storing, secties, bedrag, munt, excl_btw, duur_ms_gem}, per_gebruiker[] {secties_geleverd, laatste_activiteit}, per_dag[] {dag}, per_sectie {geleverd, aangerekend, bedrag}, kwaliteit {fout_pct, latentie_p50_ms, latentie_p95_ms, upstream_fouten}, gegenereerd_op | client, month, environment, user_ref, total {requests, cases, charged, free_dedup, free_pilot, free_error, sections, amount, currency, excl_vat, duration_ms_avg}, per_user[] {sections_delivered, last_activity}, per_key[] {prefix, label, environment, active, revoked_at, requests, cases, charged, sections, sections_delivered, amount, last_activity} (2.4.1, nom interne per_sleutel, sans équivalent 1.x), per_day[] {day}, per_section {delivered, charged, amount} (2.4.0 : clés package, avm ; total.sections {package, avm}, total.sections_delivered), quality {error_pct, latency_p50_ms, latency_p95_ms, upstream_errors}, generated_at |
| En-tête CSV | request_id;tijdstip;gebruiker;dossier_ref;adres;gewest;secties_gevraagd;secties_geleverd;aangerekend;reden_gratis;dedup_van;prijs_basis;prijs_parcel;prijs_avm;prijs_totaal;status_code; fichier taxon-verbruik-... | request_id;timestamp;user_ref;case_ref;address;region;sections_requested;sections_delivered;charged;free_reason;dedup_of;price_package;price_avm;price_total;status_code;key_prefix (2.4.0 ; key_prefix 2.4.1, nom interne sleutel_prefix) ; fichier taxon-usage-<client>-<month>.csv |
13.Contact
| Questions techniques et commerciales | info@taxon.be, en mentionnant le request_id d'une requête concrète |
|---|---|
| Protection des données | privacy@taxon.be (transférer les demandes des personnes concernées dans les 5 jours ouvrables) |
| Disponibilité | GET /health ; les maintenances planifiées sont annoncées à l'avance par e-mail |
| Éditeur | Taxon, Schat mijn huis BV, Ypres (Belgique), taxon.be |