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

# İstek Sınırları

> Living Security Public API için istek bütçeleri, 429 yanıt sözleşmesi ve Retry-After ile yeniden deneme yöntemi.

`/v1` API'si, birbirinden bağımsız iki istek bütçesi uygular. Bütçelerden biri
tükenirse istek reddedilir.

| Bütçe | Uygulandığı kapsam |
| - | - |
| API anahtarı başına | Söz konusu anahtarı sunan tüm istekler (hangi adresten gelirse gelsin) |
| İstemci IP'si başına | Söz konusu adresten gelen tüm istekler (kimliği doğrulanmış veya doğrulanmamış) |

API anahtarı başına bütçe, anahtarın kullanıldığı her yerde anahtarı takip eder. IP başına bütçe,
kimliği doğrulanmamış trafik için tek bütçedir ve kimliği doğrulanmış trafik için ikinci bir üst sınır işlevi görür.

<Note>
  Sınırlar kimlik doğrulamadan önce uygulanır; bu nedenle geçersiz veya eksik
  kimlik bilgileri içeren istekler de kaynak bütçesine sayılır. Kesin sayısal
  bütçeler operatör tarafından yapılandırılır ve değişebilir; aşağıdaki yanıt
  sözleşmesi, üzerine geliştirme yapılabilecek kararlı arayüzdür.
</Note>

İki Basic kimlik bilgisi biçiminden biriyle kimlik doğrulaması yapın — bkz.
[Hızlı Başlangıç](/tr/developers/v1/quickstart) (`apikey:secret` veya `secret:`).
`BASE` değerini kuruluşun bölgesel ana bilgisayarına ayarlayın — bkz.
[Bölgeler](/tr/developers/v1/regions).

## 429 yanıtı

Bir bütçe tükendiğinde API, saniye cinsinden bir `Retry-After` başlığı ve standart
problem-details gövdesi ile birlikte `429 Too Many Requests` döndürür:

```json 429 Too Many Requests theme={null}
{
  "type": "https://docs.livingsecurity.com/developers/v1/errors/rate_limited",
  "title": "Too Many Requests",
  "status": 429,
  "detail": "Rate limit exceeded. Retry after the Retry-After interval.",
  "code": "rate_limited",
  "request_id": "req_...",
  "doc_url": "https://docs.livingsecurity.com/developers/v1/errors/rate_limited",
  "retryable": true
}
```

Yanıt, hangi bütçenin tükendiğini belirtmez. Her `429` yanıtına aynı şekilde yaklaşın:
bekleyin, ardından yeniden deneyin.

## 429 yanıtlarını işleme

<Steps>
  <Step title="Retry-After değerine uyun">
    Yeniden denemeden önce `Retry-After` başlığındaki saniye sayısı kadar en az bekleyin.
    Daha erken yeniden denemek, yalnızca reddedilecek isteklerde bütçeyi yeniden tüketir.
  </Step>

  <Step title="Tekrarlanan durumlarda üstel geri çekilme uygulayın">
    Bir yeniden deneme yine reddedilirse geri çekilme süresini artırın ve paralel
    çalışanların eş zamanlı yeniden denememesi için rastgele jitter ekleyin. Sunucunun `Retry-After` değerini
    yerel bir sınıra uydurmak için asla kısaltmayın. Sunucu, yeniden deneme bütçenizin
    izin verdiğinden daha uzun süre beklemenizi isterse durun ve işi daha sonraya planlayın.
  </Step>

  <Step title="İstek hızınızı düzenli tutun">
    Ani yoğunluklar yerine sabit bir istek hızını tercih edin. Toplu okumalarda,
    koleksiyonu daha az istekle kapsamak için izin verilen en büyük sayfa boyutunu (`limit=500`)
    kullanın — bkz. [sayfalama](/tr/developers/v1/pagination). Birden fazla liste taraması
    paralel çalıştığında (örneğin Power BI tabloları) eşzamanlılığı makul düzeyde tutun ve
    geçici bir 429 yanıtının tüm yenilemeyi başarısız kılmaması için `Retry-After` değerine uyun.
  </Step>
</Steps>

Bu örnek, bir **GET** isteği için yalnızca `429` yanıtlarını yeniden dener; en fazla
beş deneme yapar ve denemeler arasında en fazla 60 saniye bekler. Diğer hatalarda
hemen durur. Ağ zaman aşımları çağırana iletilir. Zaman aşımlarını ve yeniden deneme
bütçelerini iş yükünüze uygun biçimde yapılandırın. `requests`, okuma zaman aşımını genel
bir son tarih olarak değil, veri alınırken izin verilen en uzun boşta kalma süresi olarak yorumlar.

`LIVING_SECURITY_API_KEY` değerini gizli anahtar yöneticinizden yükleyin. Bu örneği çalıştırmadan önce
`requests` paketini yükleyin. Kullanmak için `get_with_retry("/organization")` çağrısını yapın.

```python Python theme={null}
import os
import random
import time
import requests

# US: BASE = "https://api.us-east-1.livingsecurity.ai/v1"
BASE = "https://api.eu-west-1.livingsecurity.ai/v1"
AUTH = ("apikey", os.environ["LIVING_SECURITY_API_KEY"])

def get_with_retry(path, params=None, max_attempts=5):
    if not 1 <= max_attempts <= 5:
        raise ValueError("max_attempts must be between 1 and 5")
    for attempt in range(max_attempts):
        response = requests.get(
            f"{BASE}{path}", auth=AUTH, params=params,
            headers={"Living-Security-Version": "2026-07-01"},
            timeout=(5, 30), allow_redirects=False,
        )
        if response.status_code != 429:
            response.raise_for_status()
            if not 200 <= response.status_code < 300:
                raise RuntimeError("Unexpected redirect; check your regional API URL")
            return response

        # The API returns Retry-After as a whole number of seconds.
        raw_wait = response.headers.get("Retry-After", "")
        request_id = response.headers.get("Request-Id", "unknown")
        response.close()
        if attempt == max_attempts - 1:
            raise RuntimeError(f"Retry budget exhausted; request_id={request_id}")
        if not raw_wait.isascii() or not raw_wait.isdigit() or len(raw_wait) > 6:
            raise RuntimeError(f"Invalid Retry-After; request_id={request_id}")

        wait = max(int(raw_wait), min(2 ** attempt, 30))
        delay = wait + random.uniform(0, 1)
        if delay > 60:
            raise RuntimeError(f"Retry-After exceeds wait budget; request_id={request_id}")
        time.sleep(delay)
```

Bu döngüyü bir yazma işleminin etrafında kullanmayın. Bir yazma işleminden sonra
oluşan zaman aşımı, sunucunun bağlantı kopmadan önce işlemi kaydettiği anlamına
gelebilir. Bir yazma işlemini yalnızca ilgili işlemin başvuru belgesi idempotency
özelliğini açıkça belgeliyorsa, aynı anahtarı ve aynı yükü koruyarak tekrarlayın.
Aksi takdirde, yeniden denemeden önce kaynağın durumunu doğrulayıp eşitleyin.

## Önerilen yenileme takvimi

Yenileme sıklığını anahtar bütçenize ve sayfa boyutuna göre belirleyin. Büyük bir
koleksiyonun tam geçmiş yüklemesi tek seferlik bir maliyettir; düzenli yenilemelerde
her çalıştırmanın bütçenin oldukça altında kalması için artımlı zaman aralıklarını tercih edin.
`limit=500` değerini her zaman açıkça ayarlayın — 25 olan varsayılan değer istek sayısını katlar.


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