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

# Обмеження частоти запитів

> Скільки запитів можна надсилати та як обробляти відповіді 429.

> [!NOTE]
>
> API GetQR перебуває в бета-версії та доступний для окремих робочих просторів. До загального релізу деталі можуть змінитися.

API GetQR обмежує кількість запитів, які може надіслати кожен API-ключ, щоб одна інтеграція не сповільнювала API для всіх.

## Ліміти

| Ліміт | Значення |
| - | - |
| Запити на один API-ключ | 600 за хвилину |

Ліміт рахується в ковзному вікні тривалістю одна хвилина й діє для всіх ендпоінтів разом. [Перевірка стану](https://docs.getqr.com/ua/api/endpoints/health.md) не потребує ключа й не враховується.

## Заголовки обмеження частоти

Відповіді на запити з дійсним API-ключем містять такі заголовки, зокрема й відповіді з помилками:

| Заголовок | Опис |
| - | - |
| `X-RateLimit-Limit` | Максимальна кількість запитів за вікно. |
| `X-RateLimit-Remaining` | Скільки запитів лишилося в поточному вікні. |
| `X-RateLimit-Reset` | Коли вікно скинеться, у вигляді Unix-часу в мілісекундах. |
| `Retry-After` | Кількість секунд до скидання вікна, округлена вгору. Зачекайте стільки, перш ніж повторити запит. |

## Перевищення ліміту

Якщо ліміт перевищено, API відповідає `429` з кодом `rate_limit_exceeded` і тими самими заголовками:

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

Зачекайте до моменту скидання, перш ніж надсилати нові запити. Додайте випадкову затримку (jitter), щоб кілька воркерів не повторювали запити одночасно, і використовуйте експоненційну затримку для помилок `5xx`:

```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]
>
> Повторюйте `POST /api/v1/qrs` лише із заголовком `Idempotency-Key`. Тоді повторний запит ніколи не створить другий QR-код. Див. [Ідемпотентність](https://docs.getqr.com/ua/api/introduction.md#ідемпотентність).

## Як не перевищувати ліміт

* Стежте за `X-RateLimit-Remaining` і сповільнюйтеся, перш ніж значення дійде до 0.
* Використовуйте [масове створення QR-кодів](https://docs.getqr.com/ua/api/endpoints/bulk-qr-creations.md) замість окремого запиту на кожен QR-код.
* Отримуйте до 100 результатів на сторінку за допомогою `pageSize=100`. Див. [Пагінація](https://docs.getqr.com/ua/api/introduction.md#пагінація).
* Кешуйте зображення QR-кодів: завантаження повертають `ETag`, тож можна надіслати `If-None-Match` і отримати `304 Not Modified`, якщо нічого не змінилося.

## Що далі

> [card] [Помилки](https://docs.getqr.com/ua/api/errors.md)

> [card] [QR-коди](https://docs.getqr.com/ua/api/endpoints/qr-codes.md)


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