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

> स्कोप्ड API एक्सेस की के साथ किसी स्रोत को पंजीकृत करें और JSON या CSV इवेंट बैच Living Security को भेजें।

जब कोई सिस्टम Catalog कनेक्टर द्वारा पोल किए जाने के बजाय Living Security को रिकॉर्ड भेजता है, तब Custom Push Source का उपयोग करें। प्रेषक (sender) JSON ऐरे या CSV फ़ाइलें क्षेत्रीय HTTPS एंडपॉइंट पर सबमिट कर सकता है।

## शुरू करने से पहले

आपको निम्नलिखित की आवश्यकता होगी:

* Living Security में integrations और एक्सेस की प्रबंधित करने की अनुमति
* एक सर्वर-साइड प्रेषक जो HTTPS `POST` अनुरोध कर सके
* आपके संगठन का Living Security क्षेत्र (region)
* एक स्थिर स्रोत नाम और कम से कम एक स्ट्रीम नाम

स्रोत नाम और स्ट्रीम नाम स्थायी राउटिंग की होते हैं। स्रोत नाम में 1–64 लोअरकेस अक्षर, अंक या हाइफ़न होने चाहिए। स्ट्रीम नामों में अंडरस्कोर की भी अनुमति है। दोनों की शुरुआत किसी अक्षर या अंक से होनी चाहिए।

<Warning>
  API एक्सेस की को गोपनीय रखें। इसे ब्राउज़र कोड में न रखें, सोर्स कंट्रोल में कमिट न करें,
  और सपोर्ट टिकट में न भेजें।
</Warning>

## 1. स्रोत और स्ट्रीम पंजीकृत करें

<Steps>
  <Step title="Custom Push Source खोलें">
    **Settings → Integrations → Catalog** पर जाएँ, **Custom Push Source** खोजें और **Add** चुनें।
  </Step>

  <Step title="स्रोत को नाम दें">
    स्रोत की राउटिंग की और वैकल्पिक विवरण दर्ज करें। उदाहरण के लिए, रिक्त स्थान वाले डिस्प्ले नाम के बजाय `custom-phishing-sim` का उपयोग करें।
  </Step>

  <Step title="स्ट्रीम जोड़ें">
    प्रेषक द्वारा उपयोग की जाने वाली प्रत्येक स्ट्रीम जोड़ें। पहले पुश से पहले स्रोत और स्ट्रीम का जोड़ा मौजूद होना चाहिए; अज्ञात जोड़ा `404 Not Found` लौटाता है।
  </Step>

  <Step title="स्रोत सहेजें">
    निर्माण के बाद, **Settings → Integrations → Connected** के अंतर्गत स्रोत खोलें। इसका **Push via API** व्यू एंडपॉइंट पैटर्न और हाल के रन दिखाता है।
  </Step>
</Steps>

## 2. push-ingest की बनाएँ

**Settings → Access Keys** पर जाएँ, **Create Access Key** चुनें और **Push Ingest** स्कोप चुनें। जनरेट किया गया मान तुरंत कॉपी कर लें; यह केवल एक बार दिखाया जाता है।

यह की एक Living Security संगठन से जुड़ी होती है। पुश अनुरोध में संगठन हेडर की आवश्यकता नहीं होती। रोटेशन और निरस्तीकरण के लिए [API Access Keys](/hi/features/settings/api-keys) देखें।

## 3. क्षेत्रीय एंडपॉइंट चुनें

अपने Living Security संगठन के लिए होस्टनाम का उपयोग करें:

| क्षेत्र | बेस URL |
| - | - |
| संयुक्त राज्य अमेरिका | `https://api.us-east-1.livingsecurity.ai/api/v1` |
| यूरोपीय संघ | `https://api.eu-west-1.livingsecurity.ai/api/v1` |

`/push-ingest/{integrationKey}/{streamName}` जोड़ें। पाथ केस-सेंसिटिव है और पंजीकृत स्रोत व स्ट्रीम से ठीक मेल खाना चाहिए।

<ParamField path="integrationKey" type="string" required>
  पंजीकृत स्रोत नाम। 1–64 लोअरकेस अक्षर, अंक या हाइफ़न का उपयोग करें, जिसकी शुरुआत अक्षर या अंक से हो।
</ParamField>

<ParamField path="streamName" type="string" required>
  पंजीकृत स्ट्रीम नाम। वही नियम लागू होते हैं, और अंडरस्कोर की भी अनुमति है।
</ParamField>

<ParamField header="Authorization" type="string" required>
  push-ingest एक्सेस की को `Bearer <access-key>` के रूप में भेजें।
