> ## 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]
>
> GetQR API находится в бета-версии и доступен для отдельных рабочих пространств. До общего релиза детали могут измениться.

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

## Лимиты

| Лимит | Значение |
| - | - |
| Запросов на один API-ключ | 600 в минуту |

Лимит считается в скользящем окне длиной в одну минуту и действует на все эндпоинты вместе. [Проверке состояния](https://docs.getqr.com/ru/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/ru/api/introduction.md#идемпотентность).

## Как не превышать лимит

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

## Что дальше

> [card] [Ошибки](https://docs.getqr.com/ru/api/errors.md)

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


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