Skip to main content
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 recordId when 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 202 with a batchId the 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 ingest scope. Read-only keys get INSUFFICIENT_SCOPE.
Create the sourceId first with Create a custom source. See Connectors → Build your own for the full model.

Authorizations

Authorization
string
header
required

Bearer token from app.seynlabs.com → Settings → API Keys. Send as Authorization: Bearer sk_live_....

Headers

Idempotency-Key
string<uuid>

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
sourceId
string<uuid>
required

The source to ingest into. Create a custom one with POST /v1/sources.

records
object[]
required

Up to 500 records per request.

Required array length: 1 - 500 elements

Response

Batch accepted for processing.

success
enum<boolean>
required
Available options:
true
data
object
required
meta
object
required