> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getqr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits

> Hoeveel verzoeken je kunt versturen en hoe je 429-antwoorden afhandelt.

> [!NOTE]
>
> De GetQR API is in bèta en beschikbaar voor geselecteerde workspaces. Details kunnen nog veranderen vóór de algemene release.

De GetQR API beperkt hoeveel verzoeken elke API-sleutel kan versturen, zodat één integratie de API niet voor iedereen kan vertragen.

## Limieten

| Limiet | Waarde |
| - | - |
| Verzoeken per API-sleutel | 600 per minuut |

De limiet wordt geteld over een glijdend venster van één minuut en geldt voor alle endpoints samen. De [statuscontrole](https://docs.getqr.com/nl/api/endpoints/health.md) heeft geen sleutel nodig en telt niet mee.

## Rate limit-headers

Antwoorden op verzoeken met een geldige API-sleutel bevatten deze headers, ook foutantwoorden:

| Header | Beschrijving |
| - | - |
| `X-RateLimit-Limit` | Maximaal aantal verzoeken per venster. |
| `X-RateLimit-Remaining` | Resterende verzoeken in het huidige venster. |
| `X-RateLimit-Reset` | Wanneer het venster wordt gereset, als Unix-tijdstempel in milliseconden. |
| `Retry-After` | Seconden tot het venster wordt gereset, naar boven afgerond. Wacht zo lang voordat je het opnieuw probeert. |

## Als je over de limiet gaat

Boven de limiet antwoordt de API met `429`, de code `rate_limit_exceeded` en dezelfde headers:

```http theme={null}
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1792764060000
Retry-After: 37

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests.",
    "doc_url": "https://getqr.com/account/api-docs#error-rate_limit_exceeded"
  }
}
```

Wacht tot het resetmoment voordat je meer verzoeken verstuurt. Voeg jitter toe, zodat meerdere workers niet op hetzelfde moment opnieuw proberen, en gebruik exponentiële backoff bij `5xx`-fouten:

```javascript theme={null}
async function getqrFetch(url, options = {}, maxRetries = 5) {
  for (let attempt = 0; ; attempt++) {
    const res = await fetch(url, {
      ...options,
      headers: {
        Authorization: `Bearer ${process.env.GETQR_API_KEY}`,
        ...options.headers,
      },
    });

    const retryable = res.status === 429 || res.status >= 500;
    if (!retryable || attempt >= maxRetries) return res;

    // On 429, wait for Retry-After (seconds). Otherwise back off: 1s, 2s, 4s…
    const retryAfter = Number(res.headers.get("Retry-After"));
    const wait =
      res.status === 429 && retryAfter > 0
        ? retryAfter * 1000
        : 1000 * 2 ** attempt;
    const jitter = Math.random() * 250;

    await new Promise((r) => setTimeout(r, wait + jitter));
  }
}
```

> [!TIP]
>
> Probeer `POST /api/v1/qrs` alleen opnieuw met een `Idempotency-Key`-header. Dan maakt een nieuwe poging nooit een tweede QR-code aan. Zie [Idempotentie](https://docs.getqr.com/nl/api/introduction.md#idempotentie).

## Onder de limiet blijven

* Houd `X-RateLimit-Remaining` in de gaten en vertraag voordat de waarde 0 bereikt.
* Gebruik [bulkaanmaak van QR-codes](https://docs.getqr.com/nl/api/endpoints/bulk-qr-creations.md) in plaats van één verzoek per QR-code.
* Haal tot 100 resultaten per pagina op met `pageSize=100`. Zie [Paginering](https://docs.getqr.com/nl/api/introduction.md#paginering).
* Cache QR-afbeeldingen: downloads geven een `ETag` terug, dus je kunt `If-None-Match` meesturen en krijgt `304 Not Modified` als er niets is veranderd.

## Volgende stappen

> [card] [Fouten](https://docs.getqr.com/nl/api/errors.md)

> [card] [QR-codes](https://docs.getqr.com/nl/api/endpoints/qr-codes.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.