</ParamField>

<ParamField header="Content-Type" type="string">
  JSON के लिए `application/json` या CSV के लिए `text/csv` का उपयोग करें। यह हेडर न होने पर भी सर्वर JSON ऐरे का पता लगा सकता है।
</ParamField>

<ParamField header="x-organization-id" type="string">
  वैकल्पिक संगठन UUID। एक्सेस की से संगठन पहले ही निर्धारित हो जाता है। यदि आप यह हेडर भेजते हैं, तो यह की के संगठन से मेल खाना चाहिए; इससे कोई अन्य संगठन नहीं चुना जा सकता।
</ParamField>

### अनुरोध बॉडी

ऑब्जेक्ट्स का शीर्ष-स्तरीय, गैर-रिक्त JSON ऐरे, या हेडर पंक्ति वाली CSV फ़ाइल के बाइट्स भेजें। कोई नामित JSON रैपर फ़ील्ड नहीं है। प्रत्येक बैच में अधिकतम 10,000 रिकॉर्ड और 10 MB हो सकते हैं।

## 4. JSON बैच भेजें

एक गैर-रिक्त JSON ऐरे भेजें जिसके तत्व ऑब्जेक्ट हों। `Content-Type: application/json` अनुशंसित है और कई प्रेषक उत्पादों द्वारा आवश्यक है, भले ही Living Security इसके बिना भी ऐरे बॉडी का पता लगा सकता है।

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

सफल अनुरोध `202 Accepted` लौटाता है। JSON बॉडी गलत प्रारूप में होने पर एरर टैब `400 Bad Request` दिखाता है:

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

स्वीकृति का अर्थ है कि बैच को एसिंक्रोनस प्रोसेसिंग के लिए संग्रहीत कर लिया गया है। इसका अर्थ यह नहीं है कि प्रत्येक रिकॉर्ड की व्याख्या पहले ही गतिविधि में की जा चुकी है।
`400` उदाहरण के लिए, JSON को सुधारें या `Content-Type: text/csv` के साथ CSV भेजें, फिर पुनः प्रयास करें।

<ResponseField name="runId" type="string" required>
  इस स्वीकृत बैच का रन ID। प्रोसेसिंग स्थिति जाँचने के लिए इसे सुरक्षित रखें।
</ResponseField>

<ResponseField name="recordsAccepted" type="number" required>
  स्वीकार और संग्रहीत किए गए रिकॉर्ड की संख्या।
</ResponseField>

<ResponseField name="integrationKey" type="string" required>
  इस पुश के लिए उपयोग किया गया स्रोत नाम।
</ResponseField>

<ResponseField name="streamName" type="string" required>
  इस पुश के लिए उपयोग किया गया स्ट्रीम नाम।
</ResponseField>

## इसके बजाय CSV भेजें

`Content-Type: text/csv` सेट करें और फ़ाइल बाइट्स भेजें, जैसा कि ऊपर **CSV file** अनुरोध उदाहरण में दिखाया गया है। पहली पंक्ति फ़ील्ड नाम प्रदान करती है।

बूलियन टेक्स्ट बूलियन बन जाता है और सामान्य संख्यात्मक टेक्स्ट संख्या बन जाता है। अग्रणी शून्य वाले मान, असुरक्षित रूप से बड़े पूर्णांक, तिथियाँ और अन्य टेक्स्ट स्ट्रिंग ही रहते हैं। रिक्त सेल होने पर वह फ़ील्ड छोड़ दिया जाता है। गलत प्रारूप वाली पंक्तियाँ, असंतुलित उद्धरण चिह्न और UTF-16 फ़ाइलें अस्वीकार कर दी जाती हैं।

## अनुरोध सीमाएँ और पुनः प्रयास

| अनुबंध | वर्तमान मान |
| - | - |
| अधिकतम रिकॉर्ड | प्रति अनुरोध 10,000 |
| अधिकतम अनुरोध बॉडी | 10 MB |
| प्रति-संगठन अनुरोध दर | 60 सेकंड में 600 अनुरोध |

बड़े एक्सपोर्ट को ऐसे बैचों में विभाजित करें जो दोनों सीमाओं को पूरा करते हों। प्रत्येक प्रतिक्रिया की प्रतीक्षा करें और लौटाए गए `runId` को प्रेषक लॉग में सुरक्षित रखें।

