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

> Registrer en kilde og send JSON- eller CSV-hendelsesbatcher til Living Security med en API-tilgangsnøkkel med begrenset omfang.

Bruk en Custom Push Source når et system sender poster til Living Security i stedet for å bli pollet av en Catalog-kobling. Avsenderen kan sende JSON-arrayer eller CSV-filer til et regionalt HTTPS-endepunkt.

## Før du begynner

Du trenger:

* tillatelse til å administrere integrasjoner og tilgangsnøkler i Living Security
* en avsender på serversiden som kan sende HTTPS `POST`-forespørsler
* Living Security-regionen for organisasjonen din
* et stabilt kildenavn og minst ett strømnavn

Kildenavn og strømnavn er permanente rutingnøkler. Kildenavn må bestå av 1–64 små bokstaver, sifre eller bindestreker. Strømnavn tillater i tillegg understreker. Begge må begynne med en bokstav eller et siffer.

<Warning>
  Behandle API-tilgangsnøkkelen som en hemmelighet. Ikke plasser den i nettleserkode, ikke sjekk den inn
  i kildekontroll, og ikke send den i en supporthenvendelse.
</Warning>

## 1. Registrer kilden og strømmene

<Steps>
  <Step title="Åpne Custom Push Source">
    Gå til **Innstillinger → Integrasjoner → Catalog**, finn **Custom Push Source**, og velg **Legg til**.
  </Step>

  <Step title="Gi kilden et navn">
    Angi rutingnøkkelen for kilden og en valgfri beskrivelse. Bruk for eksempel `custom-phishing-sim` i stedet for et visningsnavn med mellomrom.
  </Step>

  <Step title="Legg til strømmer">
    Legg til hver strøm som avsenderen skal bruke. Paret av kilde og strøm må finnes før den første pushen; et ukjent par returnerer `404 Not Found`.
  </Step>

  <Step title="Lagre kilden">
    Etter opprettelsen åpner du kilden under **Innstillinger → Integrasjoner → tilkoblet**. Visningen **Push via API** viser endepunktmønsteret og nylige kjøringer.
  </Step>
</Steps>

## 2. Opprett en push-ingest-nøkkel

Gå til **Innstillinger → Access Keys**, velg **Create Access Key**, og velg omfanget **Push Ingest**. Kopier den genererte verdien umiddelbart; den vises bare én gang.

Nøkkelen er knyttet til én Living Security-organisasjon. Push-forespørselen trenger ingen organisasjonsheader. Se [API Access Keys](/no/features/settings/api-keys) for rotasjon og tilbakekalling.

## 3. Velg det regionale endepunktet

Bruk vertsnavnet for Living Security-organisasjonen:

| Region | Base-URL |
| - | - |
| USA | `https://api.us-east-1.livingsecurity.ai/api/v1` |
| Den europeiske union | `https://api.eu-west-1.livingsecurity.ai/api/v1` |

Legg til `/push-ingest/{integrationKey}/{streamName}`. Stien skiller mellom store og små bokstaver og må samsvare nøyaktig med den registrerte kilden og strømmen.

<ParamField path="integrationKey" type="string" required>
  Det registrerte kildenavnet. Bruk 1–64 små bokstaver, sifre eller bindestreker, og begynn med en bokstav eller et siffer.
</ParamField>

<ParamField path="streamName" type="string" required>
  Det registrerte strømnavnet. De samme reglene gjelder, og understreker er også tillatt.
</ParamField>

<ParamField header="Authorization" type="string" required>
  Send push-ingest-tilgangsnøkkelen som `Bearer <access-key>`.
</ParamField>

<ParamField header="Content-Type" type="string">
  Bruk `application/json` for JSON eller `text/csv` for CSV. Serveren kan også gjenkjenne et JSON-array når denne headeren utelates.
</ParamField>

<ParamField header="x-organization-id" type="string">
  Valgfri organisasjons-UUID. Tilgangsnøkkelen bestemmer allerede organisasjonen. Hvis du sender denne headeren, må den samsvare med nøkkelens organisasjon; den kan ikke brukes til å velge en annen organisasjon.
</ParamField>

### Forespørselsinnhold

Send et ikke-tomt JSON-array av objekter på øverste nivå, eller CSV-filbyte med en overskriftsrad. Det finnes ikke noe navngitt JSON-omslagsfelt. Hver batch kan inneholde opptil 10 000 poster og 10 MB.

## 4. Send en JSON-batch

Send et ikke-tomt JSON-array der elementene er objekter. `Content-Type: application/json` anbefales og kreves av mange avsenderprodukter, selv om Living Security kan gjenkjenne et array-innhold uten 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 vellykket forespørsel returnerer `202 Accepted`. Feilfanen viser en `400 Bad Request` når JSON-innholdet er ugyldig utformet:

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

Aksept betyr at batchen er lagret for asynkron behandling. Det betyr ikke at alle poster allerede er tolket til aktivitet.
For eksempelet `400` må du rette JSON-en eller sende CSV med `Content-Type: text/csv`, og deretter prøve på nytt.

