Skip to main content
POST
/signals
Authentication: Required (if enabled) Ingests an ordered sequence of entity–attribute–value triples. Unlike POST /signal, this endpoint calls ingest_sequence() internally, which analyses co-occurrence across adjacent signals: two entities that share the same attribute value in consecutive signals get an edge created (or incremented) between them.
Use this endpoint when you need a connected graph via HTTP. POST /signal inserts isolated nodes — it never creates edges.

Why this endpoint exists

POST /signal calls ingest() — a single-signal path that stores nodes but never creates edges. Edges are the backbone of queries like strongest_path, intersect, and retract. If you ingest signals one-by-one via HTTP, these queries always return found: false. POST /signals fixes this by accepting a batch and delegating to ingest_sequence(), the same function used by the CLI kremis ingest command.

Request Body

An empty array {"signals": []} is a valid no-op.

Response

If any signal in the batch is invalid (empty attribute, oversized value), the entire request is rejected with 400. No signals are ingested.
Each node accepts at most 4,096 distinct (attribute, value) properties (MAX_PROPERTIES_PER_NODE). A batch that would push any node past this cap is rejected atomically with 400 and error: "Ingest failed: Property limit exceeded ..." — no signals are ingested. Re-sending an already-stored pair is idempotent and never counts against the cap.

Example

Expected response:
After this call, GET /status shows edge_count >= 1, and POST /query with strongest_path from Alice’s node to Bob’s node returns found: true.

Limits

Last modified on June 14, 2026