Skip to content
Subsido

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&region=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.

ParameterMatches
qWords 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.
regionflandersbrusselswallonia Measures available to a company there: the region’s own, plus every national and EU measure, which apply everywhere.
company_sizeOne of microsmallmediumlarge (the company’s own, so exactly one). Measures naming that size, and measures that do not restrict size.
topicComma list of topic ids. Measures tagged with any of them. GET /v1/taxonomy lists the 35 topics.
instrument_typegrantrebatevouchertax_credittax_deductiontax_exemptionsocial_security_reductionwage_subsidyloanguaranteerepayable_advanceequityin_kindprizeother
statusforthcomingopencontinuouspausedbudget_exhaustedclosedunknown Default: every status. open,continuous,forthcoming is what can be applied for.
government_leveleufederalcommunityregionprovincemunicipalityagencyother
scopeeunationalregionalprovinciallocal
issuerComma list of issuer ids: vlaio, fod-financien, european-commission, and so on.
sourceComma list of source ids (GET /v1/sources).
naceThe 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).
programmeAn EU programme code, case-insensitive: HORIZON, DIGITAL, LIFE, SMP.
deadline_beforeMeasures whose next deadline is on or before this instant. A measure without a deadline does not match.
deadline_afterMeasures whose next deadline is on or after this instant.
updated_sinceMeasures whose content changed on or after this instant.
include_withdrawnAlso list measures the source no longer publishes. Default false.
sortrelevancedeadlineupdatedtitle Default: relevance with q, otherwise deadline. Deadline is soonest first with measures without a deadline last; updated is most recently changed first.
viewcompact (default) or full, the whole record on every row.
langnl, fr or en (default): the language of title, summary and links.web.
limit, cursorPage size and position. See pagination.

Dates and times

Timestamp parameters take RFC 3339 (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

Without a status filter, 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_from field naming the id you asked for.
  • The answer is { data, meta } with the full record in data. Parameters: lang and as_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.ndjson

The 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.