<ResponseField name="runId" type="string" required>
  Kjøre-ID-en for denne aksepterte batchen. Ta vare på den for å kunne sjekke behandlingsstatus.
</ResponseField>

<ResponseField name="recordsAccepted" type="number" required>
  Antall poster som er akseptert og lagret.
</ResponseField>

<ResponseField name="integrationKey" type="string" required>
  Kildenavnet som ble brukt for denne pushen.
</ResponseField>

<ResponseField name="streamName" type="string" required>
  Strømnavnet som ble brukt for denne pushen.
</ResponseField>

## Send CSV i stedet

Angi `Content-Type: text/csv` og send filbyte, slik det vises i forespørselseksempelet **CSV file** ovenfor. Den første raden angir feltnavnene.

Boolsk tekst blir til en boolsk verdi, og vanlig numerisk tekst blir til et tall. Verdier med innledende null, usikre store heltall, datoer og annen tekst forblir strenger. Tomme celler utelater feltet. Feilformede rader, ubalanserte anførselstegn og UTF-16-filer avvises.

## Forespørselsgrenser og nye forsøk

| Kontrakt | Gjeldende verdi |
| - | - |
| Maksimalt antall poster | 10 000 per forespørsel |
| Maksimal forespørselsstørrelse | 10 MB |
| Forespørselsrate per organisasjon | 600 forespørsler per 60 sekunder |

Del opp større eksporter i batcher som oppfyller begge grensene. Vent på hvert svar, og ta vare på den returnerte `runId` i avsenderens logger.

| Respons | Betydning | Handling for avsenderen |
| - | - | - |
| `202` | Batch akseptert | Registrer `runId`; ikke send på nytt umiddelbart |
| `400` | Ugyldig navn, JSON, CSV, antall poster eller innhold | Rett forespørselen; ikke prøv på nytt uendret |
| `401` | Nøkkel mangler, er utløpt, tilbakekalt eller ugyldig | Bytt ut nøkkelen og bruk Bearer-headeren |
| `403` | Nøkkelen mangler nødvendig omfang | Opprett en nøkkel med omfanget **Push Ingest** |
| `404` | Kilden eller strømmen er ikke registrert | Registrer det nøyaktige paret eller rett URL-en |
| `413` | Forespørselsinnholdet overstiger 10 MB | Del batchen opp i mindre forespørsler |
| `429` | Midlertidig struping på IP-nivå | Respekter `Retry-After` når den finnes, og vent litt |
| `503` | Organisasjonens ratebøtte eller begrenser er utilgjengelig | Vent på `Retry-After`, og send deretter den samme batchen på nytt |

Den normale grensen for autentisert organisasjon returnerer `503`, ikke `429`, slik at webhook-avsendere behandler den som noe som kan prøves på nytt. En `503` returneres før batchen lagres; å sende den samme batchen på nytt etter det oppgitte intervallet gir ikke en duplisert akseptert kjøring.

## Verifiser datastrømmen

Åpne Custom Push Source og se gjennom **Push History**. Bekreft strøm, antall poster, nøkkelattribusjon og behandlingsstatus. Data med en vedlikeholdt tolker kan deretter bli til personer og normalisert aktivitet. Data uten tolker forblir lagret, men gir ikke aktivitet.

<Info>
  Bruk de nøyaktige feltnavnene og nyttelaststrukturen fra den leverandørspesifikke veiledningen
  når det finnes en. Et vellykket `202` beviser levering, ikke at et vilkårlig skjema
  tilordnes Living Security-aktivitet.
</Info>

## Sjekkliste for feilsøking

* Kopier endepunktet fra riktig kilde og erstatt plassholderen for strømmen.
* Send tilgangsnøkkelen som `Authorization: Bearer …`; `x-api-key` godtas ikke.
* Bekreft at innholdet er et JSON-array på øverste nivå, ikke et enkeltobjekt eller en omslagsstruktur rundt postene.
* Bekreft stavemåten for kilde og strøm, inkludert bindestreker, understreker og store/små bokstaver.
* Se gjennom **Push History** før du sender på nytt en batch der svaret gikk tapt.
* Når du kontakter [Living Security Support](mailto:support@livingsecurity.com), oppgi organisasjon, kilde, strøm, tidspunkt for forespørselen, `runId` når den er tilgjengelig, og responsstatus. Ikke ta med tilgangsnøkkelen eller hendelsesnyttelasten.

## Relatert

<CardGroup cols={2}>
  <Card title="Zscaler ZIA Cloud NSS" icon="shield" href="/no/integrations/zscaler-zia-cloud-nss">
    Konfigurer en støttet Zscaler-nettlogg-feed med nøyaktig kilde, strøm, headere og JSON-struktur.
  </Card>

  <Card title="API Access Keys" icon="key" href="/no/features/settings/api-keys">
    Opprett, roter og tilbakekall legitimasjon med begrenset omfang.
  </Card>

  <Card title="Signal Data Sources" icon="wave-pulse" href="/no/signals/data-sources">
    Lær hvordan tolket integrasjonsaktivitet understøtter Signaler.
  </Card>
</CardGroup>


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