# Hız sınırları

Bot isteklerinin sınırları tek yerde, bu sayfada yazılıdır. Sınırı aşan istek `429` alır. Yanıttaki bekleme süresine uyan bir bot sorun yaşamaz.

## Rota sınıfları

Her bot rotası bir sınıfa aittir. Rotanın sınıfı [REST referansında](https://noluyo.net/gelistirici/api.md) yazar.

| Sınıf | İstek | Saniye | Hangi işlemler |
|---|---|---|---|
| `read` | 30 | 5 | Okuma rotaları |
| `write` | 10 | 10 | Oluşturma, değiştirme, silme |
| `message` | 5 | 5 | Mesaj gönderme |
| `reaction` | 4 | 1 | Tepki ekleme, kaldırma, temizleme |
| `bulk` | 1 | 1 | Toplu mesaj silme |
| `interaction` | 50 | 1 | [Etkileşim yanıtları](https://noluyo.net/gelistirici/etkilesimler.md); ayrıca ephemeral düzenleme etkileşim başına 5 saniyede 5 |
| `command` | 5 | 20 | [Komut](https://noluyo.net/gelistirici/komutlar.md) oluşturma, değiştirme, silme; ayrıca kapsam başına günde 200 yeni komut |
| `oauth_read` | 30 | 5 | `Authorization: Bearer <access_token>` ile çağrılan `/oauth2/@me` ve `/oauth2/@me/guilds` rotaları (token başına) |

Sınır şunların her biri için ayrı sayılır: **bot, rota ve kanal**. Rotada kanal yoksa kanal yerine **sunucu** sayılır; ikisi de yoksa yalnızca bot ve rota. Örneğin iki ayrı kanala aynı anda 5'er mesaj gönderebilirsin.

## Genel sınır

Bir bot, tüm rotalar toplamında saniyede en çok **50** istek gönderebilir. Aşınca `X-RateLimit-Scope: global` ile `429` alır.

## Tüm botların ortak tavanı

Tüm botlar birlikte saniyede en çok **70** yazma (`read` dışındaki her sınıf) yapabilir; ayrıca aynı anda en çok **8** bot isteği (okuma dahil) çalışır. Etkileşim yanıtında yalnızca kanala mesaj yazanlar yazma sayılır:

| İstek | 70 yazmaya sayılır mı |
|---|---|
| `read` sınıfı | Hayır |
| `callback` `type: 4`, `5` | Evet; `flags: 64` ile ephemeral ise hayır |
| `callback` `type: 7` | Evet; ephemeral mesajın üstündeyse hayır |
| `callback` `type: 6`, [`type: 8`](https://noluyo.net/gelistirici/otomatik-tamamlama.md) | Hayır |
| Takip mesajı, `@original` düzenleme ve silme | Evet |
| Diğer her yazma rotası | Evet |

Aynı anda 8 istek sınırına bunların hepsi girer. Biri aşılırsa bot `X-RateLimit-Scope: shared` ile `429` alır; yanıtta `retry_after` ve `Retry-After` bulunur (eşzamanlılık sınırında 1 saniye). Bu `429` botunun suçu değildir: geçersiz istek sayılmaz ve geçici engele yol açmaz. `retry_after` kadar bekleyip isteği yeniden gönder.

Etkileşimleri [HTTP ile](https://noluyo.net/gelistirici/http-teslim.md) alıyorsan adresinin `200` yanıtı da bu tavanlara, `interaction` sınıfına ve [yayılma bütçesine](https://noluyo.net/gelistirici/rate-limit.md#embed-ve-bilesenlerin-yayilma-butcesi) aynen sayılır; bir `callback` çağrısı gibi. Tavan doluysa yanıt yazılmaz ve kişi `429 interaction_busy` görür. Bu da botunun suçu olmayabilir: başka botlar tavanı doldurmuş olabilir. Teslim günlüğünde sonuç `busy` olur ve devre kesiciye sayılmaz. Tekrar deneme yoktur; kişi isterse yeniden çalıştırır.

## Embed ve bileşenlerin yayılma bütçesi

Bir mesaj, kanaldaki herkese ayrı ayrı gönderilir; embed ve bileşenler mesajı büyütür. Bu yüzden her mesajın embed ve bileşenleri (metin sayılmaz) sunucunun üye sayısıyla (DM'de kişi sayısıyla) çarpılır ve tüm botlarla webhook'ların paylaştığı saniyelik bir bütçeden (**700000** bayt) düşer:

| Parça | Bayt | Anlamı |
|---|---|---|
| Senin payın | Saniyede 175000 | Bir sahibin tüm botları ve açtığı webhook'lar birlikte. Aşarsan `X-RateLimit-Scope: bot` ile `429` alırsın. |
| Yedek | Saniyede 70000 | Maliyeti en çok 17500 bayt olan mesajlar için; bir sahip saniyede bunun 17500 baytını kullanabilir. Yedekte yer oldukça bekletme onları durdurmaz. |
| Tek mesaja en çok | 21000000 | Bütçenin 30 saniyesi. Aşarsan `400 fanout_too_large` alırsın; `max_bytes` o kanalın alabileceği en büyük embed ve bileşen boyutunu söyler (2000 kişilik bir sunucuda 10500 bayt). |

Maliyeti payından büyük olan mesaj büyük mesajdır. Ardından bir sonraki büyük mesajın için, her sunucuda, mesajın ödenmesi için gereken sürenin dört katı beklersin; o sunucuya da o süre hiçbir bot büyük mesaj gönderemez: sana `X-RateLimit-Scope: bot`, sunucu için `shared` ile `429` gelir. Havuzdan (bütçe eksi yedek, saniyede 630000 bayt) fazla tutan büyük mesaj o saniyede kalanı alır, sonra o ve o saniyenin önceden harcadığı ödenene kadar tüm botların sayılan diğer mesajları bekler: 600 kişilik bir sunucuya 32 KiB'lık bir mesaj onları yaklaşık 31 saniye bekletir, hiçbir bekletme yaklaşık 34 saniyeden uzun sürmez. Aynı anda tek bekletme olur. Bütçe dolu ya da bekletmedeyken bot `X-RateLimit-Scope: shared` ile `429` alır. Bu `429` botunun suçu değildir: geçersiz istek sayılmaz ve geçici engele yol açmaz. `bot` kapsamlı `429` ise senindir ve diğer sınırların gibi sayılır. `retry_after` ne kadar bekleyeceğini söyler. Düzenleme istekleri ve [webhook'la gönderilen embed'ler](https://noluyo.net/gelistirici/embedler.md#webhook-tan-embed) de aynı bütçeyi kullanır.

## Özel mesajlar

Botunun DM'lerde [kendiliğinden yazdıkları](https://noluyo.net/gelistirici/ozel-mesajlar.md) (mesaj, tepki, sabitleme, yazıyor) tüm DM'leri toplamında ayrıca sayılır:

| Sınır | İstek | Saniye | Ne sayılır |
|---|---|---|---|
| `dm_send` | 30 | 10 | Botun tüm DM'lerindeki serbest yazmaları; etkileşim yanıtları sayılmaz |

Aşınca `X-RateLimit-Scope: bot` ile `429` alırsın. `retry_after` kadar bekleyip yeniden gönder. `message` sınıfının kanal başına sınırı DM'de de geçerlidir.

## Başlıklar

Bot isteklerinin yanıtlarında şu başlıklar gelir:

| Başlık | Anlamı |
|---|---|
| `X-RateLimit-Limit` | Pencerenin izin verdiği istek sayısı |
| `X-RateLimit-Remaining` | Bu pencerede, bu kanal veya sunucu için kalan istek |
| `X-RateLimit-Reset` | Pencerenin bittiği an; üç ondalıklı Unix saniyesi |
| `X-RateLimit-Reset-After` | Pencerenin bitmesine kalan saniye; üç ondalıklı |
| `X-RateLimit-Bucket` | Rotayı ve sınıfını adlandıran 16 onaltılık basamak |

`X-RateLimit-Bucket` bir rotanın tüm kanallarında aynıdır ama `Remaining` kanal başına sayılır. Bu yüzden sınırı izlerken kovayı kanal veya sunucu ID'siyle birlikte tut.

Genel sınıra takılan yanıtta yalnızca `X-RateLimit-Scope` ve `Retry-After` gelir. Sınır sistemi geçici olarak çalışmıyorsa istekler sınırlanmaz ve bu başlıklar hiç gelmez; kodun bu başlıkların her zaman var olduğunu varsaymasın.

## 429 yanıtı

```http
HTTP/1.1 429 Too Many Requests
Retry-After: 2
X-RateLimit-Scope: bot
X-RateLimit-Limit: 5
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1793966400.250
X-RateLimit-Reset-After: 1.250
X-RateLimit-Bucket: 3f9a1c7e5b2d4860
Content-Type: application/json; charset=utf-8

{"code":"rate_limited","message":"You are being rate limited.","retry_after":1.25}
```

- `retry_after`, gövdede beklenecek süredir; saniye cinsinden, üç ondalığa kadar.
- `Retry-After`, başlıktaki aynı süredir; yukarı yuvarlanmış tam saniye.
- `X-RateLimit-Scope`, sınıf sınırında `bot`, genel sınırda `global`, yukarıdaki tavanda `shared` olur. Aşağıdaki ek sınırlarda bu başlık gelmez.

Beklemeden tekrar denemek işe yaramaz; aşağıdaki gibi süreyi bekle:

```js
if (res.status === 429) {
  const { retry_after } = await res.json();
  await new Promise((done) => setTimeout(done, retry_after * 1000));
  // sonra isteği yeniden gönder
}
```

## Ek sınırlar

Bazı işlemlerde sınıf sınırına ek olarak şu sınırlar da geçerlidir. Bunlar da `429` verir ve `retry_after` içerir.

| İşlem | Sınır | Kod |
|---|---|---|
| Mesaj gönderme | Kanal başına 5 saniyede 5 | `rate_limited` |
| Mesaj düzenleme | Kanal başına 5 saniyede 5 | `rate_limited` |
| Dosyalı mesaj | Tüm kanallarda dakikada 20 | `rate_limited` |
| Yazıyor göstergesi | Kanal başına 5 saniyede 5 | `rate_limited` |
| Sabitleme, sabitleme kaldırma | Kanal başına dakikada 10 | `rate_limited` |
| Tepki ekleme | Kanal başına 5 saniyede 20 | `rate_limited` |
| Dosya yükleme miktarı | Saatte 1 GiB, günde 3 GiB | `upload_quota` |
| Yavaş mod açık kanalda mesaj | Kanalın `rate_limit_per_user` süresi | `slowmode` |
| Ephemeral mesaj | Tüm botlar birlikte, basan kişi başına 5 saniyede 262144 bayt | `rate_limited` |

`ManageMessages` veya `ManageChannels` iznine sahip olanlar yavaş moddan muaftır.

Portaldaki uygulama işlemlerinin de sınırı vardır: uygulama oluşturma ve token yenileme için hesap başına, bot resmini yükleme ve kaldırma için bot başına 10 dakikada 5 işlem.

## Gateway sınırları

[Gateway](https://noluyo.net/gelistirici/gateway.md) bağlantısının sınırları REST'ten ayrıdır:

| İşlem | Sınır | Aşılınca |
|---|---|---|
| Oturum başlatma (identify) | Uygulama başına 5 saniyede 1 | Bağlantı `4008` ile kapanır |
| Oturum başlatma (identify) | Uygulama başına günde 1000 | Bağlantı `4016` ile kapanır |
| Gönderilen çerçeve | Bağlantı başına dakikada 120 | Bağlantı `4008` ile kapanır |
| Durum değiştirme (`op 3`) | Oturum başına dakikada 5 | `RATE_LIMITED` gelir, güncelleme yok sayılır |
| Üye isteği (`op 8`) | Oturum başına dakikada 10, aynı anda 1 | `RATE_LIMITED` gelir |
| Tam üye listesi (`op 8`) | Bot ve sunucu başına 30 saniyede 1 | `RATE_LIMITED` gelir |

Resume oturum başlatma sayılmaz. Kalan başlatma hakkını [`GET /gateway/bot`](https://noluyo.net/gelistirici/api-gateway.md#getGatewayBot) gösterir.

## Geçersiz istekler ve geçici engel

Bir IP adresinden `Bot` şemasıyla gönderilen ve reddedilen (`401`, `403` veya `429` alan) istekler sayılır. Sayı 10 dakika içinde **10000**'e ulaşırsa, o adresten gelen `Bot` şemalı tüm istekler pencere bitene kadar reddedilir, geçerli token'lar dahil:

```json
{"code":"temporarily_banned","message":"Too many invalid requests. Try again later.","retry_after":312.5}
```

Yanıt `403`'tür ve `Retry-After` başlığı içerir. Aynı adresten siteyi ve uygulamayı kullanan kişiler bundan etkilenmez.

Bundan kaçınmak için: `401` alınca isteği tekrarlamak yerine botu durdur, `403` alan isteği aynen tekrarlama ve `429` alınca süreyi bekle.

## Bu sayfayı yapay zekaya verirsen

> **İpucu:** Yapay zekaya hız sınırı yönetimi yazdırırken `429` yanıtlarında gövdedeki `retry_after` saniyesi kadar beklemesini, `X-RateLimit-Scope: shared` geldiğinde tüm yazma isteklerini yavaşlatmasını ve `401` / `403` yanıtlarını döngüde tekrarlayarak geçici IP engeline girmemesini söyle.

## Sırada ne var

- [JavaScript kütüphanesi](https://noluyo.net/gelistirici/kutuphane-js.md) ve [Python kütüphanesi](https://noluyo.net/gelistirici/kutuphane-python.md): otomatik kova kuyruğu ve `Retry-After` yönetimi
- [Hatalar](https://noluyo.net/gelistirici/hatalar.md): `rate_limited`, `slowmode` ve `upload_quota` kodları
- [Güvenlik](https://noluyo.net/gelistirici/guvenlik.md): geçersiz istek engelinden kaçınma ve güvenli çalışma
