Naar de inhoud
Subsido

Matching

Voorwaarden als regels

Een kleine, gesloten taal voor de voorwaarden van een maatregel, geëvalueerd met drie waarden: pass, fail en unknown.

eligibility.rules van een maatregel is een lijst van regelknopen die allemaal moeten kloppen. De matcher evalueert ze tegen de gegevens van een matchverzoek; de volledige record geeft ze zoals ze zijn, zodat je ze zelf kunt tonen of evalueren. Thema’s staan er bewust los van: een thema is een reden om een maatregel te tonen, een regel is een voorwaarde waaraan je moet voldoen.

Knopen

KnoopVormResultaat
voorwaarde{ id, field, op, value, label?, provenance }Vergelijkt één gegeven met een waarde: pass, fail, of unknown als het gegeven ontbreekt.
all{ "all": [nodes] }Fail als een kind faalt; anders unknown als een kind unknown is; anders pass.
any{ "any": [nodes] }Pass als een kind slaagt; anders unknown als een kind unknown is (of de lijst leeg is); anders fail.
not{ "not": node }Pass en fail wisselen om; unknown blijft unknown.

Knopen worden onderscheiden door hun sleutels. De lijst op het hoogste niveau is een impliciete all. De id van een voorwaarde is stabiel binnen haar maatregel (region, size, applicant_type, nace, age_max), en zo kan de change feed zeggen welke regel veranderde: eligibility.rules[age_max].

Dit zijn de regels van de federale tax shelter voor startende ondernemingen: de toets voor kleine vennootschappen uit het Wetboek van vennootschappen en verenigingen (minstens twee van de drie criteria) als een any van drie paren, gevolgd door een leeftijdsgrens. De herkomst is ingekort in de eerste zes.

[
  {
    "any": [
      {
        "all": [
          {
            "id": "size",
            "field": "company.employees",
            "op": "lte",
            "value": 50,
            "provenance": "…"
          },
          {
            "id": "size_turnover_a",
            "field": "company.turnover_eur",
            "op": "lte",
            "value": 11250000,
            "provenance": "…"
          }
        ]
      },
      {
        "all": [
          {
            "id": "size_employees_b",
            "field": "company.employees",
            "op": "lte",
            "value": 50,
            "provenance": "…"
          },
          {
            "id": "size_balance_b",
            "field": "company.balance_sheet_eur",
            "op": "lte",
            "value": 6000000,
            "provenance": "…"
          }
        ]
      },
      {
        "all": [
          {
            "id": "size_turnover_c",
            "field": "company.turnover_eur",
            "op": "lte",
            "value": 11250000,
            "provenance": "…"
          },
          {
            "id": "size_balance_c",
            "field": "company.balance_sheet_eur",
            "op": "lte",
            "value": 6000000,
            "provenance": "…"
          }
        ]
      }
    ]
  },
  {
    "id": "age_max",
    "field": "company.age_years",
    "op": "lt",
    "value": 4,
    "label": {
      "nl": "In de eerste vier jaar na de oprichting",
      "fr": "Dans les quatre premières années après la constitution",
      "en": "Within the first four years after incorporation",
      "de": null
    },
    "provenance": {
      "method": "curated",
      "source_url": "https://financien.belgium.be/nl/ondernemingen/tax-shelter-kleine-ondernemingen/startende-start-up",
      "source_section": null,
      "review_status": "verified",
      "reviewed_at": "2026-09-27",
      "note": "Completed years: the fifth year after incorporation belongs to the scale-up regime."
    }
  }
]

Drie waarden

Een gegeven dat de aanroeper niet meegaf, is onbekend, nooit verondersteld. Dat geldt ook voor een gegeven met een vorm die de operator niet kan vergelijken, en voor een regel met een misvormde waarde: een kapotte regel slaagt nooit per ongeluk. De uitkomst van de hele boom is een van de drie, en die bepaalt de matchstatus. De gegevens die onbekend waren terwijl ze de uitkomst konden veranderen, komen terug als unknowns; zodra een boom beslist is (een fail in een all, een pass in een any), vallen de onbekenden weg, want er valt niets meer te vragen.

Velden

Een gesloten lijst: een regel over een gegeven dat de matcher niet kan krijgen, zou altijd onbekend blijven. request_path is de eigenschap van het matchverzoek die het gegeven levert, en waar unknowns en missing_information naar verwijzen.

