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

# Sayfalama

> Liste zarfı, limit parametresi ve opak page_token imleçleri ile Living Security Public API listelerinde gezinin.

Her `/v1` liste uç noktası aynı zarfı döndürür ve aynı şekilde sayfalama yapar:
belirteç tabanlı, yalnızca ileri yönlü.

## Liste zarfı

```json theme={null}
{
  "object": "list",
  "data": [
    {
      "id": "ent_8f3d2c1b0a9e",
      "object": "entity",
      "type": "person",
      "status": "active",
      "display_name": "Dana Rivera",
      "email": "dana.rivera@example.com",
      "created_at": "2025-11-03T09:21:44.000Z",
      "updated_at": "2026-07-28T16:02:10.000Z"
    }
  ],
  "next_page_token": "eyJvcmdhbml6YXRpb2...",
  "has_more": true
}
```

<ResponseField name="object" type="string">
  Her zaman `"list"`.
</ResponseField>

<ResponseField name="data" type="array">
  Kaynakların sayfası; sabit ve belirlenimci bir sırada.
</ResponseField>

<ResponseField name="next_page_token" type="string | null">
  Sonraki sayfayı almak için bunu bir sonraki istekte `page_token` olarak iletin.
  Başka sonuç kalmadığında `null` olur.
</ResponseField>

<ResponseField name="has_more" type="boolean">
  Bu sayfanın ötesinde başka sonuçların bulunup bulunmadığını belirtir.
</ResponseField>

## İstek parametreleri

<ParamField query="limit" type="integer" default="25">
  Sayfa boyutu. 1 ile 500 arasında bir tam sayı. Bu aralığın dışındaki değerler, `invalid_request` koduyla
  bir `400` döndürür.
</ParamField>

<ParamField query="page_token" type="string">
  Önceki yanıttaki `next_page_token`. İlk sayfa için bu parametreyi kullanmayın.
</ParamField>

Offset parametreleri, önceki sayfaya geçiş ve kesin toplam sayılar yoktur. Bir koleksiyonu saymak için koleksiyonun tamamında gezinin.

<Note>
  **İstisna:** `GET /v1/cohorts/{id}/members`, daha yüksek bir `limit` istenmiş olsa bile sayfa başına en fazla 50 satır döndürür. `has_more` ve
  `next_page_token` yine de Grup içinde kalan gerçek miktarı yansıtır.
</Note>

İki Basic kimlik bilgisi biçiminden herhangi 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).

## Bir listede gezinme

`LIVING_SECURITY_API_KEY` değerini, hızlı başlangıçta olduğu gibi gizli anahtar yöneticinizden yükleyin.
Bu örnek için `entity:read` gerekir; ilk istek kılavuzunda kullanılan anahtar için bu ek yetkinin
verilmesi gerekebilir. Python için `requests`, kabuk örneği için `jq` yükleyin. Her iki örnek de bir sürüme sabitlenir, filtreleri değiştirmez ve yönlendirmeleri reddeder. Kısmi bir gezinmeyi tamamlanmış olarak bildirmek yerine hatalarda ve 1.000 sayfadan sonra durur. Python'ın okuma zaman aşımı toplam iş süresini değil, hareketsizlik süresini sınırlar; entegrasyonunuzda bir iş son tarihi belirleyin.

`next_page_token` değeri `null` olana kadar sayfaları isteyin. Koleksiyonu daha az istekle kapsamak için toplu
okumalarda `limit=500` kullanmayı tercih edin — bkz.
[hız sınırları](/tr/developers/v1/rate-limits).

