> ## Documentation Index
> Fetch the complete documentation index at: https://kremis.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# POST /signal

> Ingest a new signal into the graph.

<ParamField path="method" type="POST">
  `/signal`
</ParamField>

**Authentication:** Required (if enabled)

Ingest a signal representing a grounded observation: **Entity | Attribute | Value**.

## Request Body

```json theme={null}
{
  "entity_id": 1,
  "attribute": "name",
  "value": "Alice"
}
```

| Field       | Type          | Required | Constraints                                                         | Description        |
| ----------- | ------------- | -------- | ------------------------------------------------------------------- | ------------------ |
| `entity_id` | integer (u64) | Yes      | —                                                                   | Entity identifier. |
| `attribute` | string        | Yes      | Max 256 bytes, non-empty, no control characters                     | Attribute name.    |
| `value`     | string        | Yes      | Max 64 KB, non-empty, no control characters except `\n`, `\r`, `\t` | Attribute value.   |

## Response

<CodeGroup>
  ```json 200 OK — Success theme={null}
  {
    "success": true,
    "node_id": 0,
    "error": null
  }
  ```

  ```json 400 Bad Request — Validation Error theme={null}
  {
    "success": false,
    "node_id": null,
    "error": "Attribute length 300 exceeds maximum 256 bytes"
  }
  ```
</CodeGroup>

| Field     | Type            | Description                               |
| --------- | --------------- | ----------------------------------------- |
| `success` | boolean         | Whether ingestion succeeded.              |
| `node_id` | integer or null | Created/existing node ID (if successful). |
| `error`   | string or null  | Error message (if failed).                |

<Warning>
  Each node accepts at most 4,096 distinct `(attribute, value)` properties
  (`MAX_PROPERTIES_PER_NODE`). Storing a new property beyond this cap returns
  `400`. Re-sending an already-stored pair is idempotent and never counts
  against the cap.
</Warning>

## Example

```bash theme={null}
curl -X POST http://localhost:8080/signal \
     -H "Authorization: Bearer your-api-key" \
     -H "Content-Type: application/json" \
     -d '{"entity_id": 1, "attribute": "name", "value": "Alice"}'
```
