Verzoeken doen
Basis-URL, authenticatieheader, paginering en foutafhandeling.
De Verbleif-API is een API Platform JSON-LD-API. Elk verzoek wordt geauthenticeerd met het bearer token dat je verkreeg bij Authenticatie.
Basis-URL en headers
Stuur het access token mee in de Authorization-header. Vraag om JSON-LD met Accept, en stuur bij schrijfacties JSON-LD-bodies met Content-Type:
curl https://api.verbleif.com/api/reservations \
-H "Authorization: Bearer JOUW_ACCESS_TOKEN" \
-H "Accept: application/ld+json"
| Header | Wanneer | Waarde |
|---|---|---|
Authorization |
Elk verzoek | Bearer JOUW_ACCESS_TOKEN |
Accept |
Elk verzoek | application/ld+json |
Content-Type |
Request-bodies (POST, PUT, …) |
application/ld+json |
Content-Type |
Gedeeltelijke updates (PATCH) |
application/merge-patch+json |
De API onderhandelt alleen JSON-LD (application/ld+json) voor resource-antwoorden en fouten. Gewone application/json is geen ondersteund responseformaat. OpenAPI- / HTML-documentatie gebruikt aparte mediatypen (application/vnd.openapi+json, text/html) en is niet bedoeld voor normale API-aanroepen.
Paginering
Collectie-endpoints zijn gepagineerd met API Platform Hydra- / JSON-LD-collecties.
| Queryparameter | Standaard | Opmerkingen |
|---|---|---|
page |
1 |
Paginanummer |
perPage |
100 |
Paginagrootte; clients mogen dit verhogen tot maximaal 250 |
partial |
niet gezet (false) |
Bij true slaat de API de totale telling over |
Een typische eerste pagina ziet er zo uit:
{
"member": [ /* …resources… */ ],
"totalItems": 160,
"view": {
"@type": "PartialCollectionView",
"first": "/api/clients?page=1",
"last": "/api/clients?page=2",
"next": "/api/clients?page=2"
}
}
Totale telling (totalItems)
totalItems staat alleen op de eerste pagina (page=1, of weggelaten). Latere pagina’s laten het weg, zodat de API geen volledige count-query hoeft te doen. Hetzelfde geldt bij partial=true: ook pagina 1 heeft dan geen totalItems.
Heb je het totaal nodig, lees het uit het eerste antwoord en blader verder via de links in view.
Volg de next-link in view tot die ontbreekt. Hardcode geen paginanummers en ga niet uit van een andere vaste paginagrootte dan de standaarden hierboven.
Rate limits
Geauthenticeerde App Store- / API Platform-aanroepen naar normale resource-endpoints (/api/… met een bearer token) hebben op dit moment geen globale rate limit per app of per token in de API.
Endpoints die gevoelig zijn voor misbruik gebruiken Symfony’s token bucket-rate limiter (token_bucket): een burst-capaciteit die met een vast tempo bijgevuld wordt. Is de bucket leeg, dan antwoordt de API met 429 Too Many Requests en een Retry-After-header (seconden tot je opnieuw mag proberen). Handel 429 altijd af en respecteer Retry-After.
Voorbeelden van endpoint-specifieke buckets (geen algemene API-quota):
| Gebied | Bucket | Burst (limit) |
Bijvullen |
|---|---|---|---|
| Publieke gastmeldingen (schrijven / settings / discovery) | per client-IP en per locatie-hash | 50 | 10 tokens / minuut |
| Publieke gastmeldingen (lezen) | per client-IP en per locatie-hash | 30 | 6 tokens / minuut |
| Wachtwoordherstel (op IP) | per IP | 100 | 20 tokens / minuut |
| Wachtwoordherstel (op gebruikersnaam) | per gebruikersnaam | 5 | 1 token / minuut |
Login-discovery op de auth-service gebruikt hetzelfde token-bucket-algoritme (aparte buckets per IP en per gebruikersnaam). Die limieten gelden voor discovery, niet voor gewoon App Store-API-verkeer.
Er is geen gepubliceerd globaal “verzoeken per minuut per app”-cijfer voor geauthenticeerde collectie- en item-endpoints. Krijg je daar toch 429, behandel het als een uitzonderlijke throttle (edge of endpoint-specifiek) en wacht volgens Retry-After.
Fouten
De API gebruikt standaard HTTP-statuscodes. Foutantwoorden komen ook als JSON-LD (zelfde Accept) en bevatten machinaal leesbare velden zoals status en detail:
{
"status": 403,
"detail": "This app is not authorized for the requested scope."
}
401- het access token ontbreekt of is verlopen. Vernieuw het en probeer opnieuw.403- het token is geldig, maar de app mist de vereiste scope.404- de resource bestaat niet of valt buiten de verleende locaties.429- je wordt gelimiteerd; respecteerRetry-After.406- deAccept-header komt niet overeen met een ondersteund formaat (gebruikapplication/ld+json).
Voor App Store-integraties die wijzigingen vanuit een extern systeem naar Verbleif pushen, zie Webhooks.