Paginering

Bijgewerkt op 7 oktober 2026 · Gepubliceerd op 2 september 2026

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_cursor en begin je opnieuw zonder cursor.
  • Een cursor hoort bij de combinatie van tabel, connection, filters, modified_since en include_deleted waarmee 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_watermark in het antwoord. Dat tijdstip heb je nodig voor Incrementeel ophalen.

Onze tip: loop altijd door tot next_cursor null is 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?