Skip to content
Subsido

The data

The subsidy record

One record shape for every measure from every source. Fields are added, never renamed, and every field is always present: what does not apply is null or an empty list, never missing.

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.

Identity and text

FieldMeaning
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).
slugFor 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, summariesLocalised 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_basisgenerated (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.

Status

FieldMeaning
statusforthcomingopencontinuouspausedbudget_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_basissourcedatesrollingunknown 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_noteLocalised. Why the status is what it is, in the source’s words, for an open_licence source that says so.

What kind of support, from whom

FieldMeaning
instrument_typegrantrebatevouchertax_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_leveleufederalcommunityregionprovincemunicipalityagencyother
programmeAn EU call, or a numbered programme a national measure belongs to: { name, code, call_id, call_title, topic_id, types_of_action[] }, or null.

When: application_window

FieldMeaning
opens_atWhen applications open, or null.
closes_atThe 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.
rollingApplications are accepted at any time.
budget_exhaustion_possibleFirst 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.

How much: funding

FieldMeaning
currencyAlways EUR today.
rate_min, rate_maxPercent 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_maxPer award, in euros.
annual_capA ceiling per beneficiary per year.
programme_budget, expected_grantsThe whole call’s or scheme’s budget, and how many awards it expects.
min_project_costA minimum project size to qualify at all.
calculation_basisLocalised text explaining how the amount is computed, when that is known.
de_minimisGranted under the de minimis regulation (EU 2023/2831, €300,000 over three years). null: the source does not say.

Where: geography

FieldMeaning
scopeeunationalregionalprovinciallocal
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.

Who: eligibility

FieldMeaning
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_basisnonederivedextractedcurated 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.
confidence0 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

How to apply: application

FieldMeaning
urlWhere to apply, or the official page describing how.
channelonlineemailportalpaperautomaticunknown
portalThe 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.

Where it came from: provenance

FieldMeaning
source_id, source_urlThe primary source and the page the record was read from.
source_license, rights_mode, attributionThe 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_atThe source’s own "last modified" statement, which is not when it was fetched.
first_seen_atWhen the measure was first seen.
last_checked_atWhen a source was last fetched and still said this. Checking without a change updates this and nothing else.
content_hashSHA-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.
fieldsField path to { source_id, method, section }, for the fields a decision rests on. method is one of structuredhtml_sectiontext_patternsource_categorykeywordscuratedderived

Fields the read path adds

FieldMeaning
title, summaryIn the language asked for (lang), else Dutch, French, English, German, whichever exists. title falls back to the id.
summary_originsource 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.
languageThe language you asked for.
versionThe current version number, from 1.
first_seen_at, last_changed_atWhen the measure appeared, and when its content last changed.
withdrawn_atWhen 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
linksself and versions in the API, official (the authority’s page) and web (the measure on the website, in your language).
disclaimerThe independence sentence.
merged_fromOnly when you asked for an id that was merged into this record.
as_of, valid_from, valid_toOnly with as_of, or on a version.
cause, changesOnly on GET /v1/subsidies/{id}/versions/{version}.

The compact view

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.