API reference

Every InduQT REST endpoint: sites, machines, data ingest and queries, recordings and AI insights, connectors, API keys and diagnoses. Base URL https://api.induqt.ai.

Base URL https://api.induqt.ai38 endpointsOpenAPI 3.1 /openapi.json

Conventions

  • Requests and responses are JSON over HTTPS. Send Content-Type: application/json with 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.

Scope read· Operation list-sites

Example request

curl
curl "https://api.induqt.ai/v1/sites" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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).

Scope write· Operation create-site

Body fields

POST /v1/sites body fields
NameTypeDescription
namerequiredstring1–80 characters, unique in the account.
locationstringFree text, e.g. city and state.
timezonestringIANA zone used to read local-time files. Default UTC.
industrymanufacturing | food_beverage | chemicals | pharma | power_utilities | buildingsSelects the decision engine’s industry thresholds.
policyobjectSite overrides for the decision engine: aiEnabled, minConfidence, normalNeedsConfidence, notifyFrom.

Example request

curl
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"
}'
Request body
{
  "name": "Pleasanton plant",
  "location": "Pleasanton, CA",
  "timezone": "America/Los_Angeles"
}

Example response

200 OK
{
  "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.

Scope read· Operation get-site

Parameters

GET /v1/sites/{siteId} parameters
NameInTypeDescription
siteIdrequiredpathstringSite id.

Example request

curl
curl "https://api.induqt.ai/v1/sites/6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation update-site

Parameters

PATCH /v1/sites/{siteId} parameters
NameInTypeDescription
siteIdrequiredpathstringSite id.

Body fields

PATCH /v1/sites/{siteId} body fields
NameTypeDescription
namestringNew name.
locationstringNew location.
timezonestringIANA zone.

Example request

curl
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"
}'
Request body
{
  "timezone": "America/Chicago"
}

Example response

200 OK
{
  "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.

Scope write· Operation delete-site

Parameters

DELETE /v1/sites/{siteId} parameters
NameInTypeDescription
siteIdrequiredpathstringSite id.

Example request

curl
curl -X DELETE "https://api.induqt.ai/v1/sites/6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "ok": true
}

Machines

GET/v1/machines

List machines, optionally for one site.

Scope read· Operation list-machines

Parameters

GET /v1/machines parameters
NameInTypeDescription
siteIdquerystringOnly machines at this site.

Example request

curl
curl "https://api.induqt.ai/v1/machines" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation create-machine

Body fields

POST /v1/machines body fields
NameTypeDescription
siteIdrequiredstringThe site it belongs to.
namerequiredstringDisplay name, e.g. Boiler B-101.
familyrequiredboilers | vfd | compressors | cnc | servo | chillers | pumps | conveyors | otherEquipment family; selects the knowledge base for AI insights.
externalIdstringYour id for the machine (tag prefix, asset number, MQTT device id). Ingest can address the machine by it. Unique per site.
makestringManufacturer.
modelstringModel.

Example request

curl
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"
}'
Request body
{
  "siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e",
  "name": "Boiler B-101",
  "family": "boilers",
  "externalId": "B-101",
  "make": "Cleaver-Brooks",
  "model": "CBEX Elite"
}

Example response

200 OK
{
  "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.

Scope read· Operation get-machine

Parameters

GET /v1/machines/{machineId} parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.

Example request

curl
curl "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation update-machine

Parameters

PATCH /v1/machines/{machineId} parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.

Body fields

PATCH /v1/machines/{machineId} body fields
NameTypeDescription
namestringName.
siteIdstringMove to this site.
externalIdstringYour id.
makestringManufacturer.
modelstringModel.

Example request

curl
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"
}'
Request body
{
  "model": "CBEX Elite 800"
}

Example response

200 OK
{
  "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.

Scope write· Operation delete-machine

Parameters

DELETE /v1/machines/{machineId} parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.

Example request

curl
curl -X DELETE "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "ok": true
}

