A measure is served as its canonical record plus a few fields only the read path knows (the title in your language, the version, freshness and links). The same record is what view=full, the export, the versions and the MCP get_subsidy tool return. Unknown is always an explicit value (status: "unknown", de_minimis: null) rather than a guess.
{
"id": "federal:investeringsaftrek",
"slug": "investeringsaftrek",
"external_ids": [
{
"source": "curated_federal",
"id": "investeringsaftrek"
}
],
"titles": {
"nl": "Investeringsaftrek",
"fr": "Déduction pour investissement",
"en": "Investment deduction",
"de": null
},
"summaries": {
"nl": "Fiscale aftrek van FOD Financiën voor vennootschappen, zelfstandigen en landbouwers in België. Dekt 10% tot 40% van de kosten. Doorlopend aan te vragen.",
"fr": "Déduction fiscale du SPF Finances pour les sociétés, indépendants et agriculteurs en Belgique. Couvre de 10 % à 40 % des coûts. Demande possible en continu.",
"en": "Tax deduction from FOD Financiën for companies, self-employed people and farmers in Belgium. Covers 10% to 40% of eligible costs. Applications accepted at any time.",
"de": null
},
"summary_basis": "generated",
"status": "continuous",
"status_basis": "rolling",
"status_note": {
"nl": null,
"fr": null,
"en": null,
"de": null
},
"instrument_type": "tax_deduction",
"issuer": {
"id": "fod-financien",
"name": "FOD Financiën",
"government_level": "federal",
"jurisdiction": "be",
"url": "https://financien.belgium.be"
},
"programme": null,
"application_window": {
"opens_at": null,
"closes_at": null,
"deadlines": [],
"rolling": true,
"budget_exhaustion_possible": false
},
"funding": {
"currency": "EUR",
"rate_min": 10,
"rate_max": 40,
"rates": [
{
"company_size": null,
"rate": 10,
"note": "Basisaftrek: natuurlijke personen en kleine vennootschappen (art. 1:24 WVV)."
},
{
"company_size": null,
"rate": 40,
"note": "Verhoogde thematische aftrek: natuurlijke personen en kleine vennootschappen."
}
],
"amount_min": null,
"amount_max": null,
"annual_cap": null,
"programme_budget": null,
"expected_grants": null,
"min_project_cost": null,
"calculation_basis": {
"nl": null,
"fr": null,
"en": null,
"de": null
},
"de_minimis": null
},
"geography": {
"scope": "national",
"countries": [
"BE"
],
"regions": [],
"provinces": [],
"municipalities": [],
"nis_codes": [],
"nuts_codes": []
},
"eligibility": {
"applicant_types": [
"company",
"self_employed",
"farmer"
],
"company_sizes": [],
"nace": [],
"topics": [
"investment",
"digitalisation",
"energy_efficiency",
"renewable_energy"
],
"eligible_costs": [
"equipment",
"buildings",
"software",
"vehicles",
"intellectual_property"
],
"rules": [
{
"id": "applicant_type",
"field": "company.applicant_type",
"op": "in",
"value": [
"company",
"self_employed",
"farmer"
],
"label": {
"nl": "Nijverheids-, handels- of landbouwonderneming, of vrij beroep",
"fr": "Entreprise industrielle, commerciale ou agricole, ou profession libérale",
"en": "Industrial, commercial or agricultural business, or liberal profession",
"de": null
},
"provenance": {
"method": "curated",
"source_url": "https://financien.belgium.be/nl/ondernemingen/vennootschapsbelasting/belastingvoordelen/investeringsaftrek",
"source_section": "Wie kan de investeringsaftrek genieten?",
"review_status": "verified",
"reviewed_at": "2026-09-27",
"note": null
}
}
],
"rules_basis": "curated",
"confidence": 0.9
},
"application": {
"url": "https://financien.belgium.be/nl/ondernemingen/vennootschapsbelasting/belastingvoordelen/investeringsaftrek",
"channel": "automatic",
"portal": null,
"documents": []
},
"legal_basis": [
"Art. 68 tot 77, 201 en 552 WIB 92",
"Art. 47 tot 49/1 KB/WIB 92"
],
"provenance": {
"source_id": "curated_federal",
"source_url": "https://financien.belgium.be/nl/ondernemingen/vennootschapsbelasting/belastingvoordelen/investeringsaftrek",
"source_license": "FOD Financiën gebruiksvoorwaarden (Creative Commons-0)",
"rights_mode": "facts_only",
"attribution": "Source: FOD Financiën / SPF Finances and RSZ / ONSS official pages; records written by Subsido.",
"source_last_modified_at": "2026-04-01T09:55:52+02:00",
"first_seen_at": "2026-09-27T05:40:02+02:00",
"last_checked_at": "2026-09-27T06:00:12+02:00",
"content_hash": "9f2c…",
"sources": [
{
"source_id": "curated_federal",
"external_id": "investeringsaftrek",
"url": "https://financien.belgium.be/nl/ondernemingen/vennootschapsbelasting/belastingvoordelen/investeringsaftrek",
"role": "primary"
}
],
"fields": {
"status": {
"source_id": "curated_federal",
"method": "derived",
"section": null
},
"funding.rate_max": {
"source_id": "curated_federal",
"method": "curated",
"section": null
}
}
},
"title": "Investment deduction",
"rules_readable": {
"conditions": [
{
"id": "applicant_type",
"field": "company.applicant_type",
"op": "in",
"value": [
"company",
"self_employed",
"farmer"
],
"label": "Industrial, commercial or agricultural business, or liberal profession",
"provenance": {
"method": "curated",
"source_url": "https://financien.belgium.be/nl/ondernemingen/vennootschapsbelasting/belastingvoordelen/investeringsaftrek",
"source_section": "Wie kan de investeringsaftrek genieten?",
"review_status": "verified",
"reviewed_at": "2026-09-27",
"note": null
}
}
],
"text": [
"Industrial, commercial or agricultural business, or liberal profession"
]
},
"summary": "Tax deduction from FOD Financiën for companies, self-employed people and farmers in Belgium. Covers 10% to 40% of eligible costs. Applications accepted at any time.",
"summary_origin": "generated",
"language": "en",
"version": 2,
"first_seen_at": "2026-09-27T05:40:02+02:00",
"last_changed_at": "2026-09-27T05:52:40+02:00",
"withdrawn_at": null,
"freshness": {
"state": "fresh",
"last_successful_fetch": "2026-09-27T06:00:12+02:00",
"expected_refresh_seconds": 86400,
"stale_after_seconds": 259200
},
"links": {
"self": "https://api.subsido.be/v1/subsidies/federal:investeringsaftrek",
"versions": "https://api.subsido.be/v1/subsidies/federal:investeringsaftrek/versions",
"official": "https://financien.belgium.be/nl/ondernemingen/vennootschapsbelasting/belastingvoordelen/investeringsaftrek",
"web": "https://subsido.be/en/grants/investeringsaftrek"
},
"disclaimer": "Independent service. Not affiliated with, endorsed by, or operated by any government or public authority. Eligibility and awards are decided by the competent authority."
}
Illustrative values from a curated federal record; the shape is the contract.
| Field | Meaning |
|---|
| id | <source prefix>:<the source’s own id>, minted once and never changed. Upper case is kept where the source uses it (EU topic ids). |
| slug | For URLs on the website, in the measure’s primary language. Accepted in place of the id in /v1/subsidies/{id} paths, but not in filters. Unique; still, store the id, which is the one promised never to change. |
| external_ids[] | { source, id }: every identifier a source uses for this measure. |
| titles, summaries | Localised text: { nl, fr, en, de }, each a string or null. A title exists only in the languages the source published it in; titles are not translated. |
| summary_basis | generated (generated from the record’s facts, in Dutch, French and English) or source (the source’s own summary, for an open_licence source, with the missing languages generated). For the summary served in your language, summary_origin says which; see sources and provenance. |
| legal_basis[] | The legal texts the measure rests on, as the source cites them. |
| Field | Meaning |
|---|
| status | forthcomingopencontinuouspausedbudget_exhaustedclosedunknown Whether an application can be made. continuous is a permanent scheme with no deadline; paused is temporarily not accepting applications; budget_exhausted closed early because the money ran out. |
| status_basis | sourcedatesrollingunknown How the status was decided. An explicit statement by the source outranks a status worked out from dates: a call can close early or be suspended while its published deadline is months away. |
| status_note | Localised. Why the status is what it is, in the source’s words, for an open_licence source that says so. |
| Field | Meaning |
|---|
| instrument_type | grantrebatevouchertax_credittax_deductiontax_exemptionsocial_security_reductionwage_subsidyloanguaranteerepayable_advanceequityin_kindprizeother |
| issuer | { id, name, government_level, jurisdiction, url }. id is a stable slug (vlaio, fod-financien, european-commission); jurisdiction is be, flanders, brussels, wallonia, eu, and so on. |
| issuer.government_level | eufederalcommunityregionprovincemunicipalityagencyother |
| programme | An EU call, or a numbered programme a national measure belongs to: { name, code, call_id, call_title, topic_id, types_of_action[] }, or null. |
| Field | Meaning |
|---|
| opens_at | When applications open, or null. |
| closes_at | The next deadline still ahead, or the last one when all have passed. Null for a rolling scheme. |
| deadlines[] | { at, date_only, label }, earliest first. Multi-stage calls and cut-offs have several. date_only means the source gave a date and no time, and at is then 23:59:59 Brussels time that day. label is “First stage”, “Cut-off 2”, and so on. |
| rolling | Applications are accepted at any time. |
| budget_exhaustion_possible | First come, first served: the scheme can close before any deadline when the budget runs out, so a deadline alone does not say how long there is. |
| Field | Meaning |
|---|
| currency | Always EUR today. |
| rate_min, rate_max | Percent of eligible costs, 0 to 100. |
| rates[] | { company_size, rate, note }: a rate that depends on who applies. company_size is null when the tier is by something else, and the note says what. |
| amount_min, amount_max | Per award, in euros. |
| annual_cap | A ceiling per beneficiary per year. |
| programme_budget, expected_grants | The whole call’s or scheme’s budget, and how many awards it expects. |
| min_project_cost | A minimum project size to qualify at all. |
| calculation_basis | Localised text explaining how the amount is computed, when that is known. |
| de_minimis | Granted under the de minimis regulation (EU 2023/2831, €300,000 over three years). null: the source does not say. |
| Field | Meaning |
|---|
| scope | eunationalregionalprovinciallocal |
| countries[] | ISO 3166-1 alpha-2. ["BE"] for every Belgian measure; empty for an EU call, where the member states are implied. |
| regions[] | flandersbrusselswallonia |
| provinces[] | antwerplimburgeast_flanderswest_flandersflemish_brabantwalloon_brabanthainautliegeluxembourgnamur |
| municipalities[], nis_codes[], nuts_codes[] | For local measures, when the source says. |
| Field | Meaning |
|---|
| applicant_types[] | companyself_employednon_profitpublic_bodyresearch_organisationindividualfarmersocial_enterprise Empty means the source does not restrict (or does not say). |
| company_sizes[] | microsmallmediumlarge The EU SME bands. Empty means no size restriction. |
| nace[] | { version, code, mode }: version is 2025 (NACE-BEL 2025) or 2008; code is a code or a prefix without dots (62, 6201), or a section letter; mode is included or excluded. |
| topics[] | What the measure is for, from the topic list below. For search and relevance only: a topic is a reason to show a measure, never a reason a company qualifies. |
| eligible_costs[] | trainingconsultancyequipmentbuildingssoftwarepersonnelresearchprototypingmarketingtrade_fairstravelintellectual_propertycertificationrecruitmentvehiclesenergysubcontractingother |
| rules[] | Machine-evaluable conditions, all of which must hold. See eligibility rules. |
| rules_basis | nonederivedextractedcurated Where the rules came from, in increasing order of trust: no rules, structured fields only, also patterns in the text, or written and checked by a person against the official page. |
| confidence | 0 to 1: how much of what decides eligibility the rules capture. Curated rules score high (0.9 by default); rules from structured fields 0.45; rules found in text 0.6. A match says likely_eligible only at 0.7 or above. |
Topics
Deterministic: keyword stems over the title and text, plus the source’s own categories mapped per source. No model guesses a topic, so the same input always gives the same tags.
digitalisationcybersecurityartificial_intelligenceinnovationresearch_developmentenergy_efficiencyrenewable_energyenergyclimate_environmentcircular_economysustainable_mobilityinvestmenttrainingadvice_consultancyinternationalisationhiring_employmentstarting_businessgrowth_scaleupfinancingtransformationagriculturefisheriestourism_hospitalityculture_creativeconstruction_renovationhealth_life_sciencessocial_economyretail_commercewatermanufacturingintellectual_propertyinclusion_diversitycooperationspace_defencecrisis_support
| Field | Meaning |
|---|
| url | Where to apply, or the official page describing how. |
| channel | onlineemailportalpaperautomaticunknown |
| portal | The portal’s name when there is one (VLAIO e-loket, MyMinfin, the EU Funding & Tenders Portal). automatic means no application: the measure applies through a tax return or by itself. |
| documents[] | Documents the application needs, when the source lists them. |
| Field | Meaning |
|---|
| source_id, source_url | The primary source and the page the record was read from. |
| source_license, rights_mode, attribution | The licence that applies, what the record contains because of it (open_licence, facts_only, link_only), and the attribution the licence asks for, when it asks. See sources and provenance. |
| source_last_modified_at | The source’s own "last modified" statement, which is not when it was fetched. |
| first_seen_at | When the measure was first seen. |
| last_checked_at | When a source was last fetched and still said this. Checking without a change updates this and nothing else. |
| content_hash | SHA-256 of the record without its volatile fields. Changes exactly when the content changes. |
| sources[] | { source_id, external_id, url, role }: every source describing the measure, the primary first, then secondary ones. |
| fields | Field path to { source_id, method, section }, for the fields a decision rests on. method is one of structuredhtml_sectiontext_patternsource_categorykeywordscuratedderived |
| Field | Meaning |
|---|
| title, summary | In the language asked for (lang), else Dutch, French, English, German, whichever exists. title falls back to the id. |
| summary_origin | source or generated: whether the summary served in this language is the source’s own text or generated from the record’s facts. A record with summary_basis: "source" can still serve a generated summary in a language the source did not write. |
| rules_readable | { conditions, text }: every condition in eligibility.rules, flattened, with its label in your language and its provenance, and each top-level rule as a sentence. For showing the rules without walking the tree. |
| language | The language you asked for. |
| version | The current version number, from 1. |
| first_seen_at, last_changed_at | When the measure appeared, and when its content last changed. |
| withdrawn_at | When the source stopped publishing it, or null. |
| freshness | { state, last_successful_fetch, expected_refresh_seconds, stale_after_seconds } of the source. state is freshdelayedstalesource_unavailableparse_errorneeds_reviewdisablednever_run |
| links | self and versions in the API, official (the authority’s page) and web (the measure on the website, in your language). |
| disclaimer | The independence sentence. |
| merged_from | Only when you asked for an id that was merged into this record. |
| as_of, valid_from, valid_to | Only with as_of, or on a version. |
| cause, changes | Only on GET /v1/subsidies/{id}/versions/{version}. |
Lists default to view=compact: id, slug, title, summary, summary_origin, titles, status, instrument_type, issuer, scope, regions, topics, company_sizes, opens_at, closes_at, rolling, rate_max, amount_max, annual_cap, rules_basis, source_id, rights_mode, version, last_changed_at, last_checked_at, freshness and links. The nested fields are lifted to the top (closes_at is application_window.closes_at).
Parse defensively
New fields and new enum members can appear in /v1 at any time. Ignore fields you do not know, and treat an enum value you do not know as other or unknown rather than failing. Renames and removals would be a new API version.
- Every vocabulary, with labels in three languages, is at
GET /v1/taxonomy. - The same shapes are in the OpenAPI document as
Subsidy, SubsidyFull and SubsidyCompact; see the reference.