Import Excel and CSV files

Load history from a spreadsheet or historian export, in the app or through the API.

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.

b101-2026-10-20.csv
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_pressure rather than Steam 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

  1. Open the site

    In the app, open the site and add the machine if it is not there yet.

  2. Choose Excel or CSV file

    Pick the machine, drop the file, and press Upload and import.

  3. 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

  1. Ask for an upload URL

    POST /v1/uploads returns an uploadId, an uploadUrl valid for 15 minutes, and the headers to send with it.

    POST /v1/uploads
    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 }'
  2. 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 uploadUrl
    curl -X PUT "$UPLOAD_URL" \
      -H "x-ms-blob-type: BlockBlob" \
      -H "Content-Type: text/csv" \
      --data-binary @b101-2026-10-20.csv
  3. Import it into the machine
    POST /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"
    }
Import 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.

Files already online can skip the upload: pass url instead of uploadId. See Google Sheets and Drive.

Troubleshooting

Troubleshooting
SymptomLikely cause and fix
Time column not foundPass timeColumn with the exact header text. Split date and time columns must be merged into one first.
A column is missingColumns with text, units in the cells or mostly blanks are not numeric. Clean them, or move units into the header.
Data is hours offThe file has local times. Set the site's time zone, or pass timezone (an IANA name such as America/Chicago).
Day and month swappedUse ISO dates (2026-10-20 00:00:00) in the export to avoid 03/04 ambiguity.
413 Payload Too LargeSplit the file: up to 20 MB and 500,000 rows each.
Same file imported twiceReadings with the same machine, signal and time overwrite each other, so re-importing does not duplicate data.