{
  "api": "api.identix.org",
  "versie": "v1",
  "onderdeel": "distributiemonitor.methodiek",
  "bron_type": "identix-combi",
  "gegenereerd_op": "2026-10-30T21:55:50Z",
  "duur_ms": 0.0,
  "integriteit": {
    "algoritme": "sha-256",
    "canonieke_vorm": "json.dumps(data, sort_keys=True, separators=(',',':'), ensure_ascii=False)",
    "hash": "58f7b64f813776c9cf2f47c0e8108d46aa7780d389735ed7a37b59ccc3d20b95"
  },
  "bronnen": [],
  "data": {
    "gegenereerd_op": "2026-10-30T21:55:50Z",
    "dekking": {
      "karakter": "continue marktmonitor — dagelijks ververst; de cijfers volgen de bron",
      "nog_niet_ontsloten": [
        "KvK-mutaties (oprichting/opheffing): vereist een bedrijfsdata-overeenkomst met de KvK (betaald)",
        "hypotheekdistributie per kantoor: vereist  Kadaster/HDN-transactiedata (commercieel contract)",
        "provisiescenario: vereist Toetssteen/Parametrics-data",
        "persoonsleeftijd per adviseur: persoonsgegevens (AVG) — niet publiek; vergunningsduur-cohorten dienen als proxy"
      ]
    },
    "privacy": {
      "regel": "Geen persoonsgegevens: aggregeren op kantoor- of hoger niveau; namen van individuele adviseurs blijven buiten elke output.",
      "doorvoering": [
        "metrics bevatten uitsluitend aantallen en proporties",
        "plaats-aggregaten kennen geen kruisingen met rechtsvorm of productgroep",
        "kruisingen uitsluitend op landelijk niveau"
      ]
    },
    "metrics": [
      {
        "id": "universum",
        "naam": "Kantooruniversum",
        "vraag": "Hoe groot is de vergunninghoudende adviesmarkt, en waar zit zij?",
        "definitie": "Aantal Nederlandse instellingen in het AFM-register met minstens één Wft-vergunning (actief of beëindigd); 'actief kantoor' = minstens één geldige vergunning op de peildatum (geen einddatum, of einddatum op/na peildatum).",
        "bronvelden": [
          "land",
          "rechtsvorm",
          "vestigingsadres.plaats",
          "statutaire_zetel",
          "vergunningen[].start_datum",
          "vergunningen[].eind_datum"
        ],
        "transformatie": "src/distributiemonitor/metrics.py::bereken_universum",
        "aggregaties": [
          "totaal",
          "actief",
          "per_rechtsvorm (landelijk)",
          "per_plaats (top 25, genormaliseerd)"
        ],
        "beperkingen": [
          "Plaats is vrije tekst in het bronregister: ~71% dekking na normalisatie (vestigingsadres, terugval statutaire zetel); de dekking staat bij elk antwoord.",
          "Plaats-aggregaten bevatten alléén totalen — geen kruising met rechtsvorm of productgroep (privacy: kleine cellen kunnen bij eenmanduszaken naar natuurlijke personen wijzen).",
          "Een 'kantoor' is hier een vergunninghoudende entiteit; binnen één juridische entheid kunnen meerdere vestigingen werken."
        ]
      },
      {
        "id": "profielen",
        "naam": "Wft-vergunningsprofielen",
        "vraag": "Hoe breed is het productpakket per kantoor — specialist of allround?",
        "definitie": "Per actief kantoor: de set productgroepen waarvoor het minstens één geldige vergunning heeft, uitgesplitst per dienstsoort (adviseren, bemiddelen, aanbieden). Productgroepen: negen clusters (hypotheken, consumptief krediet, betalen, sparen, beleggen, schade, zorg, inkomen, pensioen) conform de productindeling van het AFM-rapport Marktmonitor Adviseurs & Bemiddelaars.",
        "bronvelden": [
          "vergunningen[].producten[].omschrijving",
          "vergunningen[].producten[].diensten[].omschrijving",
          "vergunningen[].eind_datum"
        ],
        "transformatie": "src/distributiemonitor/metrics.py::bereken_profielen; mapping: src/distributiemonitor/segmenten.py",
        "aggregaties": [
          "per_productgroep × dienstsoort (landelijk)",
          "breedteverdeling: 1 / 2–4 / 5–9 productgroepen"
        ],
        "beperkingen": [
          "Vergunningsbreedte ≠ feitelijk aanbod: een vergunning zegt dat een kantoor een product mag adviseren/bemiddelen, niet hoeveel het er feitelijk verkoopt.",
          "Producten buiten de negen clusters (of nieuwe omschrijvingen in het register) worden als 'onbekend' geteld en apart gerapporteerd, nooit stilletjes weggefilterd."
        ]
      },
      {
        "id": "stromen",
        "naam": "In- en uitstroom kantoren",
        "vraag": "Komt er vers kantoor bij, en hoeveel stopt er?",
        "definitie": "Instroom per jaar: jaar van de eerste vergunningstart van een kantoor. Uitstroom per jaar: jaar waarin de laatste vergunning van dat kantoor eindigde (alle vergunningen beëindigd).",
        "bronvelden": [
          "vergunningen[].start_datum",
          "vergunningen[].eind_datum"
        ],
        "transformatie": "src/distributiemonitor/metrics.py::bereken_stromen",
        "aggregaties": [
          "per jaar: instroom, uitstroom, netto"
        ],
        "beperkingen": [
          "Het register kent vergunningsdata, geen kantoorbeëindigingen: 'uitstroom' betekent hier 'laatste Wft-vergunning beëindigd' — een kantoor kan zonder Wft-vergunning doorbestaan (bijv. als executiewinkel of in andere dienstverlening).",
          "Het extract registreert einddata van vergunningen pas vanaf ~2021 structureel; oudere beëindigingen ontbreken en de uitstroom vóór 2021 is daarmee een onderschatting.",
          "Kantoren waarvan het volledige dossier ontbreekt in het extract vallen buiten de telling (wordt gerapporteerd in tellingen)."
        ]
      },
      {
        "id": "ontwikkeling",
        "naam": "Voorraadontwikkeling advieskantoren",
        "vraag": "Hoeveel advieskantoren zijn er actief — en welke kant gaat het op?",
        "definitie": "Actieve kantoren per jaareinde: kantoren met minstens één vergunning waarvan de start op of vóór de peildatum ligt én die nog niet beëindigd is op die datum. Het lopende jaar meet op de huidige peildatum (niet op 31 december), zodat het laatste punt exact klopt met universum.actieve_kantoren. Per jaar wordt ook de verandering t.o.v. het voorgaande jaar gegeven.",
        "bronvelden": [
          "vergunningen[].start_datum",
          "vergunningen[].eind_datum"
        ],
        "transformatie": "src/distributiemonitor/metrics.py::bereken_ontwikkeling",
        "aggregaties": [
          "per jaar: actieve kantoren + verandering t.o.v. voorgaand jaar"
        ],
        "beperkingen": [
          "Het extract registreert einddata van vergunningen pas vanaf ~2021 structureel; oudere beëindigingen ontbreken, waardoor de voorraad vóór 2021 een bovengrens is.",
          "Actief = vergunninghoudend: dit zegt niets over feitelijke activiteit of omzet, alleen over het recht om te adviseren of bemiddelen."
        ]
      },
      {
        "id": "geografie",
        "naam": "Adviesdichtheid per gemeente",
        "vraag": "Waar is fysiek financieel advies dichtbij — en waar dun?",
        "definitie": "Actieve Wft-kantoren per 10.000 huishoudens per gemeente. Kantoren worden via hun vestigingsplaats (terugval: statutaire zetel) gekoppeld aan CBS-gemeenten; huishoudens komen uit de CBS-kerncijfers wijken en buurten (GM-rijen). Landelijke dichtheid = gekoppelde actieve kantoren gedeeld door het totaal huishoudens in gemeenten met bekende huishoudens.",
        "bronvelden": [
          "vestigingsadres.plaats",
          "statutaire_zetel",
          "vergunningen[].eind_datum",
          "CBS 86165NED: HuishoudensTotaal per GM-rij",
          "CBS/PDOK gebiedsindelingen 2025: statcode, statnaam, geometrie (alleen voor de kaartweergave)"
        ],
        "transformatie": "src/distributiemonitor/metrics.py::bereken_geografie; koppeling: src/distributiemonitor/geografie.py + woonplaats_gemeente.json; kaart-asset: src/distributiemonitor/gemeente_paden.py → web/innovatie/distributiemonitor/gemeente-paden-2025.json",
        "aggregaties": [
          "per gemeente: kantoren, huishoudens, per 10.000",
          "landelijk per 10.000 huishoudens",
          "kaartweergave: choropleth per gemeente"
        ],
        "beperkingen": [
          "Koppelingsdekking: ~57% van de actieve kantoren koppelt aan een gemeente (vestigingsadres ontbreekt bij ~60% van de dossiers; de statutaire zetel vangt een deel op). De dekking staat bij elk antwoord — een lage gemeentedichtheid is deels een ondergrens.",
          "De vertaaltabel woonplaats→gemeente is gegenereerd via de PDOK Locatieserver (type:woonplaats, exacte match) tegen de CBS-gemeentecodes 2025; bij een herindeling moet zij worden hergegenereerd.",
          "CBS-peildatum (1 januari van het tabeljaar) wijkt af van de AFM-peildatum; beide staan bij het antwoord.",
          "Een 'kantoor' telt op zijn gemeente van vestiging/zetel — klanten wonen niet per definitie in dezelfde gemeente (vooral in stedelijke regio's een onderschatting van de feitelijke dekking rond kleine gemeenten).",
          "Per gemeente alléén totalen — geen kruisingen met productgroep of rechtsvorm (privacy).",
          "Kaart: de gemeentegrenzen zijn een statische weergave van de CBS-gebiedsindeling 2025 (gegeneraliseerd, 100 m-raster); bij een herindeling wijkt de kaartvorm af van de CBS-tabel totdat het curatie-asset is hergegenereerd. Gemeenten zonder cijfer krijgen een eigen neutrale kleur — nooit de null-kleur."
        ]
      },
      {
        "id": "consolidatie",
        "naam": "Consolidatie — groepen achter de kantoren",
        "vraag": "Hoeveel advieskantoren zitten bij dezelfde (uiteindelijke) moeder — en hoe geconcentreerd is de markt daardoor?",
        "definitie": "Actieve AFM-kantoren worden via KvK-nummer gekoppeld aan een actieve LEI (GLEIF-entiteiten) en via de GLEIF Relationship Records aan de geregistreerde ouder: de ultimate parent als die bekend is, anders de direct parent. Kantoren onder dezelfde ouder vormen een groep.",
        "bronvelden": [
          "AFM-index: kvk_nummer, statutaire_naam, actieve_vergunningen",
          "GLEIF entiteiten: kvk_nummer → lei (status=actief)",
          "GLEIF relaties: child_lei → parent_lei, parent_naam (RelationshipStatus=ACTIVE)"
        ],
        "transformatie": "src/distributiemonitor/consolidatie.py::bereken",
        "aggregaties": [
          "groepen (top 15) met leden",
          "verdeling naar groepgrootte (enkelvoudig / 2–4 / 5–9 / 10+)",
          "dekking per koppelstap"
        ],
        "beperkingen": [
          "Waarom de dekking laag is: een LEI is alleen verplicht voor specifieke rollen (uitgevende instellingen, fondsen, kredietinstellingen) — de meeste bemiddelaars registreren er geen; hij leeft op holdinglevel. Ruwweg 88% van de actieve kantoren mét KvK heeft geen LEI in het register: geen koppelfout maar de vorm van de bron.",
          "KvK's worden genormaliseerd (cijfers, voorloopnullen) en bij afwezigheid van een actieve LEI wordt een vervallen LEI mét vlag gebruikt — de entiteit bestaat en haar relaties blijven informatief.",
          "Alleen kantoren mét KvK, LEI én geregistreerde consolidatie-ouder tellen mee: de dekking staat per stap bij elk antwoord — een groep kan groter zijn dan de koppeling ziet.",
          "Relaties zijn zelfgerapporteerd door de entiteiten (GLEIF): niet elke groep registreert zijn structuur; ouders zonder LEI vallen buiten beeld.",
          "Dit is de groepsstructuur op entiteitsniveau; de interactieve netwerkgraaf met tijdslider staat live — KvK-mutaties (oprichting/opheffing) zijn nog niet gekoppeld."
        ]
      },
      {
        "id": "kwaliteit",
        "naam": "Kwaliteitsindex v1 — Kifid-aansluiting en -uitspraken",
        "vraag": "Welke kantoren zijn aangesloten bij de klachtenautoriteit, en bij wie vallen klachtuitspraken?",
        "definitie": "Twee signalen uit het publieke Kifid-register: (1) aansluiting — een actief AFM-kantoor is via zijn AFM-nummer teruggevonden in het Kifid-dienstverlenersregister met status 'aangesloten'; (2) uitspraken — het aantal keren dat een dienstverlener als defendant voorkomt in het uitsprakenregister, gekoppeld via de registernaam naar het AFM-nummer.",
        "bronvelden": [
          "Kifid FSP: afmNumber, name, connectionStatus",
          "Kifid uitspraken: defendant, name, date"
        ],
        "transformatie": "src/distributiemonitor/kwaliteit.py::bereken",
        "aggregaties": [
          "aansluitingsgraad over actieve kantoren",
          "uitspraken per kantoor (top 12)"
        ],
        "beperkingen": [
          "Het Kifid-register kent geen volledige export: dienstverleners worden geoogst via rechtsvorm-zoektermen — namen zonder die fragmenten kunnen ontbreken (aansluitingsgraad is een ondergrens).",
          "Uitspraken worden geoogst via de zoekterm 'klacht': uitspraken zonder die term kunnen ontbreken.",
          "Een uitspraak is géén oordeel over kwaliteit: een groot kantoor krijgt logischerwijs meer klachten. Aantallen zijn context, geen ranking.",
          "Defendant-koppeling loopt via exacte registernaam — handelsnaamvarianten vallen buiten beeld (geteld als niet-gekoppeld)."
        ]
      },
      {
        "id": "nowcast",
        "naam": "Nowcast — de jaargang in september al geschat",
        "vraag": "Waarmee sluit dit jaar af: instroom, uitstroom, netto?",
        "definitie": "Run-rate-projectie van het netto-saldo (instroom minus uitstroom van kantoren) voor het lopende jaar: het netto-YTD wordt geëxtraporeerd met de verhouding tussen netto-YTD en uiteindelijk jaarnetto uit de afgelopen jaren (zelfde maand gemeten). De band toont min/kwartielen/max van die historische verhoudingen.",
        "bronvelden": [
          "vergunningen[].start_datum (eerste start = instroom)",
          "vergunningen[].eind_datum (laatste eind bij alles-beëindigd = uitstroom)"
        ],
        "transformatie": "src/distributiemonitor/nowcast.py::bereken",
        "aggregaties": [
          "netto-YTD (instroom/uitstroom)",
          "projectie: min · q25 · mediaan · q75 · max",
          "maandbeeld: cumulatief netto per maand dit jaar"
        ],
        "beperkingen": [
          "Geen economisch model en geen seizoenscorrectie: de band is uitsluitend de spreiding die de historie laat zien — externe schokken (wetgeving, marktgolven) vallen er buiten.",
          "Uitstroom betekent hier 'laatste Wft-vergunning beëindigd', niet 'kantoor opgehouden te bestaan' (zelfde definitie als de stromen-metric).",
          "Jaren met klein of nul netto worden buiten de run-rate gehouden (≥ 10 netto over het jaar); de mediaan is robuust maar de band kan scheef zijn bij weinig bruikbare jaren."
        ]
      },
      {
        "id": "scenario",
        "naam": "Scenario v1 — wat doet een renteschok met de markt?",
        "vraag": "Beweegt de netto-stroom van kantoren mee met het hypotheekrenteniveau?",
        "definitie": "Per jaar: gemiddelde DNB-hypotheekrente (zuiver nieuwe woninghypotheken, totaal) tegenover de netto-stroom van kantoren (instroom minus uitstroom, zelfde definitie als de stromen-metric). OLS-regressie met 95%-band op de residu-spreiding; scenario's schuiven de rente −2 tot +3 procentpunten op van het huidige niveau.",
        "bronvelden": [
          "DNB reeksen: chart/serie/categorie/periode/waarde",
          "AFM: vergunningen[].start_datum, eind_datum"
        ],
        "transformatie": "src/distributiemonitor/scenario.py::bereken",
        "aggregaties": [
          "rente-nu + laatste 24 maanden",
          "richtingscoefficient (kantoren per procentpunt)",
          "scenario-band per rentestap"
        ],
        "beperkingen": [
          "Correlatie, geen causaliteit: rente en marktactiviteit bewegen samen met vraag, regulatie en conjunctuur — de band toont het historische verband, geen voorspelling.",
          "Jaaraggregaat (n ≈ 20): de schatting is robuust in richting, nauwkeurig in geen van beide richtingen; de band is ruim.",
          "De DNB-API wordt bevraagd met de publieke subscription-key uit het rente-dashboard en alléén met de endpoints die het dashboard zelf gebruikt."
        ]
      },
      {
        "id": "digitalisering",
        "naam": "Digitaliseringsindex — hoe digitaal is de adviesmarkt?",
        "vraag": "Hoeveel kantoren hebben een werkende site, en welke digitale diensten zijn daar zichtbaar?",
        "definitie": "Homepage-scan van kantoorsites uit het Kifid-dienstverlenersregister (gekoppeld via vergunningnummer aan actieve AFM-kantoren). Aanwezigheidssignalen: https, contactformulier, klantportaal/login, online aanvraag, chat, telefoon-nummer-online, e-mail-online, vacatures. De index is het gemiddelde aantal signalen per bereikbare site (0-1); signalen zijn waarnemingen, geen oordeel.",
        "bronvelden": [
          "Kifid FSP: website, afmNumber",
          "homepage-HTML: form/login/aanvraag/chat-patronen, tel:/mailto:"
        ],
        "transformatie": "src/sources/collecties/digitalisering.py (scan) · src/distributiemonitor/digitalisering_metric.py::bereken",
        "aggregaties": [
          "dekking: zaad via Kifid, bereikbaarheid, robots-blokkades",
          "aandeel per signaal onder bereikbare sites",
          "index: gemiddeld aantal signalen per site"
        ],
        "beperkingen": [
          "Zaad = Kifid-geregistreerde URL's (~39% van de dienstverleners): de index meet digitale aanwezigheid waar die zichtbaar is — geen volledige marktmeting.",
          "Alleen de homepage: signalen op diepere pagina's kunnen ontbreken.",
          "robots.txt-blokkades worden gerespecteerd (geteld als geblokkeerd, niet afwezig); de scan is hervatbaar en herhaalt dagelijks."
        ]
      },
      {
        "id": "groei",
        "naam": "Groeiclassificatie — wie groeit en wie krimpt?",
        "vraag": "Hoe ontwikkelt de productgroepen-breedte van elke vestiging zich jaar-op-jaar?",
        "definitie": "Per vestiging: verandering in het aantal actieve productgroepen (uit de vergunningsdata) tussen het huidige en vorige jaar. Absolute groei in procenten; klasse op eigen drempels (sterk_groeiend ≥+20%, groeiend ≥+5%, stabiel ±5%, krimpend ≤−5%, sterk_krimpend <−20%). Relatieve marktpositie: kwartiel t.o.v. alle actieve vestigingen.",
        "bronvelden": [
          "vergunningen[].producten[].omschrijving",
          "vergunningen[].start_datum, eind_datum"
        ],
        "transformatie": "src/distributiemonitor/groei.py::groeiclassificatie",
        "aggregaties": [
          "per_groeiklasse (aantal vestigingen)",
          "per_relatieve_positie (kwartiel)"
        ],
        "beperkingen": [
          "Zonder Kadaster/HDN-productiecijfers is 'groei' hier vergunningsbreedte (aantal productgroepen), geen omzetgroei — eerlijk gelabeld.",
          "Nieuwe vestigingen (vorig jaar 0 groepen) krijgen 100% groei — dit is instroom, geen organische groei."
        ]
      },
      {
        "id": "marktdekking",
        "naam": "Marktdekking — hoe groot is elke deelmarkt?",
        "vraag": "Hoeveel vestigingen zijn actief per productgroep?",
        "definitie": "Aantal actieve vestigingen per productgroep (deelmarkt) in het huidige jaar, met het aandeel van de totale actieve markt.",
        "bronvelden": [
          "vergunningen[].producten[].omschrijving"
        ],
        "transformatie": "src/distributiemonitor/groei.py::marktdekking",
        "aggregaties": [
          "per_deelmarkt (aantal + aandeel)"
        ],
        "beperkingen": [
          "Dekkingsgraad t.o.v. de totale markt vereist externe marktschattingen (Kadaster/HDN) — nog niet beschikbaar."
        ]
      },
      {
        "id": "segmenten_v2",
        "naam": "Segmenten v2 — holding-niveau taxonomie",
        "vraag": "Welk type adviesgroep is dit (specialist, allround, overig)?",
        "definitie": "Eigen taxonomie op holding-niveau, geclassificeerd op basis van de productgroepen-spreiding van de onderliggende vestigingen. Zes segmenten met eigen drempels; criteria en versiehistorie zijn publiek.",
        "bronvelden": [
          "vergunningen[].producten[].omschrijving",
          "GLEIF holding-structuur"
        ],
        "transformatie": "src/distributiemonitor/segmenten_v2.py::classificeer_holding",
        "aggregaties": [
          "per_segment (aantal holdings)"
        ],
        "beperkingen": [
          "Alleen holdings mét GLEIF-koppeling: de dekking is dezelfde ondergrens als de consolidatie-metric.",
          "Nieuwe criteria (v2.1+) worden gepubliceerd mét versiehistorie en changelog in de API."
        ]
      },
      {
        "id": "radar",
        "naam": "Consolidatie Radar — wie neemt over, wie is het volgende doelwit?",
        "vraag": "Welke groepen groeien door overname, en welke onafhankelijke vestigingen zijn logische kandidaten?",
        "definitie": "Vier analyses op de entiteitslaag: (1) consolidator-overzicht: hoofdholdings gerangschikt op vestigingen; (2) structuur per consolidator; (3) doelwit-signalering: onafhankelijke vestigingen mét groeiscore; (4) marktbeweging: consolidatiegraad (groep vs onafhankelijk).",
        "bronvelden": [
          "GLEIF holding-structuur",
          "AFM vergunningen (groei + segment)"
        ],
        "transformatie": "src/distributiemonitor/radar.py::bereken",
        "aggregaties": [
          "consolidator-overzicht (top 20)",
          "onafhankelijke kantoren (top 20, fit-score)",
          "consolidatiegraad (groep vs onafhankelijk)"
        ],
        "beperkingen": [
          "Zonder Kadaster/KvK-mutaties is 'overname' hier zichtbaar via GLEIF-structuren, niet via feitelijke overnamedata — de consolidatiegraad is een ondergrens (dekking ~3%).",
          "Doelwit-scores zijn signalen, geen advies: fit-score = groei × breedte; externe due diligence blijft nodig."
        ]
      },
      {
        "id": "benchmark",
        "naam": "Peer Benchmark — eigen positie t.o.v. vergelijkbare kantoren",
        "vraag": "Waar sta ik binnen mijn peergroep op vergunningsbreedte en groei?",
        "definitie": "Percentiel-indicator per kengetal t.o.v. alle actieve vestigingen (peergroep). Nu beschikbaar: vergunningsbreedte (aantal productgroepen) en groeiklasse. Later: portefeuillewaarde en productie.",
        "bronvelden": [
          "vergunningen[].combinaties",
          "vergunningen[].start_datum, eind_datum"
        ],
        "transformatie": "src/distributiemonitor/benchmark.py::benchmark",
        "aggregaties": [
          "percentiel per kengetal",
          "peergroep-median en kwartielen"
        ],
        "beperkingen": [
          "Zonder Kadaster/HDN is 'breedte' het aantal productgroepen, geen omzet — eerlijk gelabeld als vergunningsbreedte.",
          "Peergroep is voorlopig alle actieve vestigingen; verfijning op segment/regio volgt."
        ]
      },
      {
        "id": "kansmodel",
        "naam": "Structuurscore onafhankelijke kantoren",
        "vraag": "Welke structuurkenmerken hebben onafhankelijke kantoren, uit het openbare register?",
        "definitie": "Beschrijvend model met vijf transparante kenmerken: productbreedte (smal), groei van die breedte (krimpend), rechtsvorm (eenmanszaak/VoF: persoonlijk gebonden), vergunningsduur (≥12 jaar: langdurig geregistreerd), en onafhankelijkheid (geen holding-koppeling). Score 0-100 als de som van de geldende gewichten — een beschrijving van structuur, geen uitspraak over kantoren, eigenaren of transacties.",
        "bronvelden": [
          "vergunningen[].combinaties (breedte)",
          "vergunningen[].start_datum (duur)",
          "index: rechtsvorm",
          "GLEIF: holding-koppeling (onafhankelijkheid)",
          "groeiclassificatie"
        ],
        "transformatie": "src/distributiemonitor/kansmodel.py::bereken",
        "aggregaties": [
          "scorelijst (top 20) met profiel per vestiging",
          "factorbijdragen per vestiging (transparant)"
        ],
        "beperkingen": [
          "Beschrijvend model v2.0: geen machine learning, alleen transparante kenmerkgewichten. De score rangschikt op structuur, niets anders.",
          "De score zegt niets over intenties, plannen of handelingen van kantoren of eigenaren, en is geen voorspelling, beleggings- of overname-advies.",
          "Alleen onafhankelijke vestigingen (niet in een GLEIF-groep) worden gescoord — de dekking is dezelfde ondergrens."
        ]
      },
      {
        "id": "dekking",
        "naam": "Product-dekkingskaarten — wie bedient welke productgroep?",
        "vraag": "Per productgroep (hypotheken, schade, …): hoeveel kantoren zijn actief, en achter welke groepen zitten zij?",
        "definitie": "Kruising van actieve Wft-vergunningen per productgroep (geldig op de peildatum) met de groep waar het kantoor bij is aangesloten: een actieve concern- of volmachtrelatie in het AFM-register. Kantoren zonder actieve relatie vallen onder 'zonder groep'.",
        "bronvelden": [
          "vergunningen[].combinaties (productgroep)",
          "vergunningen[].eind_datum (geldigheid)",
          "relaties.jsonl: type, start/eind (aansluiting)"
        ],
        "transformatie": "src/distributiemonitor/dekking.py::bereken",
        "aggregaties": [
          "per productgroep: totaal actieve kantoren",
          "top-8 groepen met aandeel",
          "aandeel 'zonder groep' per productgroep",
          "koppelingsdekking landelijk"
        ],
        "beperkingen": [
          "De koppeling loopt via geregistreerde concern-/volmachtrelaties: lang niet elke groepsband staat in het register — de zichtbare groepen zijn een ondergrens, 'zonder groep' een bovengrens.",
          "Een aansluiting is geen exclusiviteit: kantoren kunnen voor meerdere groepen bemiddelen; de kaart telt per productgroep éérste actieve relatie."
        ]
      },
      {
        "id": "signaaldossier",
        "naam": "Signaaldossier — alle publieke signalen rond één kantoor",
        "vraag": "Wat laat het openbaar register over dit ene kantoor zien?",
        "definitie": "Verzameling per instelling: vergunningsstarts en -einden mét productgroepen, concernrelaties (start, einde, en gedetecteerde verhuizing van moeder A naar B binnen 400 dagen), Kifid-aansluitingsstatus en -uitspraken als defendant (koppeling via vergunningnummer), AFM-publicaties die de naam noemen (expliciet als naam-match), en gepubliceerde registermutaties uit de wijzigingslog. Optioneel een LLM-samenvatting die uitsluitend het dossier samenvat: elk getal moet letterlijk in het dossier staan, anders wordt de samenvatting niet getoond.",
        "bronvelden": [
          "dossier/{id}.json: vergunningen, relaties",
          "relaties.jsonl (concern-/volmachtrelaties)",
          "Kifid: dienstverleners + uitspraken",
          "AFM-nieuws RSS (naam-match)",
          "wijzigingslog (dataset-versies)"
        ],
        "transformatie": "src/distributiemonitor/signaaldossier.py::bouw · src/distributiemonitor/samenvatting.py::genereer",
        "aggregaties": [
          "chronologische signalenlijst met type, datum, bron",
          "context: onderdelen_actief, aangesloten_bij",
          "LLM-samenvatting (cache per dossier-hash)"
        ],
        "beperkingen": [
          "AFM-publicaties zijn gekoppeld op naam (naam-match), niet op identificatie: een match is een vermelding, geen vastgesteld feit over dit kantoor.",
          "Verhuizingen zijn detecties uit relatie-starts/-einden; het register noteert overnames niet expliciet.",
          "De LLM vat alléén samen; zonder geslaagde borging komt geen samenvatting (het deterministische dossier blijft altijd)."
        ]
      },
      {
        "id": "product",
        "naam": "Productgroep-dashboards — per aanstellingsvorm",
        "vraag": "Hoe ontwikkelt één productgroep (schade, zorg, hypotheken, …) zich in aanstellingen, regio, diensten en groepen?",
        "definitie": "Per Wft-productgroep dezelfde reeksen als het hypotheektab, voor zover het AFM-register reikt: actieve kantoren per jaareinde (zelfde geldigheidsdefinitie als de landelijke voorraadreeks; lopend jaar op de peildatum), instroom (eerste jaar met aanstelling in de groep) en uitstroom (laatste jaar), dienstmix op de peildatum (adviseren/bemiddelen/aanbieden), top concern-/volmachtgroepen plus 'zonder groep', top vestigingsplaatsen en top rechtsvormen.",
        "bronvelden": [
          "vergunningen[].combinaties (productgroep × dienst)",
          "vergunningen[].start_datum, eind_datum",
          "index: rechtsvorm, plaats",
          "relaties.jsonl (groepskoppeling)"
        ],
        "transformatie": "src/distributiemonitor/productgroepen.py::bereken",
        "aggregaties": [
          "per groep: per_jaar, instroom, uitstroom, diensten, groepen, plaatsen, rechtsvormen"
        ],
        "beperkingen": [
          "Relatie- en einddatahistorie is onvolledig vóór ~2015: de reeks begint daar en instroom in het eerste reeksjaar telt alleen kantoren die ná 2015 instroomden.",
          "Groepskoppeling loopt via geregistreerde concern-/volmacht-relaties — dezelfde ondergrens als de dekkingskaarten.",
          "Nog niet ontsloten per groep: Kifid-uitspraken (categorieën dekken meerdere groepen) en externe marktcijfers zoals HDN (alléén hypotheken)."
        ]
      },
      {
        "id": "tijdlijn",
        "naam": "M&A-tijdlijn — grote structuurmutaties per jaar",
        "vraag": "Wanneer verhuisden kantoren van groep naar groep, en welke groepen groeiden of krompen?",
        "definitie": "Per kalenderjaar uit de concern-/volmachtrelaties: verhuizingen (relatie met moeder A beëindigd én binnen 400 dagen aangesloten bij moeder B), instroom (relatie-starts per groep) en uitstroom (relatie-einden per groep), mét drempels (≥3 kantoren per verhuizing, ≥6 per in-/uitstroom).",
        "bronvelden": [
          "relaties.jsonl: start_datum, eind_datum, ouder, kind"
        ],
        "transformatie": "src/distributiemonitor/tijdlijn.py::bereken",
        "aggregaties": [
          "per jaar: verhuizingen totaal + top-events",
          "instroom/uitstroom per groep per jaar"
        ],
        "beperkingen": [
          "Het register noteert overnames niet expliciet: 'verhuizing' is een detectie uit start-/einddata, geen registerfeit over eigendomsoverdracht.",
          "Relatiehistorie is onvolledig vóór ~2015 (opbouw van het register); vroege jaren onderschatten de werkelijke beweging."
        ]
      }
    ],
    "bronnen": [
      {
        "id": "afm-register",
        "naam": "AFM — Register financiële dienstverleners (Wft)",
        "status": "live",
        "endpoint": "/v1/afm/register",
        "voedt": [
          "universum",
          "profielen",
          "stromen",
          "geografie",
          "relatiegraaf",
          "hypotheeksegment"
        ],
        "peilfrequentie": "dagelijks (collectiebron, 24-uurs verversing)",
        "licentie": "hergebruik onder uitdrukkelijke bronvermelding AFM"
      },
      {
        "id": "gleif",
        "naam": "GLEIF — LEI Golden Copy (NL-slice, KvK-brug + relaties)",
        "status": "live",
        "endpoint": "/v1/gleif/register",
        "voedt": [
          "consolidatie",
          "relatiegraaf (naamlookup)"
        ],
        "peilfrequentie": "3× per dag door GLEIF",
        "licentie": "CC0 1.0"
      },
      {
        "id": "afm-nieuws",
        "naam": "AFM — nieuws en handhaving (RSS)",
        "status": "live",
        "endpoint": "/v1/distributiemonitor/kwaliteit",
        "voedt": [
          "kwaliteit (toezichtszijde)"
        ],
        "peilfrequentie": "dagelijks (eigen verversing; historie stapelt)",
        "licentie": "persberichten; hergebruik met bronvermelding AFM"
      },
      {
        "id": "kifid-register",
        "naam": "Kifid — dienstverleners- en uitsprakenregister",
        "status": "live",
        "endpoint": "/v1/distributiemonitor/kwaliteit",
        "voedt": [
          "kwaliteit"
        ],
        "peilfrequentie": "dagelijks (eigen verversing)",
        "licentie": "publiek beschikbaar register"
      },
      {
        "id": "dnb-register",
        "naam": "DNB — Openbaar register",
        "status": "live",
        "endpoint": "/v1/dnb/register",
        "voedt": [
          "toezichtinstellingen-context"
        ],
        "peilfrequentie": "elke werkdag 06:00",
        "licentie": "CC BY 4.0"
      },
      {
        "id": "cbs",
        "naam": "CBS StatLine — wijkdata, demografie, bedrijvendemografie",
        "status": "live",
        "endpoint": "/v1/cbs/kerncijfers",
        "voedt": [
          "geografie: huishoudens per gemeente"
        ],
        "peilfrequentie": "per release (OData live)",
        "licentie": "CC BY 4.0"
      },
      {
        "id": "cbs-pdok-gebiedsindelingen",
        "naam": "CBS/PDOK — gebiedsindelingen 2025 (gemeentegrenzen)",
        "status": "live",
        "endpoint": null,
        "voedt": [
          "geografie: kaartweergave — gemeentegrenzen als compacte SVG-paden (curatie-asset)"
        ],
        "peilfrequentie": "per jaargang (herindeling); asset hergeneren met python3 -m src.distributiemonitor.gemeente_paden",
        "licentie": "CC BY 4.0"
      },
      {
        "id": "kvk",
        "naam": "KvK Handelsregister (SBI 6619x, 6622) — oprichting/opheffing",
        "status": "in_ontwikkeling",
        "endpoint": null,
        "voedt": [
          "consolidatiegraaf (oprichting en opheffing)",
          "instroom- en uitstroomverdieping"
        ],
        "bron_die_komt": "KvK open dataset / API — nog niet gekoppeld"
      },
      {
        "id": "kadaster",
        "naam": "Kadaster — hypotheekinschrijvingen",
        "status": "in_ontwikkeling",
        "endpoint": null,
        "voedt": [
          "hypotheekdistributie per kantoor"
        ],
        "bron_die_komt": "Kadaster open data — nog niet gekoppeld"
      },
      {
        "id": "cdfd",
        "naam": "CDFD — Wft-examenstatistieken",
        "status": "live",
        "endpoint": "/v1/distributiemonitor/hypotheek",
        "voedt": [
          "personenlaag hypotheekdistributie: examens en bevoegde adviseurs"
        ],
        "peilfrequentie": "per kwartaal (na publicatie)",
        "licentie": "persberichten; bronvermelding CDFD"
      },
      {
        "id": "duo",
        "naam": "DUO — persoonsleeftijden adviseurs",
        "status": "niet_publiek",
        "endpoint": null,
        "voedt": [
          "vergrijzing op persoonsleeftijd"
        ],
        "bron_die_komt": "Persoonsleeftijden zijn persoonsgegevens (AVG) en worden niet publiek ontsloten; de monitor toont vergunningsduur-cohorten als eerlijke proxy op kantooriveau."
      },
      {
        "id": "kifid-uitspraken",
        "naam": "Kifid — uitsprakenregister",
        "status": "live",
        "endpoint": "/v1/distributiemonitor/kwaliteit",
        "voedt": [
          "kwaliteit (uitspraken per categorie/jaar, per kantoor)"
        ],
        "peilfrequentie": "dagelijks (eigen verversing via de Kifid-API)",
        "licentie": "publiek beschikbaar register",
        "bron_die_komt": null
      },
      {
        "id": "hdn",
        "naam": "HDN — marktcijfers hypotheekaanvragen",
        "status": "live",
        "endpoint": "/v1/distributiemonitor/hypotheek",
        "voedt": [
          "marktvolume hypotheekaanvragen (maand · kwartaal · jaar)"
        ],
        "peilfrequentie": "maandelijks (persbericht); jaar- en kwartaaloverzichten per publicatie",
        "licentie": "persberichten en rapporten; bronvermelding HDN"
      },
      {
        "id": "dnb-statistieken",
        "naam": "DNB — rentestanden (statistiek-API)",
        "status": "live",
        "endpoint": "/v1/distributiemonitor/scenario",
        "voedt": [
          "scenario: hypotheekrente"
        ],
        "peilfrequentie": "dagelijks (eigen verversing; DNB publiceert maandelijks)",
        "licentie": "publieke statistiekpublicaties; bronvermelding DNB"
      }
    ],
    "taxonomie": {
      "productgroepen": [
        {
          "productgroep": "hypotheken",
          "label": "Hypotheken",
          "afm_producten": [
            "Hypothecair krediet"
          ]
        },
        {
          "productgroep": "consumptief_krediet",
          "label": "Consumptief krediet",
          "afm_producten": [
            "Consumptief krediet"
          ]
        },
        {
          "productgroep": "betalen",
          "label": "Betalen",
          "afm_producten": [
            "Betaalrekeningen",
            "Elektronisch geld"
          ]
        },
        {
          "productgroep": "sparen",
          "label": "Sparen",
          "afm_producten": [
            "Spaarrekeningen"
          ]
        },
        {
          "productgroep": "beleggen",
          "label": "Beleggen",
          "afm_producten": [
            "Vermogen",
            "Deelnemingsrechten in beleggingsinstellingen",
            "Beleggingsobjecten"
          ]
        },
        {
          "productgroep": "schade",
          "label": "Schade",
          "afm_producten": [
            "Schadeverzekeringen particulier",
            "Schadeverzekeringen zakelijk"
          ]
        },
        {
          "productgroep": "zorg",
          "label": "Zorg",
          "afm_producten": [
            "Zorgverzekeringen"
          ]
        },
        {
          "productgroep": "inkomen",
          "label": "Inkomen",
          "afm_producten": [
            "Inkomensverzekeringen"
          ]
        },
        {
          "productgroep": "pensioen",
          "label": "Pensioen",
          "afm_producten": [
            "Pensioenverzekeringen",
            "Premiepensioenvorderingen"
          ]
        }
      ],
      "dienstsoorten": [
        {
          "dienstsoort": "adviseren",
          "label": "Adviseren",
          "afm_diensten": [
            "Adviseren",
            "Adviseren en orders doorgeven"
          ]
        },
        {
          "dienstsoort": "bemiddelen",
          "label": "Bemiddelen",
          "afm_diensten": [
            "Bemiddelen",
            "Optreden als (onder)gevolmachtigd agent",
            "Herverzekeringsbemiddelen"
          ]
        },
        {
          "dienstsoort": "aanbieden",
          "label": "Aanbieden",
          "afm_diensten": [
            "Aanbieden"
          ]
        }
      ],
      "bron": "AFM-register: vergunningen per product (bijlage Gedragstoezicht Wft) per dienst; clustering conform de productindeling van het AFM-rapport Marktmonitor Adviseurs & Bemiddelaars. Code: src/distributiemonitor/segmenten.py"
    },
    "endpoints": {
      "universum": "/v1/distributiemonitor/universum",
      "profielen": "/v1/distributiemonitor/profielen",
      "stromen": "/v1/distributiemonitor/stromen",
      "ontwikkeling": "/v1/distributiemonitor/ontwikkeling",
      "geografie": "/v1/distributiemonitor/geografie",
      "consolidatie": "/v1/distributiemonitor/consolidatie",
      "kwaliteit": "/v1/distributiemonitor/kwaliteit",
      "nowcast": "/v1/distributiemonitor/nowcast",
      "scenario": "/v1/distributiemonitor/scenario",
      "digitalisering": "/v1/distributiemonitor/digitalisering",
      "groei": "/v1/distributiemonitor/groei",
      "marktdekking": "/v1/distributiemonitor/marktdekking",
      "segmenten_v2": "/v1/distributiemonitor/segmenten_v2",
      "radar": "/v1/distributiemonitor/radar",
      "benchmark": "/v1/distributiemonitor/benchmark",
      "kansmodel": "/v1/distributiemonitor/kansmodel",
      "hypotheek": "/v1/distributiemonitor/hypotheek",
      "dekking": "/v1/distributiemonitor/dekking"
    }
  }
}