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

# Custom Push Source API

> Manbani ro‘yxatdan o‘tkazing va cheklangan ruxsatli API access key yordamida Living Security’ga JSON yoki CSV formatidagi hodisa paketlarini yuboring.

Tizim yozuvlarni Catalog connector orqali so‘rov yuborib olinishini kutmasdan, to‘g‘ridan-to‘g‘ri Living Security’ga yuborganida Custom Push Source’dan foydalaning. Yuboruvchi JSON massivlarini yoki CSV fayllarini mintaqaviy HTTPS endpoint’ga topshirishi mumkin.

## Boshlashdan oldin

Sizga quyidagilar kerak bo‘ladi:

* Living Security’da integratsiyalar va access key’larni boshqarish uchun ruxsat
* HTTPS `POST` so‘rovlarini yubora oladigan server tomonidagi yuboruvchi
* tashkilotingiz uchun Living Security mintaqasi
* doimiy manba nomi va kamida bitta stream nomi

Manba nomlari va stream nomlari doimiy marshrutlash kalitlaridir. Manba nomlari 1–64 ta kichik lotin harflari, raqamlar yoki defislardan iborat bo‘lishi kerak. Stream nomlarida pastki chiziq ham ruxsat etiladi. Ikkalasi ham harf yoki raqam bilan boshlanishi shart.

<Warning>
  API access key’ni maxfiy ma’lumot sifatida saqlang. Uni brauzer kodiga qo‘ymang,
  manba kodi omboriga commit qilmang va qo‘llab-quvvatlash so‘rovi orqali yubormang.
</Warning>

## 1. Manba va stream’larni ro‘yxatdan o‘tkazing

<Steps>
  <Step title="Custom Push Source’ni oching">
    **Settings → Integrations → Catalog** bo‘limiga o‘ting, **Custom Push Source**’ni toping va **Add** tugmasini tanlang.
  </Step>

  <Step title="Manbaga nom bering">
    Manbaning marshrutlash kalitini va ixtiyoriy tavsifni kiriting. Masalan, bo‘sh joylar bor ko‘rsatiladigan nom o‘rniga `custom-phishing-sim` dan foydalaning.
  </Step>

  <Step title="Stream’larni qo‘shing">
    Yuboruvchi foydalanadigan har bir stream’ni qo‘shing. Birinchi yuborishdan oldin manba va stream juftligi mavjud bo‘lishi kerak; noma’lum juftlik `404 Not Found` xatosini qaytaradi.
  </Step>

  <Step title="Manbani saqlang">
    Yaratilgandan so‘ng manbani **Settings → Integrations → Connected** bo‘limida oching. Uning **Push via API** ko‘rinishida endpoint namunasi va so‘nggi ishga tushirishlar ko‘rsatiladi.
  </Step>
</Steps>

## 2. Push-ingest key yarating

**Settings → Access Keys** bo‘limiga o‘ting, **Create Access Key** tugmasini tanlang va **Push Ingest** scope’ini belgilang. Hosil qilingan qiymatni darhol nusxalang; u faqat bir marta ko‘rsatiladi.

Key bitta Living Security tashkilotiga bog‘langan. Push so‘rovi uchun tashkilot header’i talab qilinmaydi. Almashtirish va bekor qilish bo‘yicha [API Access Keys](/uz/features/settings/api-keys) bo‘limiga qarang.

## 3. Mintaqaviy endpoint’ni tanlang

Living Security tashkilotingiz uchun host nomidan foydalaning:

| Mintaqa | Base URL |
| - | - |
| Qo‘shma Shtatlar | `https://api.us-east-1.livingsecurity.ai/api/v1` |
| Yevropa Ittifoqi | `https://api.eu-west-1.livingsecurity.ai/api/v1` |

`/push-ingest/{integrationKey}/{streamName}` ni qo‘shing. Yo‘l registrga sezgir va ro‘yxatdan o‘tkazilgan manba hamda stream bilan aynan mos kelishi kerak.

<ParamField path="integrationKey" type="string" required>
  Ro‘yxatdan o‘tkazilgan manba nomi. 1–64 ta kichik lotin harflari, raqamlar yoki defislardan foydalaning; harf yoki raqam bilan boshlanishi kerak.
</ParamField>

<ParamField path="streamName" type="string" required>
  Ro‘yxatdan o‘tkazilgan stream nomi. Xuddi shu qoidalar amal qiladi, pastki chiziqlarga ham ruxsat etiladi.
</ParamField>

<ParamField header="Authorization" type="string" required>
  Push-ingest access key’ni `Bearer <access-key>` ko‘rinishida yuboring.
</ParamField>

<ParamField header="Content-Type" type="string">
  JSON uchun `application/json`, CSV uchun `text/csv` dan foydalaning. Bu header ko‘rsatilmagan bo‘lsa, server JSON massivini o‘zi ham aniqlay oladi.
