Conventions
- Requests and responses are JSON over HTTPS. Send
Content-Type: application/jsonwith a body. - Authenticate every request with
Authorization: Bearer $INDUQT_API_KEY. Each endpoint names the scope it needs. - Ids are UUIDs. Times are ISO 8601 in UTC (
2026-10-27T03:12:09Z). - Resources belong to one account; ids from another account answer
404. - Errors return
{ "error": "…", "code": "…" }with an HTTP status. See Errors and limits. - Ellipses (
…) in examples stand for values left out for brevity.
Sites
GET/v1/sites
List the account’s sites with machine and connector counts.
Example request
curl "https://api.induqt.ai/v1/sites" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"sites": [
{
"id": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Pleasanton plant",
"location": "Pleasanton, CA",
"timezone": "America/Los_Angeles",
"machines": 4,
"connectors": 2,
"lastDataAt": "2026-10-27T03:12:09Z",
"createdAt": "2026-10-27T02:58:41Z"
}
]
}POST/v1/sites
Create a site (a plant or building).
Body fields
| Name | Type | Description |
|---|---|---|
namerequired | string | 1–80 characters, unique in the account. |
location | string | Free text, e.g. city and state. |
timezone | string | IANA zone used to read local-time files. Default UTC. |
industry | manufacturing | food_beverage | chemicals | pharma | power_utilities | buildings | Selects the decision engine’s industry thresholds. |
policy | object | Site overrides for the decision engine: aiEnabled, minConfidence, normalNeedsConfidence, notifyFrom. |
Example request
curl -X POST "https://api.induqt.ai/v1/sites" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Pleasanton plant",
"location": "Pleasanton, CA",
"timezone": "America/Los_Angeles"
}'{
"name": "Pleasanton plant",
"location": "Pleasanton, CA",
"timezone": "America/Los_Angeles"
}Example response
{
"id": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Pleasanton plant",
"location": "Pleasanton, CA",
"timezone": "America/Los_Angeles",
"machines": 4,
"connectors": 2,
"lastDataAt": "2026-10-27T03:12:09Z",
"createdAt": "2026-10-27T02:58:41Z"
}GET/v1/sites/{siteId}
A site with its machines and connectors.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
siteIdrequired | path | string | Site id. |
Example request
curl "https://api.induqt.ai/v1/sites/6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"id": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Pleasanton plant",
"location": "Pleasanton, CA",
"timezone": "America/Los_Angeles",
"machines": 4,
"connectors": 2,
"lastDataAt": "2026-10-27T03:12:09Z",
"createdAt": "2026-10-27T02:58:41Z",
"machineList": [
{
"id": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Boiler B-101",
"externalId": "B-101",
"family": "boilers",
"make": "Cleaver-Brooks",
"model": "CBEX Elite",
"signals": 12,
"lastDataAt": "2026-10-27T03:12:09Z"
}
],
"connectorList": [
{
"id": "44c0aa11-2b3c-4d5e-8f60-718293a4b5c6",
"type": "mqtt",
"name": "Boiler house broker",
"status": "connected"
}
]
}PATCH/v1/sites/{siteId}
Rename a site or change its location or time zone.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
siteIdrequired | path | string | Site id. |
Body fields
| Name | Type | Description |
|---|---|---|
name | string | New name. |
location | string | New location. |
timezone | string | IANA zone. |
Example request
curl -X PATCH "https://api.induqt.ai/v1/sites/6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"timezone": "America/Chicago"
}'{
"timezone": "America/Chicago"
}Example response
{
"id": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Pleasanton plant",
"location": "Pleasanton, CA",
"timezone": "America/Los_Angeles",
"machines": 4,
"connectors": 2,
"lastDataAt": "2026-10-27T03:12:09Z",
"createdAt": "2026-10-27T02:58:41Z"
}DELETE/v1/sites/{siteId}
Delete an empty site. Move or delete its machines and connectors first.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
siteIdrequired | path | string | Site id. |
Example request
curl -X DELETE "https://api.induqt.ai/v1/sites/6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"ok": true
}Machines
GET/v1/machines
List machines, optionally for one site.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
siteId | query | string | Only machines at this site. |
Example request
curl "https://api.induqt.ai/v1/machines" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"machines": [
{
"id": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Boiler B-101",
"externalId": "B-101",
"family": "boilers",
"make": "Cleaver-Brooks",
"model": "CBEX Elite",
"signals": 12,
"lastDataAt": "2026-10-27T03:12:09Z"
}
]
}POST/v1/machines
Add a machine to a site. Counts towards the plan’s machine allowance.
Body fields
| Name | Type | Description |
|---|---|---|
siteIdrequired | string | The site it belongs to. |
namerequired | string | Display name, e.g. Boiler B-101. |
familyrequired | boilers | vfd | compressors | cnc | servo | chillers | pumps | conveyors | other | Equipment family; selects the knowledge base for AI insights. |
externalId | string | Your id for the machine (tag prefix, asset number, MQTT device id). Ingest can address the machine by it. Unique per site. |
make | string | Manufacturer. |
model | string | Model. |
Example request
curl -X POST "https://api.induqt.ai/v1/machines" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Boiler B-101",
"family": "boilers",
"externalId": "B-101",
"make": "Cleaver-Brooks",
"model": "CBEX Elite"
}'{
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Boiler B-101",
"family": "boilers",
"externalId": "B-101",
"make": "Cleaver-Brooks",
"model": "CBEX Elite"
}Example response
{
"id": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Boiler B-101",
"externalId": "B-101",
"family": "boilers",
"make": "Cleaver-Brooks",
"model": "CBEX Elite",
"signals": 12,
"lastDataAt": "2026-10-27T03:12:09Z"
}GET/v1/machines/{machineId}
A machine with its signals and latest values.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
Example request
curl "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"id": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Boiler B-101",
"externalId": "B-101",
"family": "boilers",
"make": "Cleaver-Brooks",
"model": "CBEX Elite",
"signals": 12,
"lastDataAt": "2026-10-27T03:12:09Z",
"signalList": [
{
"key": "steam_pressure",
"name": "Steam pressure",
"units": "psig",
"normalLow": 90,
"normalHigh": 125,
"lastValue": 112.4,
"lastAt": "2026-10-27T03:12:09Z",
"outOfRange": false
}
]
}PATCH/v1/machines/{machineId}
Update a machine’s details or move it to another site.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
Body fields
| Name | Type | Description |
|---|---|---|
name | string | Name. |
siteId | string | Move to this site. |
externalId | string | Your id. |
make | string | Manufacturer. |
model | string | Model. |
Example request
curl -X PATCH "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "CBEX Elite 800"
}'{
"model": "CBEX Elite 800"
}Example response
{
"id": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"name": "Boiler B-101",
"externalId": "B-101",
"family": "boilers",
"make": "Cleaver-Brooks",
"model": "CBEX Elite",
"signals": 12,
"lastDataAt": "2026-10-27T03:12:09Z"
}DELETE/v1/machines/{machineId}
Delete a machine. Its stored readings stop being queryable.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
Example request
curl -X DELETE "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"ok": true
}PATCH/v1/machines/{machineId}/signals/{key}
Name a signal, set its units and normal operating band.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
keyrequired | path | string | Signal key as ingested. |
Body fields
| Name | Type | Description |
|---|---|---|
name | string | Display name. |
units | string | Units. |
normalLow | number | null | Lower edge of the normal band. |
normalHigh | number | null | Upper edge of the normal band. |
Example request
curl -X PATCH "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/signals/steam_pressure" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Steam pressure",
"units": "psig",
"normalLow": 90,
"normalHigh": 125
}'{
"name": "Steam pressure",
"units": "psig",
"normalLow": 90,
"normalHigh": 125
}Example response
{
"key": "steam_pressure",
"name": "Steam pressure",
"units": "psig",
"normalLow": 90,
"normalHigh": 125,
"lastValue": 112.4,
"lastAt": "2026-10-27T03:12:09Z",
"outOfRange": false
}DELETE/v1/machines/{machineId}/signals/{key}
Remove a signal from a machine, e.g. a tag that is no longer sent.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
keyrequired | path | string | Signal key. |
Example request
curl -X DELETE "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/signals/steam_pressure" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"ok": true
}Data
POST/v1/ingest
Send readings: one machine at a time or a batch of up to 5,000 readings (1 MB).
Body fields
| Name | Type | Description |
|---|---|---|
machine | string | Machine id or its externalId. Required unless each reading names its machine. |
siteId | string | Needed to resolve an externalId when the key is not tied to one site. |
ts | ISO 8601 string | epoch milliseconds | Reading time. Default: time received. |
values | object of number | boolean | Signal key → value. Keys: letters, digits, _ . - (max 64). Booleans become 0/1; numeric strings are parsed. |
readings | array | Batch form: [{ machine?, ts?, values }]. |
autoCreate | boolean | Create a machine (family "other") for an unknown externalId at the site. Counts towards the plan. |
Example request
curl -X POST "https://api.induqt.ai/v1/ingest" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"machine": "B-101",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"ts": "2026-10-27T03:12:09Z",
"values": {
"steam_pressure": 112.4,
"steam_flow": 2.1,
"flue_o2": 3.2,
"stack_temp": 410
}
}'{
"machine": "B-101",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"ts": "2026-10-27T03:12:09Z",
"values": {
"steam_pressure": 112.4,
"steam_flow": 2.1,
"flue_o2": 3.2,
"stack_temp": 410
}
}Example response
{
"accepted": 4,
"rejected": 0,
"machines": [
"0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0"
]
}Notes
- Use a key with the ingest scope. A site-scoped key can only write to that site.
- Unknown machines are counted in rejected with a reason in errors[]; if nothing is accepted the response is 400.
- Readings for the same machine, signal and timestamp overwrite each other, so retries are safe.
- Rate limit: 600 requests a minute per key. Batch when sending more than a few readings a second.
POST/v1/uploads
Get a pre-signed URL to upload one file (CSV, XLSX, photo or PDF, up to 20 MB) for an import or a diagnosis.
Body fields
| Name | Type | Description |
|---|---|---|
fileNamerequired | string | File name, e.g. b101-2026-10-20.csv. |
contentTyperequired | string | text/csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, image/jpeg, image/png, application/pdf… |
sizerequired | integer | Size in bytes, up to 20,971,520. |
Example request
curl -X POST "https://api.induqt.ai/v1/uploads" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fileName": "b101-2026-10-20.csv",
"contentType": "text/csv",
"size": 48213
}'{
"fileName": "b101-2026-10-20.csv",
"contentType": "text/csv",
"size": 48213
}Example response
{
"uploadId": "f3b0c1d2-…",
"uploadUrl": "https://induqtprodst.blob.core.windows.net/uploads/…?sv=…",
"expiresOn": "2026-10-27T03:27:09Z",
"headers": {
"x-ms-blob-type": "BlockBlob",
"Content-Type": "text/csv"
}
}Notes
- PUT the file body to uploadUrl with the returned headers within 15 minutes, then pass uploadId to an import or diagnosis.
POST/v1/machines/{machineId}/imports
Load a CSV or Excel file of history into a machine.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
Body fields
| Name | Type | Description |
|---|---|---|
uploadId | string | From POST /v1/uploads after PUTting the file to the returned URL. |
url | string | Or a public https link to a CSV/XLSX: a Google Sheets “Publish to web” CSV link, a Google Drive or OneDrive download link. |
timeColumn | string | Column with timestamps. Default: detected. |
timezone | string | For timestamps without a zone. Default: the site’s. |
Example request
curl -X POST "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/imports" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uploadId": "f3b0…",
"timeColumn": "Timestamp"
}'{
"uploadId": "f3b0…",
"timeColumn": "Timestamp"
}Example response
{
"rows": 1440,
"signals": [
"steam_pressure",
"steam_flow",
"flue_o2"
],
"from": "2026-10-20T00:00:00Z",
"to": "2026-10-20T23:59:00Z"
}Notes
- First row is the header; one column is the time, every numeric column becomes a signal.
- Up to 20 MB and 500,000 rows per file.
GET/v1/machines/{machineId}/data
Readings for a time window, averaged into evenly spaced points.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
from | query | ISO 8601 | Start. Default: 1 hour before `to`. |
to | query | ISO 8601 | End. Default: now. |
signals | query | comma-separated keys | Default: all signals (up to 20). |
points | query | integer | Points per signal, 10–2000. Default 300. |
Example request
curl "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/data" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"machineId": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"from": "2026-10-27T02:12:09Z",
"to": "2026-10-27T03:12:09Z",
"bucketSeconds": 12,
"series": [
{
"key": "steam_pressure",
"name": "Steam pressure",
"units": "psig",
"normalLow": 90,
"normalHigh": 125,
"points": [
[
"2026-10-27T02:12:00Z",
111.9
]
]
}
]
}GET/v1/machines/{machineId}/latest
The latest value of every signal, with out-of-band flags.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
Example request
curl "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/latest" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"machineId": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"at": "2026-10-27T03:12:09Z",
"signals": [
{
"key": "steam_pressure",
"name": "Steam pressure",
"units": "psig",
"normalLow": 90,
"normalHigh": 125,
"lastValue": 112.4,
"lastAt": "2026-10-27T03:12:09Z",
"outOfRange": false
}
],
"attention": []
}Recordings & insights
POST/v1/machines/{machineId}/recordings
Record a window of a machine’s data: a past window, or start now and stop later.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
Body fields
| Name | Type | Description |
|---|---|---|
namerequired | string | e.g. “Low steam pressure, night shift”. |
from | ISO 8601 | Start. Default: now (live recording). |
to | ISO 8601 | End. Omit to keep recording until stopped (max 24 h). |
note | string | What happened, in the operator’s words. Used by the AI. |
Example request
curl -X POST "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/recordings" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Low steam pressure, night shift",
"from": "2026-10-27T01:00:00Z",
"to": "2026-10-27T03:00:00Z",
"note": "Pressure sagged below 95 psig twice; burner stayed at high fire."
}'{
"name": "Low steam pressure, night shift",
"from": "2026-10-27T01:00:00Z",
"to": "2026-10-27T03:00:00Z",
"note": "Pressure sagged below 95 psig twice; burner stayed at high fire."
}Example response
{
"id": "9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"machineId": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"name": "Low steam pressure, night shift",
"status": "ready",
"from": "2026-10-27T01:00:00Z",
"to": "2026-10-27T03:00:00Z"
}Notes
- status is recording until stopped, then ready. The data is copied when the recording closes, so it plays back even after raw data ages out.
POST/v1/recordings/{recordingId}/stop
Stop a live recording.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
recordingIdrequired | path | string | Recording id. |
Example request
curl -X POST "https://api.induqt.ai/v1/recordings/9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d/stop" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"id": "9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"status": "ready"
}GET/v1/recordings
List recordings, optionally for one machine.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineId | query | string | Only this machine. |
Example request
curl "https://api.induqt.ai/v1/recordings" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"recordings": [
{
"id": "9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"machineId": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0",
"name": "Low steam pressure, night shift",
"status": "ready",
"from": "…",
"to": "…",
"insights": true
}
]
}GET/v1/recordings/{recordingId}
Everything needed to play a recording back: the data, events and AI insights.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
recordingIdrequired | path | string | Recording id. |
Example request
curl "https://api.induqt.ai/v1/recordings/9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"recording": {
"id": "9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"name": "…",
"status": "ready",
"from": "…",
"to": "…"
},
"series": [
{
"key": "steam_pressure",
"points": [
[
"…",
112.1
]
]
}
],
"events": [
{
"at": "…",
"signal": "steam_pressure",
"kind": "below_normal",
"value": 88.2
}
],
"insights": {
"summary": "…",
"firstMovers": [],
"causes": [],
"checks": []
}
}POST/v1/recordings/{recordingId}/analyze
Run the AI analysis on a recording: which signal moved first, likely causes, next checks.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
recordingIdrequired | path | string | Recording id. |
Example request
curl -X POST "https://api.induqt.ai/v1/recordings/9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d/analyze" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"summary": "Steam pressure fell after feedwater flow dropped…",
"confidence": "medium",
"firstMovers": [
{
"signal": "feedwater_flow",
"at": "…",
"direction": "down"
}
],
"causes": [
{
"title": "Feedwater pump cavitation",
"likelihood": "medium",
"why": "…",
"check": "…"
}
],
"sources": [
{
"title": "…",
"url": "…"
}
]
}Notes
- Counts as one AI diagnosis against the plan.
Decision engine
POST/v1/machines/{machineId}/decisions
Run the decision engine on a window of a machine’s data: rules first, a fast model choosing among the rules’ candidates, safety veto last.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineIdrequired | path | string | Machine id. |
Body fields
| Name | Type | Description |
|---|---|---|
from | ISO 8601 | Default: 2 hours before to. |
to | ISO 8601 | Default: now. |
note | string | What the operator saw. |
Example request
curl -X POST "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/decisions" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"note": "Pressure sagging since the shift change"
}'{
"note": "Pressure sagging since the shift change"
}Example response
{
"id": "d1c2e3f4-…",
"kind": "fault",
"severity": "critical",
"causes": [
{
"id": "feedwater_supply",
"title": "Feedwater supply problem (pump, suction, deaerator, feed valve)",
"confidence": 0.92,
"matched": [
"feedwater_flow down",
"drum_level down"
],
"source": "ai"
}
],
"nextCheck": {
"id": "feed_pump",
"text": "Check feedwater pump discharge pressure and amps…",
"safety": "qualified",
"note": "Qualified personnel only, following the manufacturer’s procedure."
},
"firstMovers": [
{
"signal": "feedwater_flow",
"at": "…",
"move": "down"
}
],
"rationale": "…",
"source": {
"kind": "ai",
"causes": "ai",
"nextCheck": "ai"
},
"notify": true,
"vetoes": [
"critical_signal_forces_critical"
],
"rules": {
"kind": "fault",
"severity": "critical",
"topCause": "feedwater_supply"
},
"ai": {
"kind": "fault",
"topCause": "feedwater_supply",
"model": "google/gemini-2.5-flash-lite",
"ms": 1112,
"error": null
}
}Notes
- The AI is only asked when the rules find an event, and may only choose among the rules’ candidate ids. Invalid or low-confidence answers fall back to the rules.
- Decisions also run automatically when a signal leaves its normal band (at most every 30 minutes per machine) and when a recording is analysed.
GET/v1/decisions
Recent decisions: live detections, recording analyses and manual runs.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
machineId | query | string | Only this machine. |
siteId | query | string | Only this site. |
limit | query | integer | 1–200, default 50. |
Example request
curl "https://api.induqt.ai/v1/decisions" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"decisions": [
{
"id": "d1c2e3f4-…",
"machineId": "…",
"machineName": "Boiler B-101",
"trigger": "live",
"family": "boilers",
"kind": "fault",
"severity": "critical",
"final": {},
"vetoes": [],
"outcome": null,
"createdAt": "…"
}
]
}GET/v1/decisions/{decisionId}
One decision with its audit trail: the canonical state, the rules’ answer, the AI’s answer, the policy and the vetoes.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
decisionIdrequired | path | string | Decision id. |
Example request
curl "https://api.induqt.ai/v1/decisions/d1c2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"id": "d1c2e3f4-…",
"state": "v: s1 | family: boilers | …",
"rules": {},
"ai": {},
"final": {},
"policy": {},
"vetoes": [],
"engineVersion": "e1",
"catalogVersion": "c1",
"stateVersion": "s1"
}POST/v1/decisions/{decisionId}/outcome
Record the confirmed root cause. These labels score rules against AI and train the engine.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
decisionIdrequired | path | string | Decision id. |
Body fields
| Name | Type | Description |
|---|---|---|
confirmedCauserequired | string | A hypothesis id from the family’s catalogue, no_fault or other. |
checkId | string | The check that found it. |
note | string | What was found. |
Example request
curl -X POST "https://api.induqt.ai/v1/decisions/d1c2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f/outcome" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"confirmedCause": "feedwater_supply",
"checkId": "feed_pump",
"note": "Suction strainer blocked."
}'{
"confirmedCause": "feedwater_supply",
"checkId": "feed_pump",
"note": "Suction strainer blocked."
}Example response
{
"ok": true
}GET/v1/decision-engine
The engine’s criteria (no key needed): questions, equipment families, cause hypotheses with their signal evidence, checks with safety levels, signal role patterns and industry policies.
Example request
curl "https://api.induqt.ai/v1/decision-engine" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"engineVersion": "e1",
"catalogVersion": "c1",
"questions": {},
"families": [
{
"id": "boilers",
"hypotheses": [],
"checks": []
}
],
"roles": [],
"policy": {}
}GET/v1/decision-engine/readout
How the engine performs for your account, by family, site or industry: rules vs AI agreement, vetoes, and top-1 accuracy of rules, AI and final answers against confirmed causes.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
groupBy | query | family | site | industry | Default family. |
days | query | integer | 1–365, default 30. |
Example request
curl "https://api.induqt.ai/v1/decision-engine/readout" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"groupBy": "family",
"days": 30,
"groups": [
{
"group": "boilers",
"decisions": 42,
"events": 17,
"aiAnswered": 17,
"kindAgreePct": "94.1",
"topCauseAgreePct": "82.4",
"vetoed": 3,
"labelled": 9,
"finalTop1Pct": "88.9",
"rulesTop1Pct": "77.8",
"aiTop1Pct": "88.9",
"aiMsAvg": "1040"
}
]
}Connectors
GET/v1/connectors/{connectorId}
One connector and its status. Secrets are never returned.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
connectorIdrequired | path | string | Connector id. |
Example request
curl "https://api.induqt.ai/v1/connectors/44c0aa11-2b3c-4d5e-8f60-718293a4b5c6" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"id": "44c0aa11-2b3c-4d5e-8f60-718293a4b5c6",
"type": "mqtt",
"name": "Boiler house broker",
"status": "connected",
"hasSecrets": true,
"lastError": null,
"lastMessageAt": "…",
"messagesTotal": 17280
}POST/v1/connectors
Connect a live data source to a site: MQTT broker, OPC UA server, Azure IoT Hub / Event Hubs, or a CSV/JSON URL polled on a schedule.
Body fields
| Name | Type | Description |
|---|---|---|
siteIdrequired | string | Site the data belongs to. |
typerequired | mqtt | opcua | eventhub | http_pull | Source type; see Connectors. |
namerequired | string | Display name. |
configrequired | object | Type-specific settings. Passwords and connection strings are encrypted at rest and never returned. |
mapping | object | How messages map to machines and signals. |
Example request
curl -X POST "https://api.induqt.ai/v1/connectors" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"type": "mqtt",
"name": "Boiler house broker",
"config": {
"url": "mqtts://broker.example.com:8883",
"topic": "plant/+/telemetry",
"username": "induqt"
},
"mapping": {
"machineFrom": "topic",
"topicLevel": 1,
"autoCreate": true
}
}'{
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"type": "mqtt",
"name": "Boiler house broker",
"config": {
"url": "mqtts://broker.example.com:8883",
"topic": "plant/+/telemetry",
"username": "induqt"
},
"mapping": {
"machineFrom": "topic",
"topicLevel": 1,
"autoCreate": true
}
}Example response
{
"id": "44c0aa11-2b3c-4d5e-8f60-718293a4b5c6",
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"type": "mqtt",
"name": "Boiler house broker",
"status": "pending",
"lastError": null,
"lastMessageAt": null
}Notes
- Live connectors need the Plant Monitor or Enterprise plan. File imports and the ingest API work on every plan.
GET/v1/connectors
List connectors and their status.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
siteId | query | string | Only this site. |
Example request
curl "https://api.induqt.ai/v1/connectors" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"connectors": [
{
"id": "44c0aa11-2b3c-4d5e-8f60-718293a4b5c6",
"type": "mqtt",
"name": "Boiler house broker",
"status": "connected",
"lastMessageAt": "…",
"messages24h": 17280,
"lastError": null
}
]
}PATCH/v1/connectors/{connectorId}
Change settings, or pause and resume with { "enabled": false }.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
connectorIdrequired | path | string | Connector id. |
Body fields
| Name | Type | Description |
|---|---|---|
name | string | Name. |
enabled | boolean | Pause or resume. |
config | object | Replaces the settings; omitted secrets are kept. |
mapping | object | Replaces the mapping. |
Example request
curl -X PATCH "https://api.induqt.ai/v1/connectors/44c0aa11-2b3c-4d5e-8f60-718293a4b5c6" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'{
"enabled": false
}Example response
{
"id": "44c0aa11-2b3c-4d5e-8f60-718293a4b5c6",
"status": "paused"
}DELETE/v1/connectors/{connectorId}
Delete a connector.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
connectorIdrequired | path | string | Connector id. |
Example request
curl -X DELETE "https://api.induqt.ai/v1/connectors/44c0aa11-2b3c-4d5e-8f60-718293a4b5c6" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"ok": true
}API keys
GET/v1/api-keys
List API keys (never the secret).
Example request
curl "https://api.induqt.ai/v1/api-keys" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"keys": [
{
"id": "7d2e1f00-3a4b-4c5d-9e6f-a1b2c3d4e5f6",
"name": "Node-RED line 2",
"prefix": "iq_live_7Hk2",
"scopes": [
"ingest"
],
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
"lastUsedAt": "…",
"createdAt": "…"
}
]
}POST/v1/api-keys
Create a key. The secret is shown once.
Body fields
| Name | Type | Description |
|---|---|---|
namerequired | string | What uses it. |
scopesrequired | array of read | write | ingest | What it may do. |
siteId | string | Limit the key to one site. |
Example request
curl -X POST "https://api.induqt.ai/v1/api-keys" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Node-RED line 2",
"scopes": [
"ingest"
],
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e"
}'{
"name": "Node-RED line 2",
"scopes": [
"ingest"
],
"siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e"
}Example response
{
"id": "7d2e1f00-3a4b-4c5d-9e6f-a1b2c3d4e5f6",
"key": "iq_live_7Hk2…(shown once)",
"name": "Node-RED line 2",
"scopes": [
"ingest"
]
}DELETE/v1/api-keys/{keyId}
Revoke a key immediately.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
keyIdrequired | path | string | Key id. |
Example request
curl -X DELETE "https://api.induqt.ai/v1/api-keys/7d2e1f00-3a4b-4c5d-9e6f-a1b2c3d4e5f6" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"ok": true
}Diagnosis
GET/v1/diagnoses/{diagnosisId}
A diagnosis and its result.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
diagnosisIdrequired | path | string | Diagnosis id. |
Example request
curl "https://api.induqt.ai/v1/diagnoses/{diagnosisId}" \
-H "Authorization: Bearer $INDUQT_API_KEY"Example response
{
"id": "…",
"status": "done",
"equipment": "boilers",
"result": {
"summary": "…",
"causes": []
}
}POST/v1/diagnoses
Ask for a diagnosis from a description, uploaded files and optionally a machine.
Body fields
| Name | Type | Description |
|---|---|---|
equipmentrequired | string | Family, e.g. boilers. |
description | string | Symptom or alarm. |
uploadIds | array | Photos, manuals, trend files. |
machineId | string | Link to a machine. |
Example request
curl -X POST "https://api.induqt.ai/v1/diagnoses" \
-H "Authorization: Bearer $INDUQT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"equipment": "boilers",
"description": "RM7800 lockout, fault 29 after pre-purge",
"machineId": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0"
}'{
"equipment": "boilers",
"description": "RM7800 lockout, fault 29 after pre-purge",
"machineId": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0"
}Example response
{
"id": "…",
"status": "done",
"result": {
"summary": "…",
"causes": []
}
}