Langue
À propos Produits Documentation API Blog Statut API Contact
v2.5.1 - contrat d'interface

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 basehttps://taxonapi.be/api/v1/partner/
FormatJSON (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
AuthentificationEn-tête X-Api-Key
Spécificationopenapi.yaml (OpenAPI 3.1, version 2.5.1)
Guide d'intégrationguide-fr.md (démarrage rapide, curl, PHP, Python, plan de test) ; EN integration-guide.md, NL gids-nl.md
EndpointsGET /address   GET /usage   GET /health
PacksPack 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 horaireEurope/Brussels ; horodatages ISO 8601 avec décalage
Ce que l'API ne fournit volontairement pas. Pas de prix de vente ou de transaction notariés (tous les prix sont des prix demandés issus de l'offre publique), pas de consultation PEB (les labels PEB apparaissent tels qu'annoncés), pas de textes d'annonce, pas de noms de portails ni de liens, pas d'images ou de tuiles cartographiques, pas de recherche par liste ou par zone. Les photos des points de référence ne sont disponibles que sous forme de liens temporaires signés (intégration dans le rapport du dossier avec une mention de source : voir 11).
Contrat 2.0 (07-09-2026). Tous les en-têtes, chemins, paramètres de requête, clés JSON et valeurs d'énumération sont en anglais. Les anciens noms néerlandais (contrats 1.0 à 1.2) sont repris en section 12 ; les anciens chemins /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éUsagePropriétés
tx_live_ + 32 hexProductionLa consommation est comptée et facturée mensuellement selon la convention.
tx_test_ + 32 hexDéveloppement et tests du piloteJamais 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épond 403 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_allowed pour 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.

ActionFonctionnement
Afficher une clé une seule foisUne 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 testCré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é liveDé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'abusRenouvelez (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êteStatutSignification
X-Api-KeyobligatoireVotre clé partenaire (voir 2).
X-User-RefobligatoireVotre 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-Ref
X-Kantoor-Ref
obsolèteAlias 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-RefoptionnelVotre 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-KeyoptionnelClé 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-Languageoptionnelnl (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ètreStatutSignification
addressobligatoireAdresse complète : rue, numéro, code postal, commune. 8 à 255 caractères. À encoder en URL.
typeobligatoirehouse, 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).
sectionsoptionnelbasic (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_m2optionnelSurface 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_builtoptionnelAnnée de construction (1500 à 2100). Améliore l'AVM.
epcoptionnelLabel 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.
conditionoptionnelpoor, 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.
bedroomsoptionnelNombre 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_m2optionnelSuperficie 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.
capakeysoptionnelPlusieurs 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&sections=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"
}
Panne dans une seule section. Si une source sous-jacente tombe en panne (par exemple le service parcellaire d'une région), cette section manque dans 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 (sale et rent ; avec type indiqué, 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 champ address est la rue + le numéro sans boîte, ou la rue et la commune seulement, selon votre convention (champ address_mode par bloc : house_number ou street) ; les points de référence ne contiennent jamais de coordonnées, uniquement distance_m. Ni nom de portail, ni lien, ni texte d'annonce. Avec type=land il y a un seul bloc (sale uniquement, 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. url est une URL signée (capability URL) sur taxonapi.be (vignette serveur de 640 px au plus : w 160, 320 ou 640, autres valeurs arrondies vers le haut et plafonnées à 640, sans w aussi 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 : nouveaux url et valid_until, même download_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épond 404 (invalid_or_expired_token). download_token est 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 objet features avec les caractéristiques structurées de l'annonce (garage, parking_spaces, terrace et terrace_m2, garden et garden_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 ; null signifie inconnu, la couverture dépend donc de l'annonce. summary est une phrase dans les mots de Taxon, construite uniquement à partir de ces champs, dans la langue de Accept-Language ; les textes d'annonce ne sont jamais fournis. thumbnail {url, valid_until} est un lien signé vers la photo principale (façade) en w=160, valable 1 heure et renouvelé comme les autres liens photo ; photos[0] est la même photo en 640 px ; null sans photos. photo_count est le nombre total de photos de l'annonce (photos reste 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 vaut null et figure dans upstream_errors. Avec type=land : price_level et epc_prices valent null (message housing_stats_not_available_for_land) et land_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 ; null pour les appartements).
  • Affectation (category, label, plan) selon le plan de la région (voir tableau) et le droit de préemption (status yes / none / unknown, source, éventuellement couverture et détails). Le label d'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, parcel est absente avec le message parcel_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, dispersion fsd_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. Toujours price_basis: "asking_price_model".
  • Nécessite living_area_m2 : sans surface, la section est omise avec le message living_area_required. year_built, epc, condition et bedrooms améliorent l'estimation. Données insuffisantes : message avm_insufficient_data, section non fournie, l'option AVM n'est pas facturée. Non fournie pour type=land (message avm_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) et parcel_candidates[] : les parcelles contiguës (au plus 12), chacune avec capakey, area_m2 cadastrale, direction par rapport à la parcelle principale (toujours N, E, S ou W, indépendant de la langue), built (couche régionale des bâtiments ; null si cette couche n'était pas disponible) et distance_m entre 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 alors parcels[] (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 totaux total_area_m2, cadastral_total_area_m2, zoning_combined (un objet si toutes les parcelles sont identiques, sinon une liste avec parcels[] par affectation), preemption_right_combined (yes dè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 message main_parcel_not_in_capakeys) et parcels_not_found[]. Les champs au niveau de la section restent ceux de la parcelle principale. L'AVM (type house) utilise total_area_m2 ; avm.inputs_used.plot_area_source indique cadastre_main_parcel, cadastre_<n>_parcels (n = nombre de parcelles fournies, 2 à 10) ou partner ; le champ de section parcel.plot_area_source ne porte que les deux valeurs cadastre. Pour un appartement, aucune superficie de terrain n'est transmise au modèle (même avec capakeys).
  • Dédoublonnage. Même utilisateur, même adresse : le pack de base fourni à l'étape 1 n'est pas refacturé (message dedup avec section: basic ; billing.free_reason ne vaut dedup que lorsque rien de nouveau n'est fourni, sinon null (facturé), test ou pilot), 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êmes capakeys à nouveau dans les 30 jours = réponse issue du grand livre (from_cache: true). La même Idempotency-Key avec d'autres capakeys = 409 idempotency_conflict. parcel_candidates, parcel_candidates_source et parcel_candidates_remark sont toujours présents et valent null lorsque capakeys a été donné. Une analyse parcellaire à froid peut prendre jusqu'à 21 s ; sur upstream_errors.parcel: timeout (message section_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 nouvelle Idempotency-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, capakeys ne requiert donc aucune section supplémentaire. Une capakey qui n'existe pas dans le plan parcellaire : message capakey_not_found (section parcel) et parcels_not_found[] ; les autres parcelles sont fournies. Si l'analyse parcellaire échoue pour une parcelle, seule sa superficie cadastrale compte (message parcel_analysis_incomplete).
  • Charge. Limitez-vous aux parcelles du dossier. Chaque requête avec capakeys effectue 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 porte age_months (mois civils entiers entre published et aujourd'hui) et le champ de bloc max_age_months vaut null pour un terrain. Toujours moins de 10 : champ de bloc low_sample: true et message low_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) plus plot_area_m2 et price_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) valent null. features se limite à {plot_area_m2, zoning, flood_zone, land_type} (zoning vaut actuellement toujours null : l'affectation d'une annonce n'est pas consultée ; celle de la parcelle du bien se trouve dans parcel.zoning ; land_type vaut building_plot, project_land ou other et détermine le premier mot de summary : « Terrain à bâtir », « Terrain à projet » ou « Terrain »). summary donne 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 et max_age_months indique 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 propre price_per_m2_plot) ; price_level et epc_prices valent null avec le message housing_stats_not_available_for_land ; building_stock, safety et amenities comme d'habitude.
  • Pas d'AVM : Taxon ne fournit ni évaluation automatique ni valeur indicative du terrain. sections=basic,avm reste HTTP 200 : avm vaut null et n'est pas dans sections_delivered, message {code: avm_not_available_for_land, section: avm}, l'option AVM n'est pas facturée. living_area_m2 peut ê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_map reste 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.

ChampSignification
radius_mRayon autour de l'adresse, 3000.
price_kindToujours asking_price.
reference_period, updated_atDate 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_neighbourhoodid (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).
sourceLigne 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éocodagegeo.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 parcellaireSPF Finances (CadGIS) + GRBSPF 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 languesFranç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
AVMEntièrement calibréeMessage avm_indicative_not_regionally_calibrated : modèle pas encore calibré au niveau régional, fourchette plus large, vérification explicite par l'expertMême message, idem
Données d'inondation, NON inclusesPas d'obligation d'information sur la sensibilité aux inondations (fluviale/pluviale, réglementation 2023), pas de P-score/G-scorePas 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).

SituationRé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 bienSeule 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,avmEntiè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 ANouvelle 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 joursNouvelle 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êteNon 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).
L'Idempotency-Key est autre chose que le dédoublonnage. Le dédoublonnage est une règle commerciale (30 jours, par utilisateur et par bien, les sections comptent). L'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

NiveauValeurEn cas de dépassement
Par clé, par minute60 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 jour300 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 jour20 requêtes403 quota_exceeded avec scope: "user_day", limit et user_ref + en-tête Retry-After ; les autres utilisateurs continuent de fonctionner
Par clé, par moisSelon la conventionNotification aux deux parties ; blocage uniquement après concertation
Pilote200 dossiers dans les 60 jours suivant la signature403 pilot_exhausted (corps pilot{active, quota, used, remaining, ends, expired}) jusqu'à l'activation du contrat annuel
Balayage systématique par utilisateurChien de garde sur numéros de maison/codes postaux consécutifs, pics nocturnes, répartition anormale par utilisateur403 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 test20 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 surchargeTrop de paquets en cours sur le service503 overloaded + Retry-After, rien n'est facturé ni compté
Délai du paquet40 secondes504 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.

HTTPerrorQuandCe que fait le client
400invalid_requestParamè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.
400user_ref_requiredEn-tête X-User-Ref manquant (et aucun alias).Ajoutez l'en-tête utilisateur.
400user_ref_conflictDeux 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.
401missing_api_keyEn-tête X-Api-Key manquant.Erreur de configuration ; alertez votre équipe d'exploitation.
401invalid_api_keyClé inconnue.Idem ; ne réessayez pas.
403key_revokedClé révoquée (après rotation ou incident).Passez à la nouvelle clé.
403ip_not_allowedRequête hors de la liste d'adresses IP autorisées.Communiquez la nouvelle IP du serveur à Taxon.
403client_suspendedAccès suspendu (schéma d'abus, défaut de paiement).Contactez Taxon ; ne réessayez pas.
403section_not_allowedLa section demandée ne fait pas partie de votre plan (section dans le corps).Retirez la section ou étendez le plan.
403quota_exceededPlafond 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.
403pilot_exhaustedQuota pilote de 200 dossiers atteint ou 60 jours écoulés ; pilot{} dans le corps.Contactez Taxon (contrat annuel).
403user_suspendedUtilisateur 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.
404address_not_foundAucun géocodeur ne trouve l'adresse. Vérifiez le code postal et le numéro.Laissez l'utilisateur corriger l'adresse.
404not_foundChemin inconnu sous /api/v1/partner/ (y compris les chemins 1.x /adres et /verbruik).Corrigez le chemin.
405method_not_allowedMéthode autre que GET.Utilisez GET.
409idempotency_conflictMê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é.
422address_impreciseAdresse 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.
422type_unsupportedL'adresse trouvée ou le géocodeur ne prend pas en charge le type indiqué.Changez le type.
422capakey_invalidcapakeys au mauvais format ou plus de 10 (details[]).Corrigez les capakeys.
422capakey_too_farUne parcelle se trouve à plus de 2 km de l'adresse ; rien n'est fourni.Retirez cette parcelle.
429rate_limitedPlafond 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.
429rate_limit_exceededPlafond 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.
502upstream_unavailableLa 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.
503overloadedTrop de paquets en cours ; Retry-After et retry_after.Attendez Retry-After, puis réessayez.
504timeoutLe paquet a pris plus de 40 secondes.Réessayez avec la même Idempotency-Key.
500internal_errorErreur inattendue.Réessayez une fois ; puis communiquez le request_id.

Aucune erreur n'est jamais facturée (charged: false).

Pas une erreur, mais un message. Une surface habitable manquante pour 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ètreSignification
monthYYYY-MM, par défaut le mois en cours (Europe/Brussels).
formatjson (par défaut) ou csv.
user_refFiltre 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

EN: References: Taxon (taxon.be)
FR: Références : Taxon (taxon.be)
NL: Referenties: Taxon (taxon.be)

Clause de non-responsabilité

EN: 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.
FR: Prix d'annonce, pas de prix de vente notariés. Données à usage interne par dossier; toute constitution de base de données dérivée est interdite. L'expert décide, l'AVM est un outil d'aide.
NL: Vraagprijzen uit advertenties, geen notariële verkoopprijzen. Gegevens uitsluitend voor intern gebruik per dossier; het aanleggen van een afgeleide databank is verboden. De schatter beslist, de AVM is een hulpmiddel.

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 source de 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 aussi X-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

VersionDateModifications
2.5.116-09-2026Terrains 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.015-09-2026Terrains 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.214-09-2026Plan 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.108-09-2026Consommation 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.008-09-2026Pack 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.008-09-2026Gestion 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.207-09-2026Corrections 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.107-09-2026Ronde 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.007-09-2026Caracté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.007-09-2026Contrat 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.007-09-2026Plusieurs 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.004-09-2026La 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.003-09-2026Premiè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évuultérieurementDonné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.

1.x2.0
Chemins/adres, /verbruik/address, /usage
En-têtesX-Gebruiker-Ref (1.1), X-Kantoor-Ref (1.0), X-Dossier-Ref; Accept-Language: nl|frX-User-Ref, X-Case-Ref (les anciens noms restent comme alias); Accept-Language: nl|fr|en
Query /addressadres, secties (basis), type=huis|appartement, opp, bouwjaar, staat (nieuw|zeer_goed|goed|matig|te_renoveren), slaapkamers, opp_grondaddress, sections (basic), type=house|apartment|land, living_area_m2, year_built, condition (excellent|very_good|good|average|poor), bedrooms, plot_area_m2
Query /usagemaand, formaat, gebruiker_refmonth, format, user_ref
Niveau supérieuromgeving, uit_cache, adres, secties_geleverd, basis, facturatie, meldingen, fouten_upstream, bronvermelding, gegenereerd_openvironment, from_cache, address, sections_delivered, basic, billing, notices, upstream_errors, attribution, generated_at
addressinvoer, genormaliseerd, bus, postcode, gemeente, gewest, niscode, geocode_bron, precisie: huisnummerinput, 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}, attributiescale, radius_m, poi_count, sub_scores {public_transport, healthcare, shops, sport_culture, education, green_space} {count}, top_10[] {name, distance_m}, attribution
parcelgewest, 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_opmerkingregion, 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
avmwaarde, 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: vraagprijsvalue, 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_errorsbasis, basis.comparables, basis.buurtstats, basis.voorzieningen, buurtstats.gebouwenpark, buurtstats.veiligheid, buurtstats.prijsniveau, buurtstats.epc_prijzen; valeur upstream_foutbasic, basic.comparables, basic.neighbourhood, basic.amenities, neighbourhood.building_stock, neighbourhood.safety, neighbourhood.price_level, neighbourhood.epc_prices; valeur upstream_error
Corps d'erreuraangerekend, details[] {veld, fout}, sectie, gebruiker_ref, reden, sinds, limiet, scope: gebruiker_day; codes gebruiker_ref_required, gebruiker_ref_conflictcharged, details[] {field, issue}, section, user_ref, reason, since, limit, scope: user_day; codes user_ref_required, user_ref_conflict
/usageklant, 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_opclient, 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 CSVrequest_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 commercialesinfo@taxon.be, en mentionnant le request_id d'une requête concrète
Protection des donnéesprivacy@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
ÉditeurTaxon, Schat mijn huis BV, Ypres (Belgique), taxon.be