</ParamField>

<ParamField header="x-organization-id" type="string">
  Ixtiyoriy tashkilot UUID’si. Tashkilotni access key allaqachon belgilaydi. Bu header yuborilsa, u key tashkilotiga mos kelishi kerak; u orqali boshqa tashkilotni tanlab bo‘lmaydi.
</ParamField>

### So‘rov tanasi

Obyektlardan iborat yuqori darajadagi bo‘sh bo‘lmagan JSON massivini yoki sarlavha qatori bor CSV fayl baytlarini yuboring. Nomlangan JSON o‘rovchi maydon yo‘q. Har bir paket 10,000 tagacha yozuv va 10 MB gacha hajmni o‘z ichiga olishi mumkin.

## 4. JSON paketini yuboring

Elementlari obyektlardan iborat bo‘sh bo‘lmagan JSON massivini yuboring. Living Security massiv tanasini `Content-Type: application/json` siz ham aniqlay olsa-da, uni ko‘rsatish tavsiya etiladi va ko‘plab yuboruvchi mahsulotlar uchun majburiy.

<RequestExample>
  ```bash JSON batch theme={null}
  curl --request POST \
    'https://api.us-east-1.livingsecurity.ai/api/v1/push-ingest/custom-phishing-sim/events' \
    --header 'Authorization: Bearer <access-key>' \
    --header 'Content-Type: application/json' \
    --data '[
      {
        "email": "person@example.com",
        "event_at": "2026-09-21T14:30:00Z",
        "action": "reported"
      }
    ]'
  ```

  ```bash CSV file theme={null}
  curl --request POST \
    'https://api.us-east-1.livingsecurity.ai/api/v1/push-ingest/custom-phishing-sim/events' \
    --header 'Authorization: Bearer <access-key>' \
    --header 'Content-Type: text/csv' \
    --data-binary '@events.csv'
  ```
</RequestExample>

Muvaffaqiyatli so‘rov `202 Accepted` qaytaradi. JSON tanasi noto‘g‘ri shakllangan bo‘lsa, xato yorlig‘ida `400 Bad Request` ko‘rsatiladi:

<ResponseExample>
  ```json 202 Accepted theme={null}
  {
    "runId": "01a0c45f-ae40-7e5f-8a9b-0c1d2e3f4a5b",
    "recordsAccepted": 1,
    "integrationKey": "custom-phishing-sim",
    "streamName": "events"
  }
  ```

  ```json 400 Invalid JSON theme={null}
  {
    "statusCode": 400,
    "timestamp": "2026-09-22T14:30:00.000Z",
    "path": "/api/v1/push-ingest/custom-phishing-sim/events",
    "message": "Request body is not valid JSON. Send a JSON array of objects, or set Content-Type: text/csv to push a CSV.",
    "error": "Bad Request"
  }
  ```
</ResponseExample>

Qabul qilinish paket asinxron qayta ishlash uchun saqlanganini bildiradi. Bu har bir yozuv allaqachon faoliyat sifatida talqin qilinganini anglatmaydi.
`400` namunasi uchun JSON’ni tuzating yoki `Content-Type: text/csv` bilan CSV yuboring, so‘ng qayta urinib ko‘ring.

<ResponseField name="runId" type="string" required>
  Qabul qilingan ushbu paket uchun run ID. Qayta ishlash holatini tekshirish uchun uni saqlab qo‘ying.
</ResponseField>

<ResponseField name="recordsAccepted" type="number" required>
  Qabul qilingan va saqlangan yozuvlar soni.
</ResponseField>

<ResponseField name="integrationKey" type="string" required>
  Ushbu push uchun ishlatilgan manba nomi.
</ResponseField>

<ResponseField name="streamName" type="string" required>
  Ushbu push uchun ishlatilgan stream nomi.
</ResponseField>

## Buning o‘rniga CSV yuborish

`Content-Type: text/csv` ni o‘rnating va yuqoridagi **CSV file** so‘rov namunasida ko‘rsatilganidek fayl baytlarini yuboring. Birinchi qator maydon nomlarini beradi.

Mantiqiy matn boolean qiymatga, oddiy raqamli matn esa songa aylanadi. Boshida nol bo‘lgan qiymatlar, xavfli darajada katta butun sonlar, sanalar va boshqa matnlar satr sifatida qoladi. Bo‘sh kataklar uchun o‘sha maydon qoldirib ketiladi. Noto‘g‘ri shakllangan qatorlar, juftlanmagan qo‘shtirnoqlar va UTF-16 fayllar rad etiladi.

## So‘rov cheklovlari va qayta urinishlar