<CodeGroup>
  ```bash cURL + jq theme={null}
  set -euo pipefail
  # US: BASE="https://api.us-east-1.livingsecurity.ai/v1"
  BASE="https://api.eu-west-1.livingsecurity.ai/v1"
  : "${LIVING_SECURITY_API_KEY:?Set LIVING_SECURITY_API_KEY}"
  TOKEN=""

  # Bound each run. Increase this page budget deliberately for larger collections.
  for ((page_number=1; page_number<=1000; page_number++)); do
    PARAMS=(--data-urlencode "limit=500" --data-urlencode "type=person")
    if [ -n "$TOKEN" ]; then
      PARAMS+=(--data-urlencode "page_token=$TOKEN")
    fi
    RESULT=$(curl --silent --show-error --fail-with-body \
      --connect-timeout 5 --max-time 30 --get \
      -u "apikey:$LIVING_SECURITY_API_KEY" \
      -H "Living-Security-Version: 2026-07-01" \
      --write-out '\n%{http_code}' "${PARAMS[@]}" "$BASE/entities")
    STATUS="${RESULT##*$'\n'}"
    PAGE="${RESULT%$'\n'*}"
    [ "$STATUS" = "200" ] || { echo "Unexpected HTTP status: $STATUS" >&2; exit 1; }
    jq -e 'has("next_page_token") and .object == "list" and (.data | type == "array") and
      ((.has_more == false and .next_page_token == null) or
       (.has_more == true and (.next_page_token | type == "string" and length > 0)))' \
      <<< "$PAGE" > /dev/null
    NEXT=$(jq -r '.next_page_token // empty' <<< "$PAGE")
    [ -z "$NEXT" ] || [ "$NEXT" != "$TOKEN" ] || { echo "Repeated page token" >&2; exit 1; }
    jq -r '.data[].id' <<< "$PAGE"
    [ -n "$NEXT" ] || exit 0
    TOKEN="$NEXT"
  done
  echo "Page budget exhausted; the collection is incomplete" >&2
  exit 1
  ```

  ```python Python theme={null}
  import os
  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 iter_entities(*, entity_type="person", max_pages=1000):
      if type(max_pages) is not int or max_pages < 1:
          raise ValueError("max_pages must be a positive integer")
      params = {"limit": 500, "type": entity_type}
      for _ in range(max_pages):
          response = requests.get(
              f"{BASE}/entities",
              auth=AUTH,
              params=params,
              headers={"Living-Security-Version": "2026-07-01"},
              timeout=(5, 30),
              allow_redirects=False,
          )
          try:
              response.raise_for_status()
              if response.status_code != 200:
                  raise RuntimeError("Unexpected response; check your regional API URL")
              page = response.json()
          finally:
              response.close()
          if (not isinstance(page, dict) or page.get("object") != "list"
                  or not isinstance(page.get("data"), list)
                  or type(page.get("has_more")) is not bool
                  or "next_page_token" not in page):
              raise RuntimeError("Invalid list response")
          token = page["next_page_token"]
          if ((page["has_more"] and (not isinstance(token, str) or not token))
                  or (not page["has_more"] and token is not None)):
              raise RuntimeError("Inconsistent list response")
          if token is not None and token == params.get("page_token"):
              raise RuntimeError("Repeated page token")
          yield from page["data"]
          if token is None:
              return
          params = {**params, "page_token": token}
      raise RuntimeError("Page budget exhausted; the collection is incomplete")

  if __name__ == "__main__":
      for entity in iter_entities():
          print(entity["id"])
  ```
</CodeGroup>

## Sayfalama sırasında filtreleri sabit tutun

Sayfa belirteçleri opak, imzalı imleçlerdir. Her belirteç; kuruluşa, kimliği doğrulanmış hizmet hesabına, sözleşme sürümüne ve kendisini üreten isteğin tam filtre kümesine bağlıdır. Gezinme sırasında bunlardan herhangi birini değiştirmek — örneğin ikinci sayfada bir `type` filtresi eklemek — `page_token` parametresi için `invalid_request` koduyla bir `400` döndürür:

```json 400 Invalid request theme={null}
{
  "type": "https://docs.livingsecurity.com/developers/v1/errors/invalid_request",
  "title": "Invalid request",
  "status": 400,
  "detail": "page_token does not match this request's organization, credential, contract version, or filters.",
  "code": "invalid_request",
  "param": "page_token",
  "request_id": "req_...",
  "doc_url": "https://docs.livingsecurity.com/developers/v1/errors/invalid_request",
  "retryable": false
}
```

Filtreleri değiştirmek için ilk sayfadan yeni bir gezinme başlatın.

<Tip>
  `page_token` değerini opak bir dize olarak değerlendirin: aldığınız şekliyle aynen geri iletin.
  Belirteçlerin kodunu çözmeyin, uzun süreli saklamayın veya kendiniz oluşturmayın — iç biçimleri
  önceden haber verilmeksizin her an değişebilir.
</Tip>

<Note>
  Liste uç noktaları, desteklemedikleri sorgu parametrelerini parametreyi belirten bir `400`
  `invalid_request` ile reddeder. Desteklenen filtreler için her uç noktanın referansına bakın.
</Note>

## Yarıda kesilen veya değişen bir koleksiyonu yönetme

Bu örnekler hataları otomatik olarak yeniden denemez. `429` için `Retry-After` değerine uyun
ve sınırlı [yeniden deneme yönergelerini](/tr/developers/v1/rate-limits) izleyin. Bir okumayı yeniden denerken
aynı bölgeyi, hizmet hesabını, sürümü, filtreleri ve son başarıyla işlenen sayfa belirtecini kullanın. Kimlik bilgilerini değiştirmek erişim sağlamaz:
her istek güncel izinleri yine denetler.

Çok sayfalı bir okuma, koleksiyonun anlık görüntüsü değildir. Gezinirken satırlar
değişebilir. Kaynakları sabit `id` değerleriyle işleyin ve aşağı akış
yazma işlemlerini idempotent hale getirin; yeniden başlatma bir satırı tekrar döndürebilir. Bir belirteç reddedilirse,
baştan başlamadan önce `page_token` hatasını inceleyin ve isteği düzeltin. Daha önce işlenmiş verileri sessizce atmayın veya yarıda kalmış bir dışa aktarmayı tamamlanmış olarak işaretlemeyin. Kesin raporlama toplamları için canlı bir liste gezinmesini anlık görüntü olarak değerlendirmek yerine uygun raporlama kaynağını kullanın.


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