Quickstart: from API key to AI insight

Create a key, a site and a machine, send readings, read the latest values, then record a window and have the AI analyze it, all with curl.

You need an InduQT account, a terminal with curl, and about ten minutes. The examples use one boiler, B-101, at one plant; swap in your own names.

1. Create an API key

Sign in, open Settings → API keys and create a key. For this walkthrough give it all three scopes: read, write and ingest. The secret starts with iq_live_ and is shown once, so copy it now.

shell
export INDUQT_API_KEY="iq_live_…"

Every request sends it as a bearer token. See Authentication for scopes and site-scoped keys.

2. Create a site

A site is a plant or building. Its time zone is used to read local-time files.

POST /v1/sites
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"
}'
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"
}

Keep the returned id: the next calls use it. The examples show the ids from these sample responses; replace them with yours.

3. Add a machine

The family picks the knowledge base the AI uses. Set externalId to the name your systems already use (a tag prefix or asset number) so ingest can address the machine by it.

POST /v1/machines
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"
}'
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"
}

4. Send readings

Post one reading with several signals. Signal keys are created on first use; send the same call every few seconds from your script or gateway to stream.

POST /v1/ingest
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
  }
}'
Response
{
  "accepted": 4,
  "rejected": 0,
  "machines": [
    "0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0"
  ]
}
  • 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.

5. Read the latest values

GET /v1/machines/{machineId}/latest
curl "https://api.induqt.ai/v1/machines/0b7d9a12-7c3e-4f10-a2b4-c5d6e7f8a9b0/latest" \
  -H "Authorization: Bearer $INDUQT_API_KEY"
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": []
}

Out-of-band flags need a normal band. Name the signal and set its units and band once:

PATCH /v1/machines/{machineId}/signals/{key}
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
}'

For history, call GET /v1/machines/{machineId}/data with from, to and signals.

6. Record a window

A recording keeps a copy of a machine's data around an event, so it can be played back and analyzed later. Give a past window with from and to, or omit them to start recording now and stop it later with POST /v1/recordings/{recordingId}/stop.

POST /v1/machines/{machineId}/recordings
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."
}'
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"
}

7. Analyze it

The analysis says which signal moved first, the likely causes and what to check next. The operator's note on the recording is part of the evidence.

POST /v1/recordings/{recordingId}/analyze
curl -X POST "https://api.induqt.ai/v1/recordings/9a1e3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d/analyze" \
  -H "Authorization: Bearer $INDUQT_API_KEY"
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": "…"
    }
  ]
}
  • Counts as one AI diagnosis against the plan.

Fetch everything needed to play it back, including the insights, with:

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

Next steps