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

> Registrera en källa och skicka JSON- eller CSV-händelsebatchar till Living Security med en åtkomstnyckel med begränsat scope.

Använd en Custom Push Source när ett system skickar poster till Living Security i stället för att hämtas via en Katalog-koppling. Avsändaren kan skicka JSON-arrayer eller CSV-filer till en regional HTTPS-slutpunkt.

## Innan du börjar

Du behöver:

* behörighet att hantera integrationer och åtkomstnycklar i Living Security
* en serverbaserad avsändare som kan göra HTTPS-anrop av typen `POST`
* den Living Security-region som din organisation tillhör
* ett stabilt källnamn och minst ett strömnamn

Källnamn och strömnamn är permanenta routningsnycklar. Källnamn måste bestå av 1–64 gemener, siffror eller bindestreck. Strömnamn får dessutom innehålla understreck. Båda måste börja med en bokstav eller siffra.

<Warning>
  Behandla API-åtkomstnyckeln som en hemlighet. Placera den inte i webbläsarkod, checka inte in
  den i versionshantering och skicka den inte i ett supportärende.
</Warning>

## 1. Registrera källan och strömmarna

<Steps>
  <Step title="Öppna Custom Push Source">
    Gå till **Inställningar → Integrationer → Katalog**, leta upp **Custom Push Source** och välj **Lägg till**.
  </Step>

  <Step title="Namnge källan">
    Ange källans routningsnyckel och en valfri beskrivning. Använd till exempel `custom-phishing-sim` i stället för ett visningsnamn med mellanslag.
  </Step>

  <Step title="Lägg till strömmar">
    Lägg till varje ström som avsändaren ska använda. Paret av källa och ström måste finnas innan den första överföringen; ett okänt par returnerar `404 Not Found`.
  </Step>

  <Step title="Spara källan">
    Öppna källan efter att den skapats under **Inställningar → Integrationer → ansluten**. Vyn **Push via API** visar slutpunktsmönstret och senaste körningar.
  </Step>
</Steps>

## 2. Skapa en nyckel för push-inmatning

Gå till **Inställningar → Access Keys**, välj **Create Access Key** och välj scopet **Push Ingest**. Kopiera det genererade värdet direkt; det visas bara en gång.

Nyckeln är kopplad till en enda Living Security-organisation. Push-anropet behöver ingen organisationshuvud. Se [API Access Keys](/sv/features/settings/api-keys) för rotation och återkallelse.

## 3. Välj den regionala slutpunkten

Använd värdnamnet för din Living Security-organisation:

| Region | Bas-URL |
| - | - |
| USA | `https://api.us-east-1.livingsecurity.ai/api/v1` |
| Europeiska unionen | `https://api.eu-west-1.livingsecurity.ai/api/v1` |

Lägg till `/push-ingest/{integrationKey}/{streamName}`. Sökvägen är skiftlägeskänslig och måste exakt motsvara den registrerade källan och strömmen.

<ParamField path="integrationKey" type="string" required>
  Det registrerade källnamnet. Använd 1–64 gemener, siffror eller bindestreck, med början på en bokstav eller siffra.
</ParamField>

<ParamField path="streamName" type="string" required>
  Det registrerade strömnamnet. Samma regler gäller, och understreck är också tillåtna.
</ParamField>

<ParamField header="Authorization" type="string" required>
  Skicka åtkomstnyckeln för push-inmatning som `Bearer <access-key>`.
</ParamField>

<ParamField header="Content-Type" type="string">
  Använd `application/json` för JSON eller `text/csv` för CSV. Servern kan också identifiera en JSON-array när den här rubriken utelämnas.
</ParamField>

<ParamField header="x-organization-id" type="string">
  Valfritt organisations-UUID. Åtkomstnyckeln avgör redan organisationen. Om du skickar den här rubriken måste den överensstämma med nyckelns organisation; den kan inte användas för att välja en annan organisation.
</ParamField>

### Förfrågans brödtext

Skicka en JSON-array på toppnivå som inte är tom och som innehåller objekt, eller bytes från en CSV-fil med en rubrikrad. Det finns inget namngivet JSON-omslagsfält. Varje batch kan innehålla upp till 10 000 poster och 10 MB.

## 4. Skicka en JSON-batch

Skicka en JSON-array som inte är tom och vars element är objekt. `Content-Type: application/json` rekommenderas och krävs av många sändande produkter, även om Living Security kan identifiera en array i brödtexten utan den.

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

En lyckad förfrågan returnerar `202 Accepted`. Felfliken visar ett `400 Bad Request` när JSON-brödtexten är felformaterad:

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

Godkännande innebär att batchen har lagrats för asynkron bearbetning. Det innebär inte att varje post redan har tolkats till aktivitet.
För exemplet `400`: korrigera JSON eller skicka CSV med `Content-Type: text/csv` och försök sedan igen.

