Load history from a historian export, data logger, HMI trend export or spreadsheet into a machine. File imports work on every plan.
File layout
One header row, one time column, then one column per signal. Every numeric column becomes a signal, keyed by its header.
Timestamp,steam_pressure,steam_flow,flue_o2,stack_temp
2026-10-20 00:00:00,112.1,2.08,3.3,409
2026-10-20 00:01:00,111.8,2.11,3.2,410
2026-10-20 00:02:00,112.6,2.05,3.4,408- CSV or Excel (
.xlsx). Put the table at the top left with the header in the first row. - Times without a zone are read in the site's time zone unless you pass
timezone. - Short, plain headers make good signal keys:
steam_pressurerather thanSteam Pressure (psig). You can name the signal and set units afterwards. - Up to 20 MB and 500,000 rows per file.
Upload in the app
- Open the site
In the app, open the site and add the machine if it is not there yet.
- Choose Excel or CSV file
Pick the machine, drop the file, and press Upload and import.
- Check the result
The import reports the rows and signals it loaded and the time range. Open the machine to see the data.
Import with the API
- Ask for an upload URL
POST /v1/uploadsreturns anuploadId, anuploadUrlvalid for 15 minutes, and the headers to send with it.POST /v1/uploadscurl -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 }' - PUT the file
Send the bytes to
uploadUrl. It is pre-signed, so it takes no Authorization header, but it needs the returned headers.PUT uploadUrlcurl -X PUT "$UPLOAD_URL" \ -H "x-ms-blob-type: BlockBlob" \ -H "Content-Type: text/csv" \ --data-binary @b101-2026-10-20.csv - Import it into the machinePOST /v1/machines/{machineId}/imports
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" }'Response{ "rows": 1440, "signals": [ "steam_pressure", "steam_flow", "flue_o2" ], "from": "2026-10-20T00:00:00Z", "to": "2026-10-20T23:59:00Z" }
| 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. |
Files already online can skip the upload: pass url instead of uploadId. See Google Sheets and Drive.
Troubleshooting
| Symptom | Likely cause and fix |
|---|---|
| Time column not found | Pass timeColumn with the exact header text. Split date and time columns must be merged into one first. |
| A column is missing | Columns with text, units in the cells or mostly blanks are not numeric. Clean them, or move units into the header. |
| Data is hours off | The file has local times. Set the site's time zone, or pass timezone (an IANA name such as America/Chicago). |
| Day and month swapped | Use ISO dates (2026-10-20 00:00:00) in the export to avoid 03/04 ambiguity. |
| 413 Payload Too Large | Split the file: up to 20 MB and 500,000 rows each. |
| Same file imported twice | Readings with the same machine, signal and time overwrite each other, so re-importing does not duplicate data. |