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

# API til brugerdefineret Push-kilde

> Registrer en kilde, og send JSON- eller CSV-hændelsesbatches til Living Security med en API-adgangsnøgle med begrænset omfang.

Brug en brugerdefineret Push-kilde (Custom Push Source), når et system sender poster til Living Security i stedet for at blive forespurgt af en katalogconnector. Afsenderen kan indsende JSON-arrays eller CSV-filer til et regionalt HTTPS-endpoint.

## Før du begynder

Du skal bruge:

* tilladelse til at administrere integrationer og adgangsnøgler i Living Security
* en afsender på serversiden, der kan foretage HTTPS-`POST`-anmodninger
* Living Security-regionen for din organisation
* et stabilt kildenavn og mindst ét streamnavn

Kildenavne og streamnavne er permanente routingnøgler. Kildenavne skal bestå af 1–64 små bogstaver, cifre eller bindestreger. Streamnavne må desuden indeholde understregninger. Begge skal begynde med et bogstav eller et ciffer.

<Warning>
  Behandl API-adgangsnøglen som en hemmelighed. Placér den ikke i browserkode, læg den ikke i
  versionsstyring, og send den ikke i en supportsag.
</Warning>

## 1. Registrer kilden og streams

<Steps>
  <Step title="Åbn Custom Push Source">
    Gå til **Indstillinger → Integrationer → Katalog**, find **Custom Push Source**, og vælg **Tilføj**.
  </Step>

  <Step title="Navngiv kilden">
    Angiv kildens routingnøgle og en valgfri beskrivelse. Brug for eksempel `custom-phishing-sim` frem for et visningsnavn med mellemrum.
  </Step>

  <Step title="Tilføj streams">
    Tilføj hver stream, som afsenderen skal bruge. Kilde- og streamparret skal findes, før den første push sendes; et ukendt par returnerer `404 Not Found`.
  </Step>

  <Step title="Gem kilden">
    Åbn kilden efter oprettelsen under **Indstillinger → Integrationer → Tilsluttet**. Visningen **Push via API** viser endpointmønsteret og de seneste kørsler.
  </Step>
</Steps>

## 2. Opret en push-ingest-nøgle

Gå til **Indstillinger → Access Keys**, vælg **Create Access Key**, og vælg omfanget **Push Ingest**. Kopiér den genererede værdi med det samme; den vises kun én gang.

Nøglen er knyttet til én Living Security-organisation. Push-anmodningen behøver ingen organisationsheader. Se [API-adgangsnøgler](/da/features/settings/api-keys) om rotation og tilbagekaldelse.

## 3. Vælg det regionale endpoint

Brug værtsnavnet for Living Security-organisationen:

| Region | Basis-URL |
| - | - |
| USA | `https://api.us-east-1.livingsecurity.ai/api/v1` |
| Den Europæiske Union | `https://api.eu-west-1.livingsecurity.ai/api/v1` |

Tilføj `/push-ingest/{integrationKey}/{streamName}` til sidst. Stien skelner mellem store og små bogstaver og skal matche den registrerede kilde og stream nøjagtigt.

<ParamField path="integrationKey" type="string" required>
  Det registrerede kildenavn. Brug 1–64 små bogstaver, cifre eller bindestreger, og begynd med et bogstav eller et ciffer.
</ParamField>

<ParamField path="streamName" type="string" required>
  Det registrerede streamnavn. De samme regler gælder, og understregninger er også tilladt.
</ParamField>

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

<ParamField header="Content-Type" type="string">
  Brug `application/json` til JSON eller `text/csv` til CSV. Serveren kan også genkende et JSON-array, når denne header udelades.
</ParamField>

<ParamField header="x-organization-id" type="string">
  Valgfri UUID for organisationen. Adgangsnøglen bestemmer allerede organisationen. Hvis du sender denne header, skal den stemme overens med nøglens organisation; den kan ikke bruges til at vælge en anden organisation.
</ParamField>

### Anmodningens brødtekst

Send et ikke-tomt JSON-array af objekter på øverste niveau eller bytes fra en CSV-fil med en overskriftsrække. Der er intet navngivet JSON-indpakningsfelt. Hver batch kan indeholde op til 10.000 poster og 10 MB.

## 4. Send en JSON-batch

Send et ikke-tomt JSON-array, hvis elementer er objekter. `Content-Type: application/json` anbefales og kræves af mange afsenderprodukter, selvom Living Security kan genkende en array-brødtekst uden 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 anmodning returnerer `202 Accepted`. Fanen med fejl viser en `400 Bad Request`, når JSON-brødteksten er ugyldig:

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

Accept betyder, at batchen er gemt til asynkron behandling. Det betyder ikke, at alle poster allerede er fortolket til aktivitet.
For eksemplet `400` skal du rette JSON eller sende CSV med `Content-Type: text/csv` og derefter prøve igen.

<ResponseField name="runId" type="string" required>
  Kørsels-ID'et for denne accepterede batch. Gem det, så du kan kontrollere behandlingsstatus.