PATCH/v1/machines/{machineId}/signals/{key}

Name a signal, set its units and normal operating band.

Scope write· Operation update-signal

Parameters

PATCH /v1/machines/{machineId}/signals/{key} parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.
keyrequiredpathstringSignal key as ingested.

Body fields

PATCH /v1/machines/{machineId}/signals/{key} body fields
NameTypeDescription
namestringDisplay name.
unitsstringUnits.
normalLownumber | nullLower edge of the normal band.
normalHighnumber | nullUpper edge of the normal band.

Example request

curl
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
}'
Request body
{
  "name": "Steam pressure",
  "units": "psig",
  "normalLow": 90,
  "normalHigh": 125
}

Example response

200 OK
{
  "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.

Scope write· Operation delete-signal

Parameters

DELETE /v1/machines/{machineId}/signals/{key} parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.
keyrequiredpathstringSignal key.

Example request

curl
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

200 OK
{
  "ok": true
}

Data

POST/v1/ingest

Send readings: one machine at a time or a batch of up to 5,000 readings (1 MB).

Scope ingest· Operation ingest

Body fields

POST /v1/ingest body fields
NameTypeDescription
machinestringMachine id or its externalId. Required unless each reading names its machine.
siteIdstringNeeded to resolve an externalId when the key is not tied to one site.
tsISO 8601 string | epoch millisecondsReading time. Default: time received.
valuesobject of number | booleanSignal key → value. Keys: letters, digits, _ . - (max 64). Booleans become 0/1; numeric strings are parsed.
readingsarrayBatch form: [{ machine?, ts?, values }].
autoCreatebooleanCreate a machine (family "other") for an unknown externalId at the site. Counts towards the plan.

Example request

curl
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
  }
}'
Request body
{
  "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

200 OK
{
  "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.

Scope write· Operation create-upload

Body fields

POST /v1/uploads body fields
NameTypeDescription
fileNamerequiredstringFile name, e.g. b101-2026-10-20.csv.
contentTyperequiredstringtext/csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, image/jpeg, image/png, application/pdf…
sizerequiredintegerSize in bytes, up to 20,971,520.

Example request

curl
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
}'
Request body
{
  "fileName": "b101-2026-10-20.csv",
  "contentType": "text/csv",
  "size": 48213
}

Example response

200 OK
{
  "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.

Scope write· Operation import-file

Parameters

POST /v1/machines/{machineId}/imports parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.

Body fields

POST /v1/machines/{machineId}/imports body fields
NameTypeDescription
uploadIdstringFrom POST /v1/uploads after PUTting the file to the returned URL.
urlstringOr a public https link to a CSV/XLSX: a Google Sheets “Publish to web” CSV link, a Google Drive or OneDrive download link.
timeColumnstringColumn with timestamps. Default: detected.
timezonestringFor timestamps without a zone. Default: the site’s.

Example request

curl
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"
}'
Request body
{
  "uploadId": "f3b0…",
  "timeColumn": "Timestamp"
}

Example response

200 OK
{
  "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.

Scope read· Operation query-data

Parameters

GET /v1/machines/{machineId}/data parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.
fromqueryISO 8601Start. Default: 1 hour before `to`.
toqueryISO 8601End. Default: now.
signalsquerycomma-separated keysDefault: all signals (up to 20).
pointsqueryintegerPoints per signal, 10–2000. Default 300.

Example request

curl
curl "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/data" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope read· Operation latest

Parameters

GET /v1/machines/{machineId}/latest parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.

Example request

curl
curl "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/latest" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation create-recording

Parameters

POST /v1/machines/{machineId}/recordings parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.

Body fields

POST /v1/machines/{machineId}/recordings body fields
NameTypeDescription
namerequiredstringe.g. “Low steam pressure, night shift”.
fromISO 8601Start. Default: now (live recording).
toISO 8601End. Omit to keep recording until stopped (max 24 h).
notestringWhat happened, in the operator’s words. Used by the AI.

Example request

curl
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."
}'
Request body
{
  "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

200 OK
{
  "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.

Scope write· Operation stop-recording

Parameters

POST /v1/recordings/{recordingId}/stop parameters
NameInTypeDescription
recordingIdrequiredpathstringRecording id.

Example request

curl
curl -X POST "https://api.induqt.ai/v1/recordings/9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d/stop" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "id": "9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "status": "ready"
}

GET/v1/recordings

List recordings, optionally for one machine.

Scope read· Operation list-recordings

Parameters

GET /v1/recordings parameters
NameInTypeDescription
machineIdquerystringOnly this machine.

Example request

curl
curl "https://api.induqt.ai/v1/recordings" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope read· Operation get-recording

Parameters

GET /v1/recordings/{recordingId} parameters
NameInTypeDescription
recordingIdrequiredpathstringRecording id.

Example request

curl
curl "https://api.induqt.ai/v1/recordings/9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation analyze-recording

Parameters

POST /v1/recordings/{recordingId}/analyze parameters
NameInTypeDescription
recordingIdrequiredpathstringRecording id.

Example request

curl
curl -X POST "https://api.induqt.ai/v1/recordings/9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d/analyze" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation evaluate-machine

Parameters

POST /v1/machines/{machineId}/decisions parameters
NameInTypeDescription
machineIdrequiredpathstringMachine id.

Body fields

POST /v1/machines/{machineId}/decisions body fields
NameTypeDescription
fromISO 8601Default: 2 hours before to.
toISO 8601Default: now.
notestringWhat the operator saw.

Example request

curl
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"
}'
Request body
{
  "note": "Pressure sagging since the shift change"
}

Example response

200 OK
{
  "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.

Scope read· Operation list-decisions

Parameters

GET /v1/decisions parameters
NameInTypeDescription
machineIdquerystringOnly this machine.
siteIdquerystringOnly this site.
limitqueryinteger1–200, default 50.

Example request

curl
curl "https://api.induqt.ai/v1/decisions" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope read· Operation get-decision

Parameters

GET /v1/decisions/{decisionId} parameters
NameInTypeDescription
decisionIdrequiredpathstringDecision id.

Example request

curl
curl "https://api.induqt.ai/v1/decisions/d1c2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation record-outcome

Parameters

POST /v1/decisions/{decisionId}/outcome parameters
NameInTypeDescription
decisionIdrequiredpathstringDecision id.

Body fields

POST /v1/decisions/{decisionId}/outcome body fields
NameTypeDescription
confirmedCauserequiredstringA hypothesis id from the family’s catalogue, no_fault or other.
checkIdstringThe check that found it.
notestringWhat was found.

Example request

curl
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."
}'
Request body
{
  "confirmedCause": "feedwater_supply",
  "checkId": "feed_pump",
  "note": "Suction strainer blocked."
}

Example response

200 OK
{
  "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.

Scope read· Operation decision-criteria

Example request

curl
curl "https://api.induqt.ai/v1/decision-engine" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope read· Operation decision-readout

Parameters

GET /v1/decision-engine/readout parameters
NameInTypeDescription
groupByqueryfamily | site | industryDefault family.
daysqueryinteger1–365, default 30.

Example request

curl
curl "https://api.induqt.ai/v1/decision-engine/readout" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope read· Operation get-connector

Parameters

GET /v1/connectors/{connectorId} parameters
NameInTypeDescription
connectorIdrequiredpathstringConnector id.

Example request

curl
curl "https://api.induqt.ai/v1/connectors/44c0aa11-2b3c-4d5e-8f60-718293a4b5c6" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation create-connector

Body fields

POST /v1/connectors body fields
NameTypeDescription
siteIdrequiredstringSite the data belongs to.
typerequiredmqtt | opcua | eventhub | http_pullSource type; see Connectors.
namerequiredstringDisplay name.
configrequiredobjectType-specific settings. Passwords and connection strings are encrypted at rest and never returned.
mappingobjectHow messages map to machines and signals.

Example request

curl
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
  }
}'
Request body
{
  "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

200 OK
{
  "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.

Scope read· Operation list-connectors

Parameters

GET /v1/connectors parameters
NameInTypeDescription
siteIdquerystringOnly this site.

Example request

curl
curl "https://api.induqt.ai/v1/connectors" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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 }.

Scope write· Operation update-connector

Parameters

PATCH /v1/connectors/{connectorId} parameters
NameInTypeDescription
connectorIdrequiredpathstringConnector id.

Body fields

PATCH /v1/connectors/{connectorId} body fields
NameTypeDescription
namestringName.
enabledbooleanPause or resume.
configobjectReplaces the settings; omitted secrets are kept.
mappingobjectReplaces the mapping.

Example request

curl
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
}'
Request body
{
  "enabled": false
}