| प्रतिक्रिया | अर्थ | प्रेषक की कार्रवाई |
| - | - | - |
| `202` | बैच स्वीकृत | `runId` दर्ज करें; तुरंत पुनः न भेजें |
| `400` | अमान्य नाम, JSON, CSV, रिकॉर्ड संख्या या बॉडी | अनुरोध सुधारें; बिना बदलाव के पुनः प्रयास न करें |
| `401` | की अनुपस्थित, समाप्त, निरस्त या अमान्य है | की बदलें और Bearer हेडर का उपयोग करें |
| `403` | की में आवश्यक स्कोप नहीं है | **Push Ingest** स्कोप वाली की बनाएँ |
| `404` | स्रोत या स्ट्रीम पंजीकृत नहीं है | सटीक जोड़ा पंजीकृत करें या URL सुधारें |
| `413` | अनुरोध बॉडी 10 MB से अधिक है | बैच को छोटे अनुरोधों में विभाजित करें |
| `429` | अस्थायी IP-स्तरीय थ्रॉटलिंग | `Retry-After` मौजूद होने पर उसका पालन करें और प्रतीक्षा करें |
| `503` | संगठन रेट बकेट या लिमिटर अनुपलब्ध | `Retry-After` तक प्रतीक्षा करें, फिर वही बैच पुनः भेजें |

सामान्य प्रमाणित संगठन सीमा `503` लौटाती है, `429` नहीं, ताकि वेबहुक प्रेषक इसे पुनः प्रयास योग्य मानें। बैच संग्रहीत होने से पहले `503` लौटाया जाता है; बताए गए अंतराल के बाद उसी बैच को पुनः भेजने से स्वीकृत रन की डुप्लिकेट प्रति नहीं बनती।

## डेटा प्रवाह सत्यापित करें

Custom Push Source खोलें और **Push History** की समीक्षा करें। स्ट्रीम, रिकॉर्ड संख्या, की एट्रिब्यूशन और प्रोसेसिंग स्थिति की पुष्टि करें। जिस डेटा के लिए अनुरक्षित इंटरप्रेटर उपलब्ध है, वह लोगों और सामान्यीकृत गतिविधि में परिवर्तित हो सकता है। इंटरप्रेटर के बिना डेटा संग्रहीत रहता है, लेकिन गतिविधि उत्पन्न नहीं करता।

<Info>
  जब प्रदाता-विशिष्ट गाइड उपलब्ध हो, तो उसके सटीक फ़ील्ड नामों और पेलोड संरचना का उपयोग करें। सफल `202` केवल डिलीवरी सिद्ध करता है, यह नहीं कि कोई मनमाना स्कीमा Living Security गतिविधि से मैप होता है।
</Info>

## समस्या निवारण चेकलिस्ट

* सही स्रोत से एंडपॉइंट कॉपी करें और स्ट्रीम प्लेसहोल्डर बदलें।
* एक्सेस की को `Authorization: Bearer …` के रूप में भेजें; `x-api-key` स्वीकार नहीं किया जाता।
* पुष्टि करें कि बॉडी शीर्ष-स्तरीय JSON ऐरे है, न कि एकल ऑब्जेक्ट या रिकॉर्ड के चारों ओर कोई एनवेलप।
* स्रोत और स्ट्रीम की वर्तनी की पुष्टि करें, जिसमें हाइफ़न, अंडरस्कोर और अक्षर-केस शामिल हैं।
* जिस बैच की प्रतिक्रिया खो गई हो, उसे पुनः भेजने से पहले **Push History** की समीक्षा करें।
* [Living Security Support](mailto:support@livingsecurity.com) से संपर्क करते समय संगठन, स्रोत, स्ट्रीम, अनुरोध का समय, उपलब्ध होने पर `runId` और प्रतिक्रिया स्थिति शामिल करें। एक्सेस की या इवेंट पेलोड शामिल न करें।

## संबंधित

<CardGroup cols={2}>
  <Card title="Zscaler ZIA Cloud NSS" icon="shield" href="/hi/integrations/zscaler-zia-cloud-nss">
    सटीक स्रोत, स्ट्रीम, हेडर और JSON संरचना के साथ समर्थित Zscaler वेब-लॉग फ़ीड कॉन्फ़िगर करें।
  </Card>

  <Card title="API Access Keys" icon="key" href="/hi/features/settings/api-keys">
    स्कोप्ड क्रेडेंशियल बनाएँ, रोटेट करें और निरस्त करें।
  </Card>

  <Card title="Signal Data Sources" icon="wave-pulse" href="/hi/signals/data-sources">
    जानें कि व्याख्या की गई इंटीग्रेशन गतिविधि Signals को कैसे सहयोग देती है।
  </Card>
</CardGroup>


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