Endpoint
This endpoint requires an API key with the
insights:write scope. See Authentication for details on creating and using API keys.Path parameters
| Parameter | Type | Description |
|---|---|---|
siteId | string | Site slug (e.g., ucl-east-ops) |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
source | string | Yes | System that generated this insight (e.g., altotech, rule_engine, honeywell_bms) |
source_id | string | Yes | Unique identifier for this finding within the source. Used as the deduplication key together with source |
title | string | Yes | Human-readable summary of the finding |
severity | string | Yes | One of: critical, warning, info |
category | string | Yes | One of: fault, comfort, energy, maintenance |
body | string | No | Detailed description of the finding. Supports Markdown with entity links |
equipment_uri | string | No | Equipment ID from the knowledge graph (e.g., PD00-XX-AHU-001). Omit for multi-equipment or building-wide insights |
timeseries_ids | string[] | No | List of timeseries UUIDs that support this finding. Get these from the GraphQL point.timeseriesId field |
analysis | object | No | Arbitrary JSON with source-specific context (thresholds, readings, confidence scores) |
occurred_at | string | No | ISO-8601 timestamp of when the condition started. Defaults to detection time |
Markdown body and entity links
Thebody field supports Markdown. When rendered in the Tacit UI, special link schemes create interactive navigation elements.
Entity links
Link to equipment, zones, or points in the knowledge graph. These render as clickable chips with a popover offering navigation to the Twin View, Asset detail, and historical chart.| Parameter | Required | Description |
|---|---|---|
type | No | Entity type: equipment, point, zone, floor, building, system, location. Defaults to equipment |
class | No | Brick class name (e.g., AHU, FCU, Heat_Exchanger). Shown in the popover header |
ifc | No | IFC GUID for 3D model highlighting |
ts | No | Timeseries UUID for a direct link to the historical chart |
Insight and work order links
Cross-reference other insights or work orders. These render as standard links that navigate to the detail page.Multi-equipment insights
For insights that span multiple pieces of equipment, omitequipment_uri and list affected equipment as entity links in the body:
Response
Both201 and 200 responses return the full insight object:
| Field | Type | Description |
|---|---|---|
id | string | UUID of the insight |
site | string | Site ID |
title | string | Finding title |
body | string | Detailed description (Markdown) |
status | string | active, resolved, or dismissed |
severity | string | critical, warning, or info |
category | string | fault, comfort, energy, or maintenance |
source | string | Originating system |
source_id | string | Source’s reference ID |
equipment_uri | string | Equipment ID |
equipment_name | string | Resolved equipment name from the knowledge graph |
timeseries_ids | string[] | Supporting timeseries UUIDs |
analysis | object | Source-specific context |
detected_at | string | ISO-8601 timestamp of first detection |
last_seen_at | string | ISO-8601 timestamp of most recent detection |
detection_count | integer | Total number of times this condition was detected |
occurred_at | string | null | When the condition started (if provided) |
resolved_at | string | null | When the insight was resolved or dismissed |
Deduplication
Tacit uses the combination of site + source + source_id as a fingerprint. When you submit an insight:- If no active insight matches the fingerprint, a new insight is created (HTTP
201) - If an active insight already matches, it is treated as a re-detection (HTTP
200). The existing insight’slast_seen_attimestamp is updated, itsdetection_countis incremented, and theanalysisfield is replaced with the latest data
Status codes
| Code | Description |
|---|---|
201 | New insight created |
200 | Existing insight updated (re-detection) |
400 | Validation error (missing required fields, invalid severity/category) |
401 | Not authenticated |
403 | No access to this site, or API key missing insights:write scope |
404 | Site not found |
429 | Rate limit exceeded. Check the Retry-After header |
Examples
Single-equipment fault
Response (201)
Re-detection of the same condition
Submitting the samesource + source_id again while the insight is still active:
Request
Response (200)
detection_count incremented to 2, last_seen_at updated, and analysis replaced with the latest readings. The id and detected_at remain unchanged.
Multi-equipment insight with entity links
Request
equipment_uri — the affected equipment is referenced via entity links in the body instead.
Source and source ID conventions
Thesource field identifies the system that generated the finding. Use a consistent, lowercase identifier:
| System type | Example source | Example source_id |
|---|---|---|
| External FDD vendor | altotech | ALT-FAULT-98234 (vendor’s internal reference) |
| Internal rule engine | rule_engine | g36-fc5:ahu-01 (rule ID + equipment) |
| BMS alarm forwarding | honeywell_bms | BMS-ALM-44521 |
| AI analysis | claude-analysis | site-date-equipment-type |
source + source_id must be unique per active insight within a site. Different sources can use the same source_id format independently.