Error format
Errors use standard HTTP status codes and a JSON body with a human-readable error message and, where the client can act on it, a stable machine-readable code.
Error body
{
"error": "name is required",
"code": "invalid_request"
}| Field | Type | Description |
|---|---|---|
error | string | What went wrong, written for a developer. Show it in logs; do not parse it. |
code | string, optional | A stable identifier for the kind of error. Branch on this (or on the status) rather than on the message. |
Status codes
| Status | Meaning | What to do |
|---|---|---|
| 400 Bad Request | The body or a parameter is invalid: a missing required field, a wrong type, an unknown family, a bad time, a signal key with characters other than letters, digits, _ . -. | Fix the request. The error message names the field. |
| 401 Unauthorized | No Authorization header, a malformed one, or a key that does not exist or was revoked. | Check the header is Bearer iq_live_… and the key is still listed in Settings. |
| 403 Forbidden (scope) | The key is valid but lacks the scope this endpoint needs, or it is limited to another site. | Use a key with the right scope, or create one. See Authentication. |
| 403 Forbidden (plan) | The plan does not include this: the machine allowance is used up, live connectors need Plant Monitor or Enterprise, or the AI diagnosis allowance is spent. | Upgrade the plan, or delete unused machines. |
| 404 Not Found | The resource does not exist, or belongs to another account. The two are deliberately indistinguishable. | Check the id and that the key is for the right account. |
| 409 Conflict | The change clashes with existing data: a site name or externalId already in use, deleting a site that still has machines or connectors, stopping a recording that is not live. | Read the current state, then change the request. |
| 413 Payload Too Large | Ingest bodies over 1 MB or 5,000 readings; import files over 20 MB or 500,000 rows. | Split into smaller batches or files. |
| 415 Unsupported Media Type | The body is not JSON, or an import file is not CSV or XLSX. | Send Content-Type: application/json; convert the file. |
| 429 Too Many Requests | The key went over its rate limit. | Back off and retry; batch readings. |
| 5xx Server Error | Something failed on our side or upstream (500, 502, 503, 504). | Retry with backoff. If it persists, email support with the time and request. |
Rate limits
- Ingest: Rate limit: 600 requests a minute per key. Batch when sending more than a few readings a second.
- Batch size: one ingest request takes up to 5,000 readings or 1 MB, whichever comes first.
- Imports: up to 20 MB and 500,000 rows per file.
Over the limit, the API answers 429. If the response has a Retry-After header, wait that many seconds before retrying.
Retries
Retry 429 and 5xx responses and network errors, with exponential backoff and jitter (for example 1 s, 2 s, 4 s, 8 s, up to a minute). Do not retry other 4xx responses unchanged: they will fail the same way.
- Ingest is idempotent. Readings for the same machine, signal and timestamp overwrite each other, so retries are safe. Gateways can resend a buffered batch after an outage without creating duplicates.
- Creates are not. Retrying
POST /v1/sites,/v1/machines,/v1/connectorsor/v1/api-keysafter a timeout can create a second resource, or answer409when the name must be unique. List first, then create only if it is missing. - Updates and deletes (
PATCH,DELETE) are safe to repeat. A repeated delete may answer404; treat that as done. - AI analysis counts against the plan on each successful call, so do not retry
POST /v1/recordings/{recordingId}/analyzeafter it succeeded; read the result withGET /v1/recordings/{recordingId}.
Retry with backoff (bash)
for i in 1 2 3 4 5; do
status=$(curl -s -o /tmp/induqt.json -w '%{http_code}' -X POST "https://api.induqt.ai/v1/ingest" \
-H "Authorization: Bearer $INDUQT_API_KEY" -H "Content-Type: application/json" \
-d '{"machine":"B-101","values":{"steam_pressure":112.4}}')
case "$status" in
2??) cat /tmp/induqt.json; break ;;
429|5??) sleep $((2 ** i)) ;;
*) cat /tmp/induqt.json; exit 1 ;;
esac
doneContacting support
Email support@induqt.ai with the time (UTC), method and path, status and error body. Never send the API key.