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

# Lapdale

> Pārlūkojiet Living Security Public API sarakstus, izmantojot saraksta apvalku, parametru limit un necaurredzamos page_token kursorus.

Katrs `/v1` saraksta galapunkts atgriež vienu un to pašu apvalku un veic lapošanu
vienādi: uz tokeniem balstītu, tikai uz priekšu.

## Saraksta apvalks

```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">
  Vienmēr `"list"`.
</ResponseField>

<ResponseField name="data" type="array">
  Resursu lapa stabilā, deterministiskā secībā.
</ResponseField>

<ResponseField name="next_page_token" type="string | null">
  Nododiet to kā `page_token` nākamajā pieprasījumā, lai iegūtu nākamo lapu.
  `null`, ja citu rezultātu nav.
</ResponseField>

<ResponseField name="has_more" type="boolean">
  Norāda, vai papildus šai lapai ir pieejami vēl citi rezultāti.
</ResponseField>

## Pieprasījuma parametri

<ParamField query="limit" type="integer" default="25">
  Lapas izmērs. Vesels skaitlis no 1 līdz 500. Vērtības ārpus šī diapazona atgriež
  `400` ar kodu `invalid_request`.
</ParamField>

<ParamField query="page_token" type="string">
  `next_page_token` no iepriekšējās atbildes. Pirmajai lapai to izlaidiet.
</ParamField>

Nav nobīdes (offset) parametru, nav pārejas uz iepriekšējo lapu un nav precīzu
kopējo skaitu. Lai saskaitītu kolekcijas elementus, izejiet tai cauri.

<Note>
  **Izņēmums:** `GET /v1/cohorts/{id}/members` atgriež ne vairāk kā 50 rindu vienā
  lapā, pat ja pieprasāt lielāku `limit`. `has_more` un
  `next_page_token` joprojām atspoguļo patieso Cohort atlikumu.
</Note>

Autentificējieties, izmantojot jebkuru no Basic akreditācijas datu veidiem — skatiet
[Quickstart](/lv/developers/v1/quickstart) (`apikey:secret` vai `secret:`).
Iestatiet `BASE` uz organizācijas reģionālo resursdatoru — skatiet
[Regions](/lv/developers/v1/regions).

## Saraksta pārlūkošana

Ielādējiet `LIVING_SECURITY_API_KEY` no sava noslēpumu pārvaldnieka, kā parādīts quickstart sadaļā.
Šim piemēram nepieciešams `entity:read`; atslēgai, kas izmantota pirmā pieprasījuma pamācībā,
var būt nepieciešama šī papildu atļauja. Instalējiet `requests` Python piemēram vai `jq`
čaulas piemēram. Abos piemēros ir fiksēta versija, filtri netiek mainīti un
novirzījumi tiek noraidīti. Tie apstājas kļūdu gadījumā un pēc 1 000 lapām, nevis
ziņo par daļēju pārlūkošanu kā pabeigtu. Python lasīšanas taimauts ierobežo
neaktivitāti, nevis kopējo darba ilgumu; savā integrācijā nosakiet darba termiņu.

Pieprasiet lapas, līdz `next_page_token` ir `null`. Masveida lasīšanai dodiet priekšroku `limit=500`,
lai kolekciju aptvertu ar mazāk pieprasījumiem — skatiet
[rate limits](/lv/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>

## Saglabājiet filtrus nemainīgus lapošanas laikā

Lapu tokeni ir necaurredzami, parakstīti kursori. Katrs tokens ir saistīts ar
organizāciju, autentificēto servisa kontu, līguma versiju un precīzu filtru kopu
pieprasījumam, kas to izveidoja. Jebkuras no šīm vērtībām maiņa pārlūkošanas laikā — piemēram,
`type` filtra pievienošana otrajā lapā — atgriež `400` ar kodu
`invalid_request` parametram `page_token`:

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

Lai mainītu filtrus, sāciet jaunu pārlūkošanu no pirmās lapas.

<Tip>
  Izturieties pret `page_token` kā pret necaurredzamu virkni: nododiet to atpakaļ tieši tādu,
  kādu saņēmāt. Neatšifrējiet, neglabājiet ilgtermiņā un neveidojiet tokenus — to iekšējais
  formāts var mainīties jebkurā laikā bez brīdinājuma.
</Tip>

<Note>
  Saraksta galapunkti noraida vaicājuma parametrus, kurus tie neatbalsta, ar `400`
  `invalid_request`, kurā norādīts parametra nosaukums. Katra galapunkta atbalstītos filtrus skatiet tā
  atsaucē.
</Note>

## Pārtrauktas vai mainīgas kolekcijas apstrāde

Šie piemēri kļūdas automātiski nemēģina atkārtot. Kļūdas `429` gadījumā ievērojiet `Retry-After`
un izpildiet ierobežotās [atkārtošanas norādes](/lv/developers/v1/rate-limits). Lasīšanas
atkārtošanas laikā saglabājiet to pašu reģionu, servisa kontu, versiju, filtrus un pēdējo
sekmīgi apstrādāto lapas tokenu. Akreditācijas datu maiņa nepiešķir piekļuvi:
katrs pieprasījums joprojām pārbauda spēkā esošās atļaujas.

Vairāku lapu lasīšana nav kolekcijas momentuzņēmums. Rindas var mainīties, kamēr jūs
tai ejat cauri. Apstrādājiet resursus pēc to stabilā `id` un veidojiet idempotentus
turpmākos ierakstus; pēc atsākšanas rinda var tikt atgriezta vēlreiz. Ja tokens tiek noraidīts,
izpētiet `page_token` kļūdu un izlabojiet pieprasījumu, pirms sākat no pirmās lapas.
Nenometiet klusējot iepriekš apstrādātos datus un nenorādiet pārtrauktu eksportu kā pabeigtu.
Lai iegūtu precīzus pārskatu kopskaitus, izmantojiet atbilstošu pārskatu resursu, nevis uzskatiet
dzīvā saraksta pārlūkošanu par momentuzņēmumu.


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