Example response

200 OK
{
  "id": "44c0aa11-2b3c-4d5e-8f60-718293a4b5c6",
  "status": "paused"
}

DELETE/v1/connectors/{connectorId}

Delete a connector.

Scope write· Operation delete-connector

Parameters

DELETE /v1/connectors/{connectorId} parameters
NameInTypeDescription
connectorIdrequiredpathstringConnector id.

Example request

curl
curl -X DELETE "https://api.induqt.ai/v1/connectors/44c0aa11-2b3c-4d5e-8f60-718293a4b5c6" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "ok": true
}

API keys

GET/v1/api-keys

List API keys (never the secret).

Scope read· Operation list-keys

Example request

curl
curl "https://api.induqt.ai/v1/api-keys" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "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.

Scope write· Operation create-key

Body fields

POST /v1/api-keys body fields
NameTypeDescription
namerequiredstringWhat uses it.
scopesrequiredarray of read | write | ingestWhat it may do.
siteIdstringLimit the key to one site.

Example request

curl
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"
}'
Request body
{
  "name": "Node-RED line 2",
  "scopes": [
    "ingest"
  ],
  "siteId": "6f1c2c0e-4b1a-4c55-9d0e-1f2a3b4c5d6e"
}

Example response

200 OK
{
  "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.

Scope write· Operation delete-key

Parameters

DELETE /v1/api-keys/{keyId} parameters
NameInTypeDescription
keyIdrequiredpathstringKey id.

Example request

curl
curl -X DELETE "https://api.induqt.ai/v1/api-keys/7d2e1f00-3a4b-4c5d-9e6f-a1b2c3d4e5f6" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "ok": true
}