</ResponseField>

<ResponseField name="recordsAccepted" type="number" required>
  Antallet af poster, der er accepteret og gemt.
</ResponseField>

<ResponseField name="integrationKey" type="string" required>
  Det kildenavn, der blev brugt til denne push.
</ResponseField>

<ResponseField name="streamName" type="string" required>
  Det streamnavn, der blev brugt til denne push.
</ResponseField>

## Send CSV i stedet

Angiv `Content-Type: text/csv`, og send filens bytes, som vist i anmodningseksemplet **CSV file** ovenfor. Den første række angiver feltnavnene.

Boolesk tekst bliver til en boolesk værdi, og almindelig numerisk tekst bliver til et tal. Værdier med foranstillede nuller, usikre store heltal, datoer og anden tekst forbliver strenge. Tomme celler udelader det pågældende felt. Ugyldige rækker, ubalancerede anførselstegn og UTF-16-filer afvises.

## Anmodningsgrænser og genforsøg

| Kontrakt | Aktuel værdi |
| - | - |
| Maksimalt antal poster | 10.000 pr. anmodning |
| Maksimal brødtekst i anmodning | 10 MB |
| Anmodningshastighed pr. organisation | 600 anmodninger pr. 60 sekunder |

Opdel større eksporter i batches, der overholder begge grænser. Afvent hvert svar, og gem den returnerede `runId` i afsenderens logs.

| Svar | Betydning | Afsenderens handling |
| - | - | - |
| `202` | Batch accepteret | Registrer `runId`; send ikke straks igen |
| `400` | Ugyldigt navn, JSON, CSV, antal poster eller brødtekst | Ret anmodningen; prøv ikke igen uændret |
| `401` | Manglende, udløbet, tilbagekaldt eller ugyldig nøgle | Udskift nøglen, og brug Bearer-headeren |
| `403` | Nøglen mangler det påkrævede omfang | Opret en nøgle med omfanget **Push Ingest** |
| `404` | Kilden eller streamen er ikke registreret | Registrer det nøjagtige par, eller ret URL'en |
| `413` | Anmodningens brødtekst overstiger 10 MB | Opdel batchen i mindre anmodninger |
| `429` | Midlertidig begrænsning på IP-niveau | Respektér `Retry-After`, når den er til stede, og vent længere mellem forsøg |
| `503` | Organisationens hastighedsbøtte eller begrænser er utilgængelig | Vent på `Retry-After`, og send derefter den samme batch igen |

Den normale grænse for godkendte organisationer returnerer `503`, ikke `429`, så webhook-afsendere behandler den som en fejl, der kan forsøges igen. En `503` returneres, før batchen gemmes; når den samme batch sendes igen efter det angivne interval, dubleres en accepteret kørsel ikke.

## Kontrollér dataflowet

Åbn Custom Push Source, og gennemgå **Push History**. Bekræft streamen, antallet af poster, nøgleattribueringen og behandlingsstatus. Data med en vedligeholdt fortolker kan derefter blive til personer og normaliseret aktivitet. Data uden en fortolker forbliver gemt, men producerer ikke aktivitet.

<Info>
  Brug de nøjagtige feltnavne og den nøjagtige payload-struktur fra den udbyderspecifikke vejledning,
  hvis der findes en. En vellykket `202` beviser levering, ikke at et vilkårligt skema
  kan knyttes til Living Security-aktivitet.
</Info>

## Fejlfindingstjekliste

* Kopiér endpointet fra den rette kilde, og erstat pladsholderen for streamen.
* Send adgangsnøglen som `Authorization: Bearer …`; `x-api-key` accepteres ikke.
* Bekræft, at brødteksten er et JSON-array på øverste niveau, ikke et enkelt objekt eller en indpakning omkring posterne.
* Kontrollér stavningen af kilde og stream, herunder bindestreger, understregninger og store/små bogstaver.
* Gennemgå **Push History**, før du sender en batch igen, hvis svaret gik tabt.
* Når du kontakter [Living Security Support](mailto:support@livingsecurity.com), skal du angive organisation, kilde, stream, tidspunkt for anmodningen, `runId` hvis tilgængelig, og svarstatus. Medtag ikke adgangsnøglen eller hændelsernes payload.

## Relateret

<CardGroup cols={2}>
  <Card title="Zscaler ZIA Cloud NSS" icon="shield" href="/da/integrations/zscaler-zia-cloud-nss">
    Konfigurer et understøttet Zscaler-weblogfeed med den nøjagtige kilde, stream, headers og JSON-struktur.
  </Card>

  <Card title="API-adgangsnøgler" icon="key" href="/da/features/settings/api-keys">
    Opret, roter og tilbagekald legitimationsoplysninger med begrænset omfang.
  </Card>

  <Card title="Datakilder til Signaler" icon="wave-pulse" href="/da/signals/data-sources">
    Læs, hvordan fortolket integrationsaktivitet understøtter signaler.
  </Card>
</CardGroup>


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