Hoe paginering werkt
Een tabel komt niet altijd in één keer binnen. Je krijgt een pagina rijen en, als er meer is, een
next_cursor. Geef die waarde bij je volgende aanvraag mee als cursor om verder te gaan waar
je gebleven was. Is next_cursor null, dan was dit de laatste pagina.
Rechts staat een voorbeeld met limit=500, de aanvraag voor de volgende pagina en een Python-lus die alle pagina’s doorloopt.
Paginagrootte
Met limit bepaal je het aantal rijen per pagina: een geheel getal van 1 tot en met 1000,
standaard 100. Een andere waarde geeft 400 invalid_parameter. Je mag de limit tussen
pagina’s wijzigen.
Regels voor de cursor
- Een cursor is 24 uur geldig. Daarna krijg je
400 invalid_cursoren begin je opnieuw zonder cursor. - Een cursor hoort bij de combinatie van tabel,
connection, filters,modified_sinceeninclude_deletedwaarmee hij is uitgegeven. Verander je daar iets aan, dan is hij ongeldig. - Bewaar de cursor als een ondoorzichtige tekst. De inhoud kan veranderen.
- Op de laatste pagina staat
sync_watermarkin het antwoord. Dat tijdstip heb je nodig voor Incrementeel ophalen.
Onze tip: loop altijd door tot
next_cursornullis in plaats van een vast aantal pagina’s aan te nemen. Een pagina kan precies vol zijn, ook als het de laatste is.
Aanvraag
GET https://app.apiboard.nl/api/v1/wefact/facturen?limit=500 HTTP/1.1
Host: app.apiboard.nl
Authorization: Bearer apib_live_JOUW_SLEUTEL
# Volgende pagina: geef next_cursor uit het antwoord mee.
GET https://app.apiboard.nl/api/v1/wefact/facturen?limit=500&cursor=<next_cursor> HTTP/1.1
Host: app.apiboard.nl
Authorization: Bearer apib_live_JOUW_SLEUTEL curl -H "Authorization: Bearer apib_live_JOUW_SLEUTEL" \
"https://app.apiboard.nl/api/v1/wefact/facturen?limit=500"
# Volgende pagina: geef next_cursor uit het antwoord mee.
curl -H "Authorization: Bearer apib_live_JOUW_SLEUTEL" \
"https://app.apiboard.nl/api/v1/wefact/facturen?limit=500&cursor=<next_cursor>" import requests
TOKEN = "apib_live_JOUW_SLEUTEL"
URL = "https://app.apiboard.nl/api/v1/wefact/facturen"
rijen = {}
params = {"limit": 500}
while True:
resp = requests.get(URL, params=params, headers={"Authorization": f"Bearer {TOKEN}"})
resp.raise_for_status()
body = resp.json()
for rij in body["data"]:
rijen[rij["id"]] = rij # dedupliceren op id, laatste versie wint
if body["next_cursor"] is None:
break # laatste pagina
params["cursor"] = body["next_cursor"]
print(f"{len(rijen)} rijen.") let
Basis = "https://app.apiboard.nl",
Pad = "/api/v1/wefact/facturen",
Token = "apib_live_JOUW_SLEUTEL",
Filters = [limit = "500"],
HaalPaginaOp = (cursor as nullable text) =>
Json.Document(Web.Contents(Basis, [
RelativePath = Pad,
Query = if cursor = null then Filters else Record.AddField(Filters, "cursor", cursor),
Headers = [Authorization = "Bearer " & Token]
])),
// Volg next_cursor tot die null is; de pagina met next_cursor = null telt ook mee.
Paginas = List.Generate(
() => HaalPaginaOp(null),
each _ <> null,
each if [next_cursor] = null then null else HaalPaginaOp([next_cursor]),
each [data]
),
AlleRijen = List.Combine(Paginas),
Tabel = if List.IsEmpty(AlleRijen)
then #table({"id", "synced_at"}, {})
else Table.FromRecords(AlleRijen, null, MissingField.UseNull),
// Dedupliceer op id: eerst de nieuwste versie bovenaan, dan houdt Distinct die.
// Verwijder daarna rijen die bij de bron verwijderd zijn.
NieuwsteEerst = Table.Buffer(Table.Sort(Tabel, {{"synced_at", Order.Descending}})),
ZonderDubbel = Table.Distinct(NieuwsteEerst, {"id"}),
ZonderVerwijderd = Table.SelectRows(ZonderDubbel, each Record.FieldOrDefault(_, "bron_verwijderd_op", null) = null)
in
ZonderVerwijderd Antwoord
{
"connections": [
{
"id": "43d9a41a-3529-4be2-b891-b23781997895",
"label": "Voorbeeld B.V.",
"backfill_complete": true
}
],
"data": [
{
"connection_id": "43d9a41a-3529-4be2-b891-b23781997895",
"connection_label": "Voorbeeld B.V.",
"id": "314feb6e-f809-4f72-b6d8-da1b68d15ab5",
"synced_at": "2026-10-07T02:58:12.304211+00:00"
}
],
"next_cursor": "…",
"sync_watermark": null
} Was dit artikel behulpzaam?