fieldTyperequest_pathBetekenis
company.regionslijst van gewestencompany.regionGewesten waar de onderneming een vestiging heeft (haar zetel of een vestigingseenheid).
company.provinceprovinciecompany.provinceDe provincie waar ze gevestigd is.
company.sizegroottecategoriecompany.sizemicro, small, medium of large.
company.employeesgetalcompany.employeesPersoneel (VTE).
company.turnover_eurgetalcompany.turnover_eurJaaromzet.
company.balance_sheet_eurgetalcompany.balance_sheet_eurBalanstotaal.
company.nacelijst van codescompany.naceNACE-BEL-codes, zonder punten.
company.legal_formrechtsvormcompany.legal_formbv, nv, cv, vzw, eenmanszaak, ...
company.applicant_typetype aanvragercompany.applicant_typecompany, self_employed, non_profit, ...
company.age_yearsgetalcompany.founded_onVolledige jaren sinds de oprichting.
company.has_legal_personalitybooleancompany.has_legal_personalityOf ze rechtspersoonlijkheid heeft.
company.de_minimis_received_eurgetalcompany.de_minimis_received_eurDe-minimissteun over de laatste drie jaar.
company.in_difficultybooleancompany.in_difficultyEen onderneming in moeilijkheden.
project.topicslijst van thema’sproject.topicsWaar het project over gaat.
project.budget_eurgetalproject.budget_eurDe kostprijs van het project.
project.startedbooleanproject.startedOf het al begonnen is (het stimulerend effect).
project.regiongewestproject.regionWaar het project plaatsvindt.
project.cost_typeslijst van kostensoortenproject.cost_typesDe kosten waarvoor steun gezocht wordt.
project.duration_monthsgetalproject.duration_monthsHoe lang het duurt.
project.partnersgetalproject.partnersOnafhankelijke partners, de aanvrager inbegrepen.

GET /v1/taxonomy geeft dezelfde lijst als rule_fields, elk veld met de vraag die je stelt, in het Nederlands, Frans en Engels.

Operatoren

Strings worden vergeleken zonder onderscheid tussen hoofd- en kleine letters. Getallen mogen als JSON-getal of als numerieke string.

opvalueSlaagt als
eq, instring of lijstHet gegeven is een van de waarden. Bij een lijstgegeven (meerdere NACE-codes) moet elk element een van de waarden zijn. Vergelijkt ook twee booleans, of twee losse getallen, op gelijkheid.
ne, not_instring of lijstGeen enkel element van het gegeven is een van de waarden.
contains_anylijstEen lijstgegeven heeft minstens één element gemeen met de waarde.
contains_alllijstElk element van de waarde zit in het gegeven.
contains_nonelijstHet gegeven heeft geen enkel element gemeen met de waarde.
gte, gt, lte, ltgetalDe numerieke vergelijking klopt.
between[min, max]min ≤ gegeven ≤ max. Alles behalve precies twee grenzen geeft unknown.
is_true, is_falsegenegeerdHet booleaanse gegeven is true, of false.
nace_anylijst van codesMinstens één van de codes van de onderneming valt onder een van de codes in de waarde: een cijferprefix (62 omvat 62010) of een NACE-sectieletter (J omvat 62010).
nace_nonelijst van codesGeen enkele code van de onderneming valt onder een van de codes in de waarde. Een lege lijst van codes van de onderneming geeft unknown voor beide NACE-operatoren.

Labels

Een regel kan een eigen label hebben ({ nl, fr, en, de }), meestal de woorden van de officiële pagina; heeft hij er geen, dan ontbreekt het veld in de record. Anders wordt een label opgesteld uit veld, operator en waarde, in elke taal van de dienst: Project cost at least €25,000, Projectkost minstens € 25.000, Coût du projet au moins 25 000 €. De reasons van een match bevatten het label in de taal die je vroeg.

Herkomst en reviewstatus

Elke voorwaarde vermeldt waar ze vandaan komt:

VeldBetekenis
methodstructuredhtml_sectiontext_patternsource_categorykeywordscuratedderived
source_urlDe pagina waarvan de regel gelezen werd.
source_sectionDe titel van de sectie waaruit ze gelezen werd (“Wie komt in aanmerking?”, “Art. 1:24 WVV”).
review_statusauto: aangemaakt uit een gestructureerd veld. unreviewed: met een patroon uit de tekst gehaald. verified: nagekeken aan de hand van de officiële pagina, op reviewed_at.
reviewed_atYYYY-MM-DD, bij geverifieerde regels.
noteWat de regel niet kan zien, of waarom hij zo geschreven is.

Waar regels vandaan komen

  • Uit gestructureerde velden: een regionale maatregel krijgt een regel region (contains_any op company.regions), een beperking op grootte een regel size, een lijst van types aanvragers een regel applicant_type, sectorlijsten regels nace en nace_excluded. Hun review_status is auto.
  • Uit patronen in de tekst (bijvoorbeeld een maximum- of minimumleeftijd van de onderneming): method is text_pattern, review_status is unreviewed.
  • Opgesteld aan de hand van de officiële pagina: method is curated, review_status is verified. Zo’n regel vervangt de automatische regel met dezelfde id.

rules_basis van de maatregel vat dit samen (none, derived, extracted, curated), en confidence zegt in welke mate de regels vatten wat bepaalt wie in aanmerking komt: 0,9 voor handmatig opgestelde regels tenzij anders ingesteld, 0,6 voor geëxtraheerde, 0,45 voor afgeleide. Alleen curated of extracted regels met 0,7 of meer kunnen een match likely_eligible maken.

Wat de regels niet zien

Regels dekken wat je over een onderneming en een project kunt vaststellen. Ze zien geen verbonden ondernemingen, geen steun die de onderneming kreeg buiten wat je meestuurt, niet of een overheid nog budget heeft, en geen voorwaarden die alleen een dossieronderzoek kan nagaan. Daarom is de sterkste status “waarschijnlijk”, en daarom linkt elke match naar de officiële pagina.