<ResponseField name="runId" type="string" required>
  Körnings-ID för den här godkända batchen. Spara det för att kontrollera bearbetningsstatus.
</ResponseField>

<ResponseField name="recordsAccepted" type="number" required>
  Antalet poster som har godkänts och lagrats.
</ResponseField>

<ResponseField name="integrationKey" type="string" required>
  Det källnamn som användes för den här överföringen.
</ResponseField>

<ResponseField name="streamName" type="string" required>
  Det strömnamn som användes för den här överföringen.
</ResponseField>

## Skicka CSV i stället

Ange `Content-Type: text/csv` och skicka filens bytes, som visas i förfrågningsexemplet **CSV file** ovan. Den första raden anger fältnamnen.

Booleansk text blir ett booleskt värde och vanlig numerisk text blir ett tal. Värden med inledande nollor, osäkert stora heltal, datum och annan text förblir strängar. Tomma celler utelämnar fältet. Felformaterade rader, obalanserade citattecken och UTF-16-filer avvisas.

## Begränsningar för förfrågningar och nya försök

| Avtalsvillkor | Aktuellt värde |
| - | - |
| Maximalt antal poster | 10 000 per förfrågan |
| Maximal storlek på förfrågans brödtext | 10 MB |
| Förfrågningsfrekvens per organisation | 600 förfrågningar per 60 sekunder |

Dela upp större exporter i batchar som uppfyller båda begränsningarna. Vänta på varje svar och spara det returnerade `runId` i avsändarens loggar.

| Svar | Betydelse | Åtgärd för avsändaren |
| - | - | - |
| `202` | Batchen godkändes | Spara `runId`; skicka inte om direkt |
| `400` | Ogiltigt namn, ogiltig JSON, CSV, postantal eller brödtext | Korrigera förfrågan; försök inte igen oförändrad |
| `401` | Nyckeln saknas, har gått ut, har återkallats eller är ogiltig | Byt ut nyckeln och använd Bearer-rubriken |
| `403` | Nyckeln saknar nödvändigt scope | Skapa en nyckel med scopet **Push Ingest** |
| `404` | Källan eller strömmen är inte registrerad | Registrera exakt det paret eller korrigera URL:en |
| `413` | Förfrågans brödtext överstiger 10 MB | Dela upp batchen i mindre förfrågningar |
| `429` | Tillfällig strypning på IP-nivå | Följ `Retry-After` när det finns och vänta längre mellan försöken |
| `503` | Organisationens hastighetsbucket eller begränsare är otillgänglig | Vänta enligt `Retry-After` och skicka sedan samma batch igen |

Den normala gränsen för autentiserade organisationer returnerar `503`, inte `429`, så att avsändare av webhooks behandlar den som möjlig att försöka igen. Ett `503` returneras innan batchen lagras; att skicka samma batch igen efter det angivna intervallet skapar inte en dubblett av en godkänd körning.

## Verifiera dataflödet

Öppna Custom Push Source och granska **Push History**. Bekräfta strömmen, antalet poster, nyckelattribueringen och bearbetningsstatusen. Data med en underhållen tolk kan sedan bli personer och normaliserad aktivitet. Data utan tolk förblir lagrade men genererar ingen aktivitet.

<Info>
  Använd exakta fältnamn och nyttolaststruktur från den leverantörsspecifika guiden när
  en sådan finns. Ett lyckat `202` bevisar leverans, inte att ett godtyckligt schema
  mappas till Living Security-aktivitet.
</Info>

## Checklista för felsökning

* Kopiera slutpunkten från rätt källa och ersätt platshållaren för strömmen.
* Skicka åtkomstnyckeln som `Authorization: Bearer …`; `x-api-key` accepteras inte.
* Bekräfta att brödtexten är en JSON-array på toppnivå, inte ett enskilt objekt eller ett omslag runt posterna.
* Bekräfta stavningen av källa och ström, inklusive bindestreck, understreck och skiftläge.
* Granska **Push History** innan du skickar om en batch vars svar gick förlorat.
* När du kontaktar [Living Securitys support](mailto:support@livingsecurity.com), ange organisation, källa, ström, förfrågningstid, `runId` när det finns och svarsstatus. Ta inte med åtkomstnyckeln eller händelsenyttolasten.

## Relaterat

<CardGroup cols={2}>
  <Card title="Zscaler ZIA Cloud NSS" icon="shield" href="/sv/integrations/zscaler-zia-cloud-nss">
    Konfigurera ett Zscaler-webbloggflöde som stöds, med exakt källa, ström, rubriker och JSON-struktur.
  </Card>

  <Card title="API Access Keys" icon="key" href="/sv/features/settings/api-keys">
    Skapa, rotera och återkalla autentiseringsuppgifter med begränsat scope.
  </Card>

  <Card title="Signal Data Sources" icon="wave-pulse" href="/sv/signals/data-sources">
    Läs om hur tolkad integrationsaktivitet stöder Signaler.
  </Card>
</CardGroup>


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