Diagnosis

GET/v1/diagnoses/{diagnosisId}

A diagnosis and its result.

Scope read· Operation get-diagnosis

Parameters

GET /v1/diagnoses/{diagnosisId} parameters
NameInTypeDescription
diagnosisIdrequiredpathstringDiagnosis id.

Example request

curl
curl "https://api.induqt.ai/v1/diagnoses/{diagnosisId}" \
  -H "Authorization: Bearer $INDUQT_API_KEY"

Example response

200 OK
{
  "id": "…",
  "status": "done",
  "equipment": "boilers",
  "result": {
    "summary": "…",
    "causes": []
  }
}

POST/v1/diagnoses

Ask for a diagnosis from a description, uploaded files and optionally a machine.

Scope write· Operation diagnose

Body fields

POST /v1/diagnoses body fields
NameTypeDescription
equipmentrequiredstringFamily, e.g. boilers.
descriptionstringSymptom or alarm.
uploadIdsarrayPhotos, manuals, trend files.
machineIdstringLink to a machine.

Example request

curl
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"
}'
Request body
{
  "equipment": "boilers",
  "description": "RM7800 lockout, fault 29 after pre-purge",
  "machineId": "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0"
}

Example response

200 OK
{
  "id": "…",
  "status": "done",
  "result": {
    "summary": "…",
    "causes": []
  }
}