Before you begin
You need:- permission to manage integrations and access keys in Living Security
- a server-side sender that can make HTTPS
POSTrequests - the Living Security region for your organization
- a stable source name and at least one stream name
1. Register the source and streams
1
Open Custom Push Source
Go to Settings → Integrations → Catalog, find Custom Push Source, and select Add.
2
Name the source
Enter the source routing key and an optional description. For example, use
custom-phishing-sim rather than a display name with spaces.3
Add streams
Add each stream the sender will use. The source and stream pair must exist before the first push; an unknown pair returns
404 Not Found.4
Save the source
After creation, open the source under Settings → Integrations → Connected. Its Push via API view shows the endpoint pattern and recent runs.
2. Create a push-ingest key
Go to Settings → Access Keys, select Create Access Key, and choose the Push Ingest scope. Copy the generated value immediately; it is shown only once. The key is bound to one Living Security organization. The push request does not need an organization header. See API Access Keys for rotation and revocation.3. Choose the regional endpoint
Use the hostname for the Living Security organization:
Append
/push-ingest/{integrationKey}/{streamName}. The path is case-sensitive and must exactly match the registered source and stream.
string
required
The registered source name. Use 1–64 lowercase letters, digits, or hyphens, starting with a letter or digit.
string
required
The registered stream name. The same rules apply, and underscores are also allowed.
string
required
Send the push-ingest access key as
Bearer <access-key>.string
Use
application/json for JSON or text/csv for CSV. The server can also detect a JSON array when this header is omitted.string
Optional organization UUID. The access key already determines the organization. If you send this header, it must match the key’s organization; it cannot select another organization.
Request body
Send a top-level, non-empty JSON array of objects or CSV file bytes with a header row. There is no named JSON wrapper field. Each batch can contain up to 10,000 records and 10 MB.4. Send a JSON batch
Send a non-empty JSON array whose elements are objects.Content-Type: application/json is recommended and is required by many sending products even though Living Security can detect an array body without it.
202 Accepted. The error tab shows a 400 Bad Request when the JSON body is malformed:
400 example, correct the JSON or send CSV with Content-Type: text/csv, then retry.
string
required
The run ID for this accepted batch. Keep it to check processing status.
number
required
The number of records accepted and stored.
string
required
The source name used for this push.
string
required
The stream name used for this push.
Send CSV instead
SetContent-Type: text/csv and send the file bytes, as shown in the CSV file request example above. The first row supplies field names.
Boolean text becomes a boolean and ordinary numeric text becomes a number. Leading-zero values, unsafe large integers, dates, and other text remain strings. Empty cells omit that field. Malformed rows, unbalanced quotes, and UTF-16 files are rejected.
Request limits and retries
Split larger exports into batches that satisfy both limits. Wait for each response and retain the returned
runId in sender logs.
The normal authenticated organization limit returns
503, not 429, so webhook senders treat it as retriable. A 503 is returned before the batch is stored; resending that same batch after the stated interval does not duplicate an accepted run.
Verify the data flow
Open the Custom Push Source and review Push History. Confirm the stream, record count, key attribution, and processing status. Data with a maintained interpreter can then become people and normalized activity. Data without an interpreter remains stored but does not produce activity.Use exact field names and payload shape from the provider-specific guide when
one exists. A successful
202 proves delivery, not that an arbitrary schema
maps to Living Security activity.Troubleshooting checklist
- Copy the endpoint from the correct source and replace the stream placeholder.
- Send the access key as
Authorization: Bearer …;x-api-keyis not accepted. - Confirm the body is a top-level JSON array, not a single object or an envelope around the records.
- Confirm the source and stream spelling, including hyphens, underscores, and case.
- Review Push History before resending a batch whose response was lost.
- When contacting Living Security Support, include the organization, source, stream, request time,
runIdwhen available, and response status. Do not include the access key or event payload.
Related
Zscaler ZIA Cloud NSS
Configure a supported Zscaler web-log feed with the exact source, stream, headers, and JSON shape.
API Access Keys
Create, rotate, and revoke scoped credentials.
Signal Data Sources
Learn how interpreted integration activity supports signals.

