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

# Rate Limiting

> Flextell API, istismarı önlemek için istekleri sınırlar. Limitlere uyun, 429 yanıtlarını doğru yönetin.

Flextell, tüm API çağrılarını sizin (kullanıcının) kimliği üzerinden sınırlar. Bir pencereyi aştığınızda `429 Too Many Requests` yanıtı alırsınız.

## Limitler

| Uç grubu                                                                     | Limit                                                       |
| ---------------------------------------------------------------------------- | ----------------------------------------------------------- |
| Genel API (`/api/v1/*`)                                                      | Kullanıcı başına dakikada **60 istek** (yapılandırılabilir) |
| Hassas hesap işlemleri — parola değiştirme, 2FA aç/kapat, oturum sonlandırma | Dakikada **5 istek**                                        |
| 2FA doğrulama (`/v1/account/two-factor/confirm`)                             | Dakikada **3 istek**                                        |

<Note>
  Genel API limiti Flextell'in tarafında yapılandırılabilir bir değerdir (varsayılan: 60/dk). Yüksek hacimli entegrasyonlarınız için limit yükseltilmesini istemek üzere destek ekibiyle iletişime geçebilirsiniz. Hassas ve 2FA limitleri güvenlik nedeniyle sabittir.
</Note>

## Kim sınırlanır?

Rate limit, authentice olmuş kullanıcının ID'si üzerinden uygulanır — `client_id` üzerinden değil. Yani aynı kullanıcı birden fazla uygulamaya yetki verirse, kullanıcının **toplam** istekleri sınırlanır, her uygulama ayrı kota almaz.

Henüz oturum açmamış isteklerde (ör. OAuth token değişimi) limit **IP başına** uygulanır.

## 429 yanıtı

```json theme={null}
{
  "message": "Too many requests."
}
```

Yanıtla birlikte gelen header'lar:

| Header                  | Anlam                                                   |
| ----------------------- | ------------------------------------------------------- |
| `X-RateLimit-Limit`     | Pencerenizde izin verilen toplam istek sayısı           |
| `X-RateLimit-Remaining` | Pencerede kalan istek kotası                            |
| `Retry-After`           | Yeniden denemeden önce beklemeniz gereken saniye sayısı |

## Doğru yeniden deneme (retry) örüntüsü

429 aldığınızda:

1. `Retry-After` header'ını okuyun.
2. O kadar saniye bekleyin.
3. Aynı isteği tekrar deneyin.

Eğer `Retry-After` yoksa **exponential backoff** kullanın: `1s, 2s, 4s, 8s...` en fazla birkaç deneme.

```js theme={null}
async function withRetry(fn, maxAttempts = 5) {
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    const res = await fn();

    if (res.status !== 429) {
      return res;
    }

    const retryAfter = Number(res.headers.get("Retry-After")) || 2 ** attempt;
    await new Promise((r) => setTimeout(r, retryAfter * 1000));
  }
  throw new Error("Rate limit: giving up after max attempts");
}
```

<Warning>
  429 aldığınızda **sonsuz döngüde** yeniden denemeyin. Bir üst sınır koyun ve kullanıcıya bilgilendirme gösterin.
</Warning>

## Limiti zorlamamak için

* **Batch okuyun.** 50 hastayı `GET /customers` ile bir kerede çekin, 50 ayrı `GET /customers/{id}` atmaktan vazgeçin.
* **Cache'leyin.** Nadiren değişen veriler (doktorlar, tedaviler, tenant listesi) için saatlerce cache makul.
* **Webhook / realtime kullanın.** Yeni mesaj veya randevu değişikliği için polling yerine [Realtime](/realtime/overview) kanallarını dinleyin.
* **Paralelliği sınırlayın.** Bir seferde en fazla 5–10 eşzamanlı istek yeterli olacaktır.

## İpucu: kendi rate-limit monitoringiniz

Her yanıtta `X-RateLimit-Remaining` değerini loglayıp düşüşleri izleyin. Eşik (ör. `< 10`) altına düşerse ilgili entegrasyonu geçici olarak yavaşlatın.
