The data
Searching measures
GET /v1/subsidies lists and searches measures; GET /v1/subsidies/{id} reads one, by id or by slug, now or as it stood on a date.
Listing and searching
curl "https://api.subsido.be/v1/subsidies?q=energie®ion=wallonia&instrument_type=grant,rebate&status=open,continuous&sort=deadline&lang=fr" \ -H "Authorization: Bearer sb_live_..."Every filter is optional. A list parameter takes comma-separated values and matches any of them; different parameters must all hold. Vocabulary values are checked, so region=bavaria is a 400 that names the accepted values rather than an empty list, and a parameter the route does not know (a typo such as regoin) is refused rather than ignored. A parameter given twice is refused too: use a comma list.
| Parameter | Matches |
|---|---|
| q | Words in any language, at most 200 characters. Every word must match the start of a word in the title or text, accents and case ignored (digitali finds digitalisering and digitalisation); a close match on the title also counts. Sorts by relevance unless you give sort. |
| region | flandersbrusselswallonia Measures available to a company there: the region’s own, plus every national and EU measure, which apply everywhere. |
| company_size | One of microsmallmediumlarge (the company’s own, so exactly one). Measures naming that size, and measures that do not restrict size. |
| topic | Comma list of topic ids. Measures tagged with any of them. GET /v1/taxonomy lists the 35 topics. |
| instrument_type | grantrebatevouchertax_credittax_deductiontax_exemptionsocial_security_reductionwage_subsidyloanguaranteerepayable_advanceequityin_kindprizeother |
| status | forthcomingopencontinuouspausedbudget_exhaustedclosedunknown Default: every status. open,continuous,forthcoming is what can be applied for. |
| government_level | eufederalcommunityregionprovincemunicipalityagencyother |
| scope | eunationalregionalprovinciallocal |
| issuer | Comma list of issuer ids: vlaio, fod-financien, european-commission, and so on. |
| source | Comma list of source ids (GET /v1/sources). |
| nace | The company’s own NACE-BEL code, with or without dots (62.010), at least two digits. Measures with no sector restriction, and measures whose sectors cover the code (by prefix or by NACE section). |
| programme | An EU programme code, case-insensitive: HORIZON, DIGITAL, LIFE, SMP. |
| deadline_before | Measures whose next deadline is on or before this instant. A measure without a deadline does not match. |
| deadline_after | Measures whose next deadline is on or after this instant. |
| updated_since | Measures whose content changed on or after this instant. |
| include_withdrawn | Also list measures the source no longer publishes. Default false. |
| sort | relevancedeadlineupdatedtitle Default: relevance with q, otherwise deadline. Deadline is soonest first with measures without a deadline last; updated is most recently changed first. |
| view | compact (default) or full, the whole record on every row. |
| lang | nl, fr or en (default): the language of title, summary and links.web. |
| limit, cursor | Page size and position. See pagination. |
Dates and times
2026-12-01T17:00:00+01:00) or a bare date. A bare date is a Brussels day: deadline_before=2026-12-01 means until the end of 1 December in Belgium, deadline_after and updated_since from its start. Every timestamp in a response is RFC 3339 with the Brussels offset (+01:00 in winter, +02:00 in summer), because a deadline of 17:00 should read as 17:00 to whoever has to meet it.Filter on status when you sort by deadline
sort=deadline puts the oldest deadlines first, and those belong to measures that closed long ago. For what a company can still apply for, add status=open,continuous,forthcoming or deadline_after with today’s date.The response
A page of compact records. meta.attribution collects the attribution each listed record’s licence asks for, deduplicated, and meta.disclaimer the independence sentence. A search that finds nothing says so in meta.warnings.
{
"data": [
{
"id": "federal:investeringsaftrek",
"slug": "investeringsaftrek",
"title": "Investment deduction",
"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",
"titles": {
"nl": "Investeringsaftrek",
"fr": "Déduction pour investissement",
"en": "Investment deduction",
"de": null
},
"status": "continuous",
"instrument_type": "tax_deduction",
"issuer": {
"id": "fod-financien",
"name": "FOD Financiën",
"government_level": "federal",
"jurisdiction": "be",
"url": "https://financien.belgium.be"
},
"scope": "national",
"regions": [],
"topics": [
"investment",
"digitalisation",
"energy_efficiency",
"renewable_energy"
],
"company_sizes": [],
"opens_at": null,
"closes_at": null,
"rolling": true,
"rate_max": 40,
"amount_max": null,
"annual_cap": null,
"rules_basis": "curated",
"source_id": "curated_federal",
"rights_mode": "facts_only",
"version": 2,
"last_changed_at": "2026-09-27T05:52:40+02:00",
"last_checked_at": "2026-09-27T06:00:12+02:00",
"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"
}
}
],
"pagination": {
"has_more": true,
"next_cursor": "eyJzIjoic3Vic2lkaWVzOmRlYWRsaW5lIiwiayI6ImluZmluaXR5IiwiaSI6ImZlZGVyYWw6aW52ZXN0ZXJpbmdzYWZ0cmVrIn0",
"limit": 1
},
"meta": {
"request_id": "req_0192d3a4b5c67d8e9f0a1b2c3d4e5f60",
"warnings": [],
"attribution": [
"Source: FOD Financiën / SPF Finances and RSZ / ONSS official pages; records written by Subsido."
],
"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."
}
}The compact view carries what a list needs to show a measure and decide whether to open it. Every field of the full record is described on the subsidy record.
One measure
curl "https://api.subsido.be/v1/subsidies/federal:investeringsaftrek?lang=en" \ -H "Authorization: Bearer sb_live_..."- The path takes the id (
federal:investeringsaftrek,eu:HORIZON-EIC-2026-ACCELERATOR-01) or the slug (investeringsaftrek). An id is minted once from the first source that published the measure and never changes, even when the source renames its page; store ids, not slugs. - When two records turned out to describe the same measure and were merged, the old id keeps working: it answers with the surviving record and a
merged_fromfield naming the id you asked for. - The answer is
{ data, meta }with the full record indata. Parameters:langandas_of. - An id or slug that is not known answers
404 subsidy_not_found.
A measure as it stood on a date
Pro and aboveas_of needs the as_of capability.
curl "https://api.subsido.be/v1/subsidies/federal:investeringsaftrek?as_of=2026-09-27" \ -H "Authorization: Bearer sb_live_..."Returns the version that was current at that instant (a bare date means the end of that Brussels day), with three more fields: as_of, and the version’s valid_from and valid_to (null while it is the current one). Before the measure’s first version the answer is 404 version_not_found, and the message says when the first version is from. This is what makes an answer reproducible: “what did the API say about this measure when we advised the client on 3 March?”
Versions
Pro and aboveVersions need the history capability.
A new version is written whenever the record’s content changes, and only then: checking a source again without a change writes nothing. GET /v1/subsidies/{id}/versions lists every version, newest first, each with what changed.
curl "https://api.subsido.be/v1/subsidies/federal:investeringsaftrek/versions" \ -H "Authorization: Bearer sb_live_..."{
"data": [
{
"version": 2,
"valid_from": "2026-09-27T05:52:40+02:00",
"valid_to": null,
"cause": "source_change",
"content_hash": "9f2c…",
"changes": [
{
"field": "funding.rate_max",
"before": 30,
"after": 40
}
]
},
{
"version": 1,
"valid_from": "2026-09-27T05:40:02+02:00",
"valid_to": "2026-09-27T05:52:40+02:00",
"cause": "source_change",
"content_hash": "4b7e…",
"changes": []
}
],
"subsidy_id": "federal:investeringsaftrek",
"meta": {
"request_id": "req_0192d3a4b5c67d8e9f0a1b2c3d4e5f62",
"warnings": []
}
}GET /v1/subsidies/{id}/versions/{version} returns the full record as it was in that version, with valid_from, valid_to, cause and changes added; lang is its one parameter. Versions are kept for ever. The causes, and how a version becomes an event in the change feed, are on changes and versions.
The whole catalogue
Business and aboveThe export needs the bulk_export capability.
GET /v1/export/subsidies.ndjson streams every current measure as one full record per line (application/x-ndjson), sorted by title. Parameters: lang and include_withdrawn. Two exports run at a time across the service; a third is 429 rate_limit_exceeded with Retry-After: 5. It counts as one request.
curl "https://api.subsido.be/v1/export/subsidies.ndjson?lang=en" \ -H "Authorization: Bearer sb_live_..." -o subsidies.ndjsonThe vocabulary
GET /v1/taxonomy needs no key and returns every closed list with labels in Dutch, French and English: topics, regions, provinces (with their region), instrument types, statuses, company sizes, applicant types, cost types, government levels and scopes, plus the rule fields (with the question to ask for each), the rule operators, the event types and the match statuses. Build forms from it rather than from a copy.
GET /v1/coverage, also open, counts the catalogue: total, actionable (open, continuous or forthcoming), last_changed_at, and counts by status, source, instrument type, government level, region and topic.
