Foutafhandeling

Bijgewerkt op 7 oktober 2026 · Gepubliceerd op 2 september 2026

Hoe fouten eruitzien

Gaat er iets mis, dan krijg je een passende statuscode en een JSON-antwoord in deze vorm (rechts een voorbeeld: een aanvraag die een fout geeft, met het antwoord):

Reageer in je code op code, niet op message. De tekst van message kan verduidelijkt worden zonder dat de betekenis van de code verandert.

Foutcodes

StatusCodeBetekenis
400invalid_parameterEen parameter heeft een ongeldige waarde of komt dubbel voor, bijvoorbeeld een limit buiten 1 tot en met 1000, of modified_since zonder geldig tijdstip.
400unknown_parameterEen parameter die op deze tabel niet bestaat. Bij eigen tabellen: alles behalve limit, cursor en modified_since.
400invalid_filterEen filter klopt niet: onbekende kolom, operator die niet bij het kolomtype past, ongeldige waarde, meer dan 10 filters of dubbele filters.
400invalid_cursorDe cursor is ongeldig, ouder dan 24 uur, of hoort bij andere parameters of een andere tabel. Begin opnieuw zonder cursor.
400incremental_not_supportedmodified_since is gebruikt op een tabel die dit niet ondersteunt.
401invalid_keyDe sleutel ontbreekt, is onbekend, is ingetrokken of is verlopen.
403subscription_inactiveJe proefperiode is verlopen of je abonnement is niet actief.
404unknown_tableDe koppeling of tabel bestaat niet.
404unknown_connectionDe administratie in connection bestaat niet of hoort niet bij deze koppeling in jouw organisatie.
409table_recomputedAlleen bij eigen tabellen: de tabel is opnieuw berekend tijdens het ophalen. Begin opnieuw zonder cursor.
429rate_limitedJe hebt een limiet bereikt, zie Gebruikslimieten. Wacht het aantal seconden uit Retry-After.
500internal_errorEr ging iets mis aan onze kant. Probeer het later opnieuw.
503service_unavailableDe API is tijdelijk niet bereikbaar. Probeer het opnieuw na het aantal seconden uit Retry-After.

Wat je met welke fout doet

  • 400, 404 en 409: de aanvraag moet anders. Opnieuw proberen met dezelfde aanvraag heeft geen zin, behalve bij 409: begin dan opnieuw zonder cursor.
  • 401 en 403: controleer je sleutel en je abonnement, zie Authenticatie.
  • 429, 500 en 503: probeer het opnieuw. Wacht bij 429 en 503 de tijd uit Retry-After en verdubbel bij 500 je wachttijd bij elke nieuwe poging.

Onze tip: log de foutcode samen met je eigen aanvraaggegevens (pad en parameters, nooit de sleutel). Dat maakt troubleshooten achteraf een stuk sneller.

Aanvraag

GET https://app.apiboard.nl/api/v1/e-boekhouden/facturen?status=betaald HTTP/1.1
Host: app.apiboard.nl
Authorization: Bearer apib_live_JOUW_SLEUTEL

# De tabel heeft geen kolom status, dus dit geeft een 400 met code invalid_filter.
curl -H "Authorization: Bearer apib_live_JOUW_SLEUTEL" \
  "https://app.apiboard.nl/api/v1/e-boekhouden/facturen?status=betaald"

# De tabel heeft geen kolom status, dus dit geeft een 400 met code invalid_filter.
import time
import requests

TOKEN = "apib_live_JOUW_SLEUTEL"
URL = "https://app.apiboard.nl/api/v1/e-boekhouden/facturen"

def haal_op(params, pogingen=5):
    wacht = 1
    for _ in range(pogingen):
        resp = requests.get(URL, params=params, headers={"Authorization": f"Bearer {TOKEN}"})
        if resp.ok:
            return resp.json()
        code = resp.json()["error"]["code"]  # reageer op code, niet op message
        if resp.status_code in (429, 503):
            time.sleep(int(resp.headers.get("Retry-After", wacht)))
        elif resp.status_code == 500:
            time.sleep(wacht)
            wacht *= 2  # verdubbel de wachttijd bij elke poging
        else:
            # 400, 401, 403, 404, 409: dezelfde aanvraag opnieuw proberen heeft geen zin
            raise RuntimeError(f"{resp.status_code} {code}")
    raise RuntimeError("Te veel pogingen")

body = haal_op({"status": "betaald"})
print(f"{len(body['data'])} rijen.")

Antwoord

{
  "error": {
    "code": "invalid_filter",
    "message": "Onbekende filterkolom: status"
  }
}

Was dit artikel behulpzaam?