De API gebruiken
Paginering
Lijsten pagineren met een ondoorzichtige cursor, nooit met een offset: pagina tweeduizend kost evenveel als pagina één, en er worden geen rijen overgeslagen of herhaald als de gegevens intussen veranderen.
De structuur
Een gepagineerde lijst antwoordt:
{
"data": [
"…"
],
"pagination": {
"has_more": true,
"next_cursor": "eyJzIjoic3Vic2lkaWVzOnVwZGF0ZWQiLCJrIjoi…",
"limit": 50
},
"meta": {
"request_id": "req_…",
"warnings": []
}
}has_moreis een feit, geen gok: de API leest één rij meer dan je vroeg. Er is geen totaal.next_cursoris er alleen alshas_moretrue is. Geef hem terug alscursor, met dezelfde parameters, voor de volgende pagina. De change feed is de uitzondering: die geeft op elke pagina een cursor, ook op de laatste, zodat je van daar verder kunt pollen (zie de feed volgen).limitis de gebruikte paginagrootte.
curl "https://api.subsido.be/v1/subsidies?status=open&sort=updated&limit=100&cursor=eyJzIjoic3Vic2lkaWVzOnVwZGF0ZWQiLCJrIjoi…" \ -H "Authorization: Bearer sb_live_..."Paginagrootte
limit is standaard 50. Boven het maximum van je plan is het een fout, 400 invalid_parameter, nooit een stille inkorting: wie 100 rijen vraagt en er zonder melding 20 krijgt, denkt al snel dat hij een hele lijst gelezen heeft, terwijl het maar de eerste pagina was.
| Plan | Maximale limit |
|---|---|
| Developer | 100 |
| Pro, Business | 200 |
| Enterprise | 500 |
Dezelfde cijfers staan in max_page_size van GET /v1/plans en GET /v1/key. Een sleutel van een account zonder plan krijgt op elke lijst 402 subscription_required, welke limit je ook vraagt.
Cursors
- Een cursor bevat de sorteersleutel en het id van de laatste rij. Behandel hem als ondoorzichtig: het formaat kan veranderen.
- Een cursor hoort bij de lijst en de sorteervolgorde waar hij vandaan komt. Tegen een andere gebruikt (een andere
sort, een andere route) geeft hij400 invalid_cursor, en begin je opnieuw zonder cursor; de API begint nooit stilzwijgend weer bij pagina één. - Houd de filters gelijk terwijl je pagineert. De cursor onthoudt ze niet, dus als je ze onderweg wijzigt, blader je door een andere lijst vanaf het punt waar de oude stopte.
- Vraag één pagina tegelijk op. Pagina’s parallel ophalen maakt het doorlopen van een cursor niet sneller en verbruikt wel je rate limit per seconde.
Sorteervolgordes
| Lijst | Volgorde |
|---|---|
| GET /v1/subsidies | sort=relevance (beste tekstmatch; standaard met q), deadline (eerstvolgende eerst, zonder deadline achteraan; standaard zonder q), updated (laatst gewijzigd eerst) of title. Relevance zonder doorzoekbare q valt terug op updated. |
| GET /v1/changes | Oudste eerst, op seq. Zie de feed volgen. |
| GET /v1/watchlists/{id}/companies | Op referentie. |
| GET /v1/webhooks | Oudste eerst. |
Welke lijsten pagineren
| Route | Paginering |
|---|---|
| GET /v1/subsidies, /v1/changes, /v1/watchlists/{id}/companies, /v1/webhooks | limit en cursor, zoals hierboven. |
| GET /v1/watchlists | Alle watchlists op één pagina (hoogstens 50); has_more is altijd false. |
| GET /v1/watchlists/{id}/matches | Geen cursor: limit van 1 tot 5.000 (standaard 500), te filteren per onderneming. |
| GET /v1/subsidies/{id}/versions | Alle versies in één antwoord, de nieuwste eerst. |
| GET /v1/sources | Alle bronnen in één antwoord. |
| GET /v1/webhooks/{id}/deliveries | De laatste 50. |
| GET /v1/export/subsidies.ndjson | De hele catalogus in één gestreamde download (Business en hoger). |
Een hele lijst doorlopen
import os, requests
def all_open_measures():
params = {"status": "open,continuous,forthcoming", "sort": "updated", "limit": 100}
headers = {"Authorization": f"Bearer {os.environ['SUBSIDY_API_KEY']}"}
while True:
r = requests.get("https://api.subsido.be/v1/subsidies", params=params, headers=headers, timeout=30)
r.raise_for_status()
page = r.json()
yield from page["data"]
if not page["pagination"]["has_more"]:
return
params["cursor"] = page["pagination"]["next_cursor"]Elke rij, elke keer
Elk veld van elke rij staat op elke pagina,
null waar het niet van toepassing is, dus een rij heeft dezelfde sleutels op pagina één en op pagina vierhonderd. Voor de hele catalogus in één keer is de export goedkoper dan pagineren.