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

# Käyttörajoitukset

> Kuinka monta pyyntöä voit lähettää ja miten käsittelet 429-vastaukset.

> [!NOTE]
>
> GetQR API on beetavaiheessa, ja se on käytettävissä valituissa työtiloissa. Yksityiskohdat voivat muuttua ennen yleistä julkaisua.

GetQR API rajoittaa, kuinka monta pyyntöä kukin API-avain voi lähettää, jotta yksi integraatio ei voi hidastaa APIa kaikilta muilta.

## Rajat

| Raja | Arvo |
| - | - |
| Pyyntöjä API-avainta kohti | 600 minuutissa |

Raja lasketaan liukuvassa yhden minuutin aikaikkunassa, ja se koskee kaikkia päätepisteitä yhteensä. [Tilatarkistus](https://docs.getqr.com/fi/api/endpoints/health.md) ei tarvitse avainta eikä kuluta rajaa.

## Rajoitusotsakkeet

Vastauksissa pyyntöihin, joissa on kelvollinen API-avain, on nämä otsakkeet, myös virhevastauksissa:

| Otsake | Kuvaus |
| - | - |
| `X-RateLimit-Limit` | Pyyntöjen enimmäismäärä aikaikkunaa kohti. |
| `X-RateLimit-Remaining` | Nykyisessä aikaikkunassa jäljellä olevat pyynnöt. |
| `X-RateLimit-Reset` | Aikaikkunan nollautumishetki Unix-aikaleimana millisekunteina. |
| `Retry-After` | Sekunnit aikaikkunan nollautumiseen ylöspäin pyöristettynä. Odota näin kauan ennen uutta yritystä. |

## Kun raja ylittyy

Kun raja ylittyy, API vastaa `429` koodilla `rate_limit_exceeded` ja samoilla otsakkeilla:

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

Odota nollautumishetkeen ennen kuin lähetät lisää pyyntöjä. Lisää satunnaista viivettä, jotta useat työprosessit eivät yritä uudelleen samalla hetkellä, ja kasvata viivettä eksponentiaalisesti `5xx`-virheissä:

```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]
>
> Yritä `POST /api/v1/qrs` -pyyntöä uudelleen vain `Idempotency-Key`-otsakkeen kanssa. Silloin uusi yritys ei koskaan luo toista QR-koodia. Katso [Idempotenssi](https://docs.getqr.com/fi/api/introduction.md#idempotenssi).

## Pysy rajan alla

* Seuraa otsaketta `X-RateLimit-Remaining` ja hidasta tahtia ennen kuin se saavuttaa nollan.
* Käytä [QR-koodien joukkoluontia](https://docs.getqr.com/fi/api/endpoints/bulk-qr-creations.md) yhden QR-koodikohtaisen pyynnön sijaan.
* Hae enintään 100 tulosta sivua kohti parametrilla `pageSize=100`. Katso [Sivutus](https://docs.getqr.com/fi/api/introduction.md#sivutus).
* Tallenna QR-kuvat välimuistiin: lataukset palauttavat `ETag`-otsakkeen, joten voit lähettää `If-None-Match`-otsakkeen ja saada vastauksen `304 Not Modified`, kun mikään ei ole muuttunut.

## Mitä seuraavaksi

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

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


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