Create a custom source
curl --request POST \
--url https://api.seynlabs.com/v1/sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Internal CRM",
"entityTypes": [
"deal",
"account",
"activity"
],
"description": "Deals and activity from our in-house CRM"
}
'{
"success": true,
"data": {
"id": "b6f1c0de-1f2a-4c3b-9d4e-5a6b7c8d9e0f",
"type": "custom_api",
"name": "Internal CRM",
"status": "active",
"createdAt": "2026-06-12T16:20:00Z"
},
"meta": {
"requestId": "f0e1d2c3-b4a5-4968-8778-695a4b3c2d1e"
}
}Ingestion
Create a custom source
Register a source for any system Seyn has no prebuilt connector for.
POST
/
v1
/
sources
Create a custom source
curl --request POST \
--url https://api.seynlabs.com/v1/sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Internal CRM",
"entityTypes": [
"deal",
"account",
"activity"
],
"description": "Deals and activity from our in-house CRM"
}
'{
"success": true,
"data": {
"id": "b6f1c0de-1f2a-4c3b-9d4e-5a6b7c8d9e0f",
"type": "custom_api",
"name": "Internal CRM",
"status": "active",
"createdAt": "2026-06-12T16:20:00Z"
},
"meta": {
"requestId": "f0e1d2c3-b4a5-4968-8778-695a4b3c2d1e"
}
}Step one of bringing your own data. Register a custom source and you get back a
sourceId to push records to via Ingest records.
The optional entityTypes hint lists the kinds of records you’ll send (deal, ticket, task). It improves how Seyn routes normalization, but you can ingest entity types you didn’t declare.
Requires an API key with the ingest scope.Authorizations
Bearer token from app.seynlabs.com → Settings → API Keys.
Send as Authorization: Bearer sk_live_....
Headers
Optional. Reuse the same key when retrying so a source is created only once.
Body
application/json
⌘I