Sources
Bring your own data into Seqlense: create custom sources, push or upload entries, or let Seqlense pull them from your API.
A source is a stream of records that the rules engine can read. There are two kinds:
source_type | Who manages it | What you can do |
|---|---|---|
OFFICIAL | Seqlense | List it, read its detail and its entries. It is visible to every organization, in both workspaces. |
CUSTOM | Your organization | Create, update, delete, and feed it with data. |
Custom sources and their entries belong to the workspace of your API key: a
dev key works on the development workspace, a prod key on production. See
API keys and workspaces.
Official sources are read-only through the API: creating or editing them is
reserved to Seqlense staff and is not available with an organization API key.
Input modes
Every custom source has an input_mode that decides how data gets in.
input_mode | How data arrives | Endpoint |
|---|---|---|
API_PUSH (default) | You send batches of entries | POST /v1/sources/ingest |
FILE_UPLOAD | You send the rows of a file as a JSON array | POST /v1/sources/upload |
API_PULL | Seqlense calls an HTTPS endpoint you configure, on an interval | none, configured on the source |
Official sources show input_mode: "NONE".
Schema
schema_fields describes the entries a source accepts. It is an array of
fields:
| Key | Description |
|---|---|
name | Key of the field in each entry. |
type | string (default), number, boolean or datetime. |
label | Display label. |
Validation rules for each entry:
- It must be a JSON object, at most 64 KB once serialized.
- Every declared field is required and must be non-null and of the declared
type. There is no coercion:
"12"is not anumber. datetimeaccepts RFC 3339 (2026-09-24T14:00:00Z),2026-09-24 14:00:00,2026-09-24T14:00:00or2026-09-24.- Extra fields are accepted and stored, so producers can add fields without breaking ingestion.
- An empty schema (
[]) accepts any object.
Create a source
POST /v1/sources/ with a name (1 to 100 characters) and a slug. The slug is
lowercased, must be 1 to 50 characters of a-z, 0-9, - or _, is unique in
your workspace, and cannot be changed later.
curl -X POST "https://monitoring.seqlense.com/api/v1/sources/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "CRM customers",
"slug": "crm-customers",
"description": "Customer records pushed from our CRM",
"input_mode": "API_PUSH",
"schema_fields": [
{ "name": "customer_id", "type": "string", "label": "Customer ID" },
{ "name": "balance", "type": "number", "label": "Balance" },
{ "name": "updated_at", "type": "datetime", "label": "Updated at" }
]
}'{ "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7" }A slug that already exists returns 400 with
Source creation failed (slug may already exist).
Push entries (API_PUSH)
POST /v1/sources/ingest with the source_id and an entries array of 1 to
1000 objects. Valid entries are stored, invalid ones are skipped and listed in
errors with their index.
curl -X POST "https://monitoring.seqlense.com/api/v1/sources/ingest" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"entries": [
{ "customer_id": "C-1042", "balance": 1520.5, "updated_at": "2026-09-24T14:00:00Z" },
{ "customer_id": "C-1043", "updated_at": "2026-09-24T14:00:00Z" }
]
}'{ "inserted": 1, "rejected": 1, "errors": ["#1: missing field 'balance'"] }If every entry fails, the call returns 400 with
All N entries failed validation. First error: .... The call also returns 400
when the source is not one of your custom sources
(Source not found or not accessible), is disabled (Source is disabled), or is
not in API_PUSH mode.
The whole request body must stay under 2 MB. A larger body is dropped and
the call returns 404. Split big loads into several batches.
Upload a file (FILE_UPLOAD)
POST /v1/sources/upload works like ingest, for sources in FILE_UPLOAD mode.
The endpoint takes JSON, not a multipart file: parse your CSV or JSON file
client-side and send its rows as data, 1 to 5000 objects per call (same
2 MB body limit).
curl -X POST "https://monitoring.seqlense.com/api/v1/sources/upload" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source_id": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
"data": [
{ "customer_id": "C-2001", "balance": 10, "updated_at": "2026-09-20" },
{ "customer_id": "C-2002", "balance": 250.75, "updated_at": "2026-09-21" }
]
}'{ "inserted": 2, "rejected": 0, "errors": [] }Pull from your API (API_PULL)
With input_mode: "API_PULL", Seqlense calls your endpoint on a schedule. These
fields are only used in this mode (in the other modes they are ignored and
cleared):
| Field | Rules |
|---|---|
pull_url | Required. Max 500 characters, must start with https://. |
pull_method | GET (default) or POST. |
pull_headers | Object of string values, for example an Authorization header. Names 1 to 128 characters, values up to 2048. |
pull_interval_minutes | Minutes between two pulls. Default 60, clamped to 1 to 1440 (one day). |
response_mapping | Optional. items_path is the path to the array of items in the response, fields maps each schema field to its path inside one item. |
pull_url must point to a public host. These are rejected with
pull_url must point to a public host (private/loopback addresses are not allowed):
localhostand loopback addresses (127.0.0.0/8,::1)- private ranges
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - link-local
169.254.0.0/16andfe80::/10, unique-localfc00::/7 0.0.0.0/8, and multicast or reserved addresses (224.0.0.0and above)
curl -X POST "https://monitoring.seqlense.com/api/v1/sources/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Partner risk feed",
"slug": "partner-risk",
"input_mode": "API_PULL",
"pull_url": "https://api.partner.example/v2/risk",
"pull_method": "GET",
"pull_headers": { "Authorization": "Bearer partner-token" },
"pull_interval_minutes": 30,
"response_mapping": {
"items_path": "data.items",
"fields": { "address": "wallet.address", "score": "risk.score" }
},
"schema_fields": [
{ "name": "address", "type": "string", "label": "Address" },
{ "name": "score", "type": "number", "label": "Score" }
]
}'GET /v1/sources/detail returns pull_headers as stored, secrets included.
Give the source a dedicated, read-only token on your side, and treat any API key
that can read your sources as able to read that token.
List and read
GET /v1/sources/ returns all sources visible to your workspace (official and
custom, no pagination). GET /v1/sources/detail?id=... adds the pull settings,
entry_count and updated_at. An unknown id, or a custom source of another
organization, returns 404.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://monitoring.seqlense.com/api/v1/sources/detail?id=7c9e6679-7425-40de-944b-e07fc1f90ae7"Entries
GET /v1/sources/entries?source_id=...&page=1 returns the stored entries, newest
first, 50 per page (fixed). It works for official sources too.
{
"source_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"source_name": "CRM customers",
"entries": [
{
"id": "0b8f3c52-8d7e-4a55-9f0e-5a3c1d2e4f60",
"data": { "customer_id": "C-1042", "balance": 1520.5, "updated_at": "2026-09-24T14:00:00Z" },
"ingested_at": "2026-09-24 14:00:03.512"
}
],
"total": 1,
"page": 1,
"pages": 1
}Update
PUT /v1/sources/ is a full replace: send the id, the name and the
complete configuration. Any field you leave out goes back to its default
(description empty, icon database, input_mode API_PUSH,
schema_fields [], is_active true, pull settings cleared). Set
is_active to false to disable a source: ingest and upload are then refused.
curl -X PUT "https://monitoring.seqlense.com/api/v1/sources/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "CRM customers",
"input_mode": "API_PUSH",
"is_active": false,
"schema_fields": [
{ "name": "customer_id", "type": "string", "label": "Customer ID" }
]
}'{ "ok": true }Delete
DELETE /v1/sources/?id=... deletes a custom source and all of its entries.
This is permanent. Official sources cannot be deleted.
Update and delete answer { "ok": true } even when the id matches none of
your custom sources. Check the result with GET /v1/sources/detail if it
matters.
Next steps
See the API Reference for every
field, limit and error message of the Sources endpoints.