> ## 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.

# Limity żądań

> Ile żądań możesz wysłać i jak obsługiwać odpowiedzi 429.

> [!NOTE]
>
> API GetQR jest w wersji beta i jest dostępne dla wybranych obszarów roboczych. Szczegóły mogą się zmienić przed ogólną premierą.

API GetQR ogranicza liczbę żądań, które może wysłać każdy klucz API, aby jedna integracja nie spowalniała API dla wszystkich.

## Limity

| Limit | Wartość |
| - | - |
| Żądania na klucz API | 600 na minutę |

Limit jest liczony w przesuwnym oknie jednominutowym i obejmuje wszystkie endpointy łącznie. [Sprawdzenie stanu](https://docs.getqr.com/pl/api/endpoints/health.md) nie wymaga klucza i nie jest wliczane.

## Nagłówki limitów

Odpowiedzi na żądania z prawidłowym kluczem API zawierają te nagłówki, również odpowiedzi z błędem:

| Nagłówek | Opis |
| - | - |
| `X-RateLimit-Limit` | Maksymalna liczba żądań w oknie. |
| `X-RateLimit-Remaining` | Liczba żądań pozostałych w bieżącym oknie. |
| `X-RateLimit-Reset` | Moment zresetowania okna jako znacznik czasu Unix w milisekundach. |
| `Retry-After` | Liczba sekund do zresetowania okna, zaokrąglona w górę. Odczekaj tyle przed ponowieniem. |

## Po przekroczeniu limitu

Po przekroczeniu limitu API odpowiada `429` z kodem `rate_limit_exceeded` i tymi samymi nagłówkami:

```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"
  }
}
```

Przed wysłaniem kolejnych żądań poczekaj do momentu resetu. Dodaj losowe opóźnienie (jitter), aby kilka procesów nie ponawiało żądań w tej samej chwili, a przy błędach `5xx` wydłużaj odstępy wykładniczo:

```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]
>
> Ponawiaj `POST /api/v1/qrs` tylko z nagłówkiem `Idempotency-Key`. Wtedy ponowienie nigdy nie utworzy drugiego kodu QR. Zobacz [Idempotentność](https://docs.getqr.com/pl/api/introduction.md#idempotentność).

## Jak nie przekraczać limitu

* Obserwuj `X-RateLimit-Remaining` i zwolnij, zanim wartość spadnie do 0.
* Używaj [masowego tworzenia kodów QR](https://docs.getqr.com/pl/api/endpoints/bulk-qr-creations.md) zamiast jednego żądania na każdy kod QR.
* Pobieraj do 100 wyników na stronę z `pageSize=100`. Zobacz [Paginacja](https://docs.getqr.com/pl/api/introduction.md#paginacja).
* Buforuj obrazy kodów QR: pobrania zwracają `ETag`, więc możesz wysłać `If-None-Match` i otrzymać `304 Not Modified`, gdy nic się nie zmieniło.

## Co dalej

> [card] [Błędy](https://docs.getqr.com/pl/api/errors.md)

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


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