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
| Knoop | Vorm | Resultaat |
|---|---|---|
| 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.
| field | Type | request_path | Betekenis |
|---|---|---|---|
| company.regions | lijst van gewesten | company.region | Gewesten waar de onderneming een vestiging heeft (haar zetel of een vestigingseenheid). |
| company.province | provincie | company.province | De provincie waar ze gevestigd is. |
| company.size | groottecategorie | company.size | micro, small, medium of large. |
| company.employees | getal | company.employees | Personeel (VTE). |
| company.turnover_eur | getal | company.turnover_eur | Jaaromzet. |
| company.balance_sheet_eur | getal | company.balance_sheet_eur | Balanstotaal. |
| company.nace | lijst van codes | company.nace | NACE-BEL-codes, zonder punten. |
| company.legal_form | rechtsvorm | company.legal_form | bv, nv, cv, vzw, eenmanszaak, ... |
| company.applicant_type | type aanvrager | company.applicant_type | company, self_employed, non_profit, ... |
| company.age_years | getal | company.founded_on | Volledige jaren sinds de oprichting. |
| company.has_legal_personality | boolean | company.has_legal_personality | Of ze rechtspersoonlijkheid heeft. |
| company.de_minimis_received_eur | getal | company.de_minimis_received_eur | De-minimissteun over de laatste drie jaar. |
| company.in_difficulty | boolean | company.in_difficulty | Een onderneming in moeilijkheden. |
| project.topics | lijst van thema’s | project.topics | Waar het project over gaat. |
| project.budget_eur | getal | project.budget_eur | De kostprijs van het project. |
| project.started | boolean | project.started | Of het al begonnen is (het stimulerend effect). |
| project.region | gewest | project.region | Waar het project plaatsvindt. |
| project.cost_types | lijst van kostensoorten | project.cost_types | De kosten waarvoor steun gezocht wordt. |
| project.duration_months | getal | project.duration_months | Hoe lang het duurt. |
| project.partners | getal | project.partners | Onafhankelijke 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.
| op | value | Slaagt als |
|---|---|---|
| eq, in | string of lijst | Het 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_in | string of lijst | Geen enkel element van het gegeven is een van de waarden. |
| contains_any | lijst | Een lijstgegeven heeft minstens één element gemeen met de waarde. |
| contains_all | lijst | Elk element van de waarde zit in het gegeven. |
| contains_none | lijst | Het gegeven heeft geen enkel element gemeen met de waarde. |
| gte, gt, lte, lt | getal | De numerieke vergelijking klopt. |
| between | [min, max] | min ≤ gegeven ≤ max. Alles behalve precies twee grenzen geeft unknown. |
| is_true, is_false | genegeerd | Het booleaanse gegeven is true, of false. |
| nace_any | lijst van codes | Minstens éé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_none | lijst van codes | Geen 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:
| Veld | Betekenis |
|---|---|
| method | structuredhtml_sectiontext_patternsource_categorykeywordscuratedderived |
| source_url | De pagina waarvan de regel gelezen werd. |
| source_section | De titel van de sectie waaruit ze gelezen werd (“Wie komt in aanmerking?”, “Art. 1:24 WVV”). |
| review_status | auto: 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_at | YYYY-MM-DD, bij geverifieerde regels. |
| note | Wat 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_anyopcompany.regions), een beperking op grootte een regelsize, een lijst van types aanvragers een regelapplicant_type, sectorlijsten regelsnaceennace_excluded. Hunreview_statusisauto. - Uit patronen in de tekst (bijvoorbeeld een maximum- of minimumleeftijd van de onderneming):
methodistext_pattern,review_statusisunreviewed. - Opgesteld aan de hand van de officiële pagina:
methodiscurated,review_statusisverified. 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
