Rate limits
Every v1 request counts against a per-client limit. Pass verification and the OAuth token endpoint have their own limits on top.
All v1 endpoints
Each authenticated caller (a service client, a device or a user) may send up to 120 requests per minute and 3,000 requests per hour across all /api/v1/* endpoints together.
- Each service client and each device has its own count. Devices of a tenant don't share a count with each other or with the tenant's service clients.
- Refused calls count too. So do calls refused for a missing scope (from a service client, a user or a device) or because the endpoint doesn't accept their kind of caller. Calls without valid credentials are refused before the limit is checked, and so are device calls with a reused DPoP proof, from a disabled device, or from a suspended or inactive organization; those don't count.
- Over the limit the API answers
429 Too Many Requestswith aRetry-Afterheader, in the same shape as the pass verification response below, plus"limit": "client". It has nolivemode: the limit is checked before the endpoint runs.
Pass verification
Pass verifications have extra limits: POST /api/v1/verifications with "method": "pass". Manual and eID verifications have only the per-client limit above.
| Limit | Per minute | Per hour |
|---|---|---|
| Per device | 60 | 1,000 |
| Per tenant | 600 | 10,000 |
- These four limits and the per-client limit all apply at once; a call is refused when any of them is exceeded.
- The windows slide: the count covers the last minute or hour, not a calendar minute or hour.
- Refused calls count too. A client that keeps retrying while limited stays limited, so wait for
Retry-Afterbefore trying again. - Malformed and unknown Pass Tokens count as well: the limit is checked before the token is read.
- Which "device" is counted. For a device calling with DPoP, the device itself. For a service client, the
deviceIdin the request body (an api-origin device created withPOST /api/v1/devices), or the service client as a whole when nodeviceIdis given. A service client that serves several tills can send each till'sdeviceIdso they are limited separately; they still share the tenant limit. - The limits are enforced centrally, so they hold no matter which server handles the request.
The 429 response
A refused pass verification returns 429 Too Many Requests with a Retry-After header (seconds) and an RFC 7807 Problem Details body. retryAfterSeconds repeats the header value. No transaction is recorded for a refused call.
{
"type": "https://api.aldursvottun.is/errors/rate-limited",
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded, retry after 45 second(s)",
"reason": "rate_limited",
"retryAfterSeconds": 45
}Token endpoint
POST /api/oauth/token with grant_type=client_credentials allows 30 requests per minute per client_id, failed ones included. The count is kept by each API server separately, so treat 30 per minute as the most you can rely on. Device grants (device_code and refresh_token) are not limited. Over the limit the endpoint answers in the OAuth error format, not Problem Details:
HTTP/1.1 429 Too Many Requests
Retry-After: 12
Content-Type: application/json
{"error":"slow_down"}Access tokens last 5 minutes, so an integration needs only one token request every few minutes. Cache the token and reuse it until it expires. See Authentication.
Rate limit headers
The API does not send X-RateLimit-* headers. The only signal is the 429 response and its Retry-After header.
Best practices
- On a
429, wait at leastRetry-Afterseconds before the next attempt. For pass verification, a retry sent sooner is counted and extends the wait. - Reuse access tokens until they expire.
- Don't retry a pass verification automatically after a
failresult; a Pass Token can be used only once. - Contact support if you need higher limits for your use case.
Need higher limits?
If your application requires higher rate limits, please contact our support team at support@abyrgverslun.is. We'll work with you to find the right solution for your needs.