curl --request POST \
--url https://api.seynlabs.com/v1/ingest \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceId": "b6f1c0de-1f2a-4c3b-9d4e-5a6b7c8d9e0f",
"records": [
{
"recordId": "deal-4471",
"entityType": "deal",
"sourceUpdatedAt": "2026-06-10T14:03:00Z",
"payload": {
"name": "Acme Corp renewal",
"stage": "negotiation",
"amount": 42000,
"owner": "jane.smith@acme.com",
"movedToStageBy": "jane.smith@acme.com"
}
},
{
"recordId": "deal-4472",
"entityType": "deal",
"sourceUpdatedAt": "2026-06-10T15:21:00Z",
"payload": {
"name": "Northwind expansion",
"stage": "closed_won",
"amount": 12500,
"owner": "mark.lee@acme.com"
}
}
]
}
'{
"success": true,
"data": {
"batchId": "9b2e4d1a-7c3f-4e8a-9b1c-2d3e4f5a6b7c",
"sourceId": "b6f1c0de-1f2a-4c3b-9d4e-5a6b7c8d9e0f",
"status": "queued",
"accepted": 2,
"deduplicated": 0,
"rejected": [],
"createdAt": "2026-06-12T16:24:11Z"
},
"meta": {
"requestId": "3d4e5f6a-7b8c-4d9e-8f0a-1b2c3d4e5f6a"
}
}Ingestion
Ingest records
Push a batch of records from any system into Seyn.
POST
/
v1
/
ingest
curl --request POST \
--url https://api.seynlabs.com/v1/ingest \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceId": "b6f1c0de-1f2a-4c3b-9d4e-5a6b7c8d9e0f",
"records": [
{
"recordId": "deal-4471",
"entityType": "deal",
"sourceUpdatedAt": "2026-06-10T14:03:00Z",
"payload": {
"name": "Acme Corp renewal",
"stage": "negotiation",
"amount": 42000,
"owner": "jane.smith@acme.com",
"movedToStageBy": "jane.smith@acme.com"
}
},
{
"recordId": "deal-4472",
"entityType": "deal",
"sourceUpdatedAt": "2026-06-10T15:21:00Z",
"payload": {
"name": "Northwind expansion",
"stage": "closed_won",
"amount": 12500,
"owner": "mark.lee@acme.com"
}
}
]
}
'{
"success": true,
"data": {
"batchId": "9b2e4d1a-7c3f-4e8a-9b1c-2d3e4f5a6b7c",
"sourceId": "b6f1c0de-1f2a-4c3b-9d4e-5a6b7c8d9e0f",
"status": "queued",
"accepted": 2,
"deduplicated": 0,
"rejected": [],
"createdAt": "2026-06-12T16:24:11Z"
},
"meta": {
"requestId": "3d4e5f6a-7b8c-4d9e-8f0a-1b2c3d4e5f6a"
}
}This is the core of bringing your own data. Send records from any system, shaped as
{ recordId, entityType, payload, sourceUpdatedAt }, and Seyn stores each payload verbatim, deduplicates by content hash, and normalizes it into events asynchronously.
A few rules worth knowing:
- Idempotent. Re-sending an unchanged record is a no-op. Reuse a record’s
recordIdwhen it changes and Seyn supersedes the prior version instead of duplicating it. - Batched. Up to 500 records and 10 MB per request. Split larger loads into multiple calls.
- Asynchronous. The call returns
202with abatchIdthe moment your records are accepted. Normalization happens in the background; poll Get ingestion batch status to see what landed. - Scoped. Requires an API key with the
ingestscope. Read-only keys getINSUFFICIENT_SCOPE.
sourceId first with Create a custom source. See Connectors → Build your own for the full model.Authorizations
Bearer token from app.seynlabs.com → Settings → API Keys.
Send as Authorization: Bearer sk_live_....
Headers
Optional. Reuse the same key when retrying a batch after a network error so it's processed only once. (Records are also deduplicated by content hash regardless.)
Body
application/json
⌘I