| Shart | Joriy qiymat |
| - | - |
| Yozuvlarning maksimal soni | Har bir so‘rovda 10,000 |
| So‘rov tanasining maksimal hajmi | 10 MB |
| Tashkilot uchun so‘rovlar tezligi | 60 soniyada 600 ta so‘rov |

Katta eksportlarni ikkala cheklovga ham javob beradigan paketlarga bo‘ling. Har bir javobni kuting va qaytarilgan `runId` ni yuboruvchi jurnallarida saqlang.

| Javob | Ma’nosi | Yuboruvchi harakati |
| - | - | - |
| `202` | Paket qabul qilindi | `runId` ni yozib oling; darhol qayta yubormang |
| `400` | Nom, JSON, CSV, yozuvlar soni yoki tana noto‘g‘ri | So‘rovni tuzating; o‘zgartirmasdan qayta urinmang |
| `401` | Key yo‘q, muddati tugagan, bekor qilingan yoki yaroqsiz | Key’ni almashtiring va Bearer header’idan foydalaning |
| `403` | Key’da kerakli scope yo‘q | **Push Ingest** scope’li key yarating |
| `404` | Manba yoki stream ro‘yxatdan o‘tkazilmagan | Aynan shu juftlikni ro‘yxatdan o‘tkazing yoki URL’ni tuzating |
| `413` | So‘rov tanasi 10 MB dan oshadi | Paketni kichikroq so‘rovlarga bo‘ling |
| `429` | IP darajasidagi vaqtinchalik cheklash | `Retry-After` mavjud bo‘lsa, unga rioya qiling va kutib turing |
| `503` | Tashkilot tezlik chegarasi yoki limiter mavjud emas | `Retry-After` gacha kuting, so‘ng xuddi shu paketni qayta yuboring |

Autentifikatsiyadan o‘tgan tashkilot uchun odatiy chegara `429` emas, `503` ni qaytaradi, shu sababli webhook yuboruvchilar buni qayta urinish mumkin bo‘lgan holat deb hisoblaydi. `503` paket saqlanishidan oldin qaytariladi; o‘sha paketni ko‘rsatilgan oraliqdan keyin qayta yuborish qabul qilingan run’ni takrorlamaydi.

## Ma’lumotlar oqimini tekshiring

Custom Push Source’ni oching va **Push History**’ni ko‘rib chiqing. Stream, yozuvlar soni, key’ga bog‘lanish va qayta ishlash holatini tasdiqlang. Qo‘llab-quvvatlanadigan interpreter mavjud ma’lumotlar keyin odamlar va normallashtirilgan faoliyatga aylanishi mumkin. Interpreter mavjud bo‘lmagan ma’lumotlar saqlanib qoladi, lekin faoliyat hosil qilmaydi.

<Info>
  Provayderga xos qo‘llanma mavjud bo‘lsa, undagi aniq maydon nomlari va
  payload tuzilmasidan foydalaning. Muvaffaqiyatli `202` yetkazib berilganini
  isbotlaydi, ixtiyoriy sxema Living Security faoliyatiga moslashishini emas.
</Info>

## Nosozliklarni bartaraf etish ro‘yxati

* Endpoint’ni to‘g‘ri manbadan nusxalang va stream o‘rin belgisini almashtiring.
* Access key’ni `Authorization: Bearer …` sifatida yuboring; `x-api-key` qabul qilinmaydi.
* Tana yuqori darajadagi JSON massivi ekanini, bitta obyekt yoki yozuvlarni o‘rab turuvchi konvert emasligini tasdiqlang.
* Manba va stream yozilishini, jumladan defislar, pastki chiziqlar va registrni tekshiring.
* Javobi yo‘qolgan paketni qayta yuborishdan oldin **Push History**’ni ko‘rib chiqing.
* [Living Security Support](mailto:support@livingsecurity.com) bilan bog‘langanda tashkilot, manba, stream, so‘rov vaqti, mavjud bo‘lsa `runId` va javob holatini ko‘rsating. Access key yoki hodisa payload’ini kiritmang.

## Tegishli bo‘limlar

<CardGroup cols={2}>
  <Card title="Zscaler ZIA Cloud NSS" icon="shield" href="/uz/integrations/zscaler-zia-cloud-nss">
    Qo‘llab-quvvatlanadigan Zscaler veb-jurnal oqimini aniq manba, stream, header’lar va JSON tuzilmasi bilan sozlang.
  </Card>

  <Card title="API Access Keys" icon="key" href="/uz/features/settings/api-keys">
    Cheklangan ruxsatli hisob ma’lumotlarini yarating, almashtiring va bekor qiling.
  </Card>

  <Card title="Signal Data Sources" icon="wave-pulse" href="/uz/signals/data-sources">
    Talqin qilingan integratsiya faoliyati Signals’ni qanday qo‘llab-quvvatlashini bilib oling.
  </Card>
</CardGroup>


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