Skip to content

HTTP API

HTTP API for interacting with the TR-100E device. All request paths begin with /api/. The GET and POST methods are supported.


  • The API accepts and returns JSON (Content-Type: application/json), except for binary OTA chunks and export responses.
  • OTA chunks are sent with Content-Type: application/octet-stream.
  • CSV export endpoints return Content-Type: text/csv.
  • Plain-text export endpoints return Content-Type: text/plain.
  • Successful responses use status 200 OK.
  • Errors return the appropriate HTTP status and JSON: { "error": "ERROR_CODE", "message": "Human readable text" }.
  • HTTP keep-alive is supported.
  • Maximum HTTP header size: 1380 bytes.
  • Maximum HTTP body size: 4096 bytes.
  • Maximum total HTTP request size: 5476 bytes.
LevelDescription
🟩 guestUnauthenticated client
🟨 userStandard user
🟥 powerUserAdvanced user
  • guest has access only to GET /api/auth/status/, GET /api/auth/salt/, GET /api/version/, and POST /api/auth/login/.
  • user has access to standard endpoints and also to service/time/sync.
  • powerUser has full access to all endpoints.

All POST /api/debug/* requests except /api/debug/display/start/ and /api/debug/display/stop/ additionally require diagnostic mode, activated at startup by pressing Up + Down. In normal mode, these requests return 403 Forbidden. This restriction does not apply to GET /api/debug/* requests.

  1. Retrieve the salt — GET /api/auth/salt/.
  2. Log in — POST /api/auth/login/, by sending SHA256(username + password + salt).
  3. All subsequent requests include the Authorization: Bearer <token> header.
  4. Log out — POST /api/auth/logout/.

Web authorization uses two independent passwords: one for the user level and one for the powerUser level. Retrieving and modifying access settings is described in settings-get.md and settings-set.md.

  • Absolute timestamps are transmitted only in UTC+0, using ISO 8601 format: 2026-04-16T12:34:56Z.
  • Intervals and delays are integers expressed in seconds or minutes.

POST /api/settings/set/ uses merge semantics:

  • only supplied fields are saved;
  • an omitted field means “do not change”;
  • arrays are replaced in full;
  • unknown keys → 400 ERROR_INVALID_VALUE.

PathPurposeAccess
/api/version/Device identification and firmware version🟩 guest
/api/auth/status/Current access level for the request🟩 guest
/api/auth/salt/Retrieve the salt for password hashing🟩 guest
/api/state/get/?...Runtime-state snapshot by group (device, network, relays, leds, protection, recorder, channels, log, ntp, httpd, modbus, wireguard)🟨 user
/api/settings/get/?...Retrieve settings by group🟨 user
/api/reference/sensor-types/List of supported sensor types🟨 user
/api/history/temperature/info/Live-history window metadata🟨 user
/api/history/temperature/samples/?...Temperature live history for all channels🟨 user
/api/recorder/info/Recorder metadata🟨 user
/api/recorder/records/?...Archived recorder entries🟨 user
/api/recorder/export.csv/Export recorder data as CSV🟨 user
/api/log/info/Event log summary🟨 user
/api/log/events/?...Log events🟨 user
/api/log/export.log/Export the log in text format🟨 user
/api/debug/tasks/RTOS task snapshot🟥 powerUser
/api/debug/heap/FreeRTOS/lwIP heap state🟥 powerUser
/api/debug/system/System diagnostics🟥 powerUser
/api/debug/settings/Persistent-settings bank state🟥 powerUser
/api/debug/adc/Raw ADC and measurement data🟥 powerUser
/api/debug/external-storage/External storage information🟥 powerUser
/api/debug/external-storage/dump/Full external-storage dump🟥 powerUser + diagnostic mode
/api/debug/network/Network-stack diagnostics🟥 powerUser
/api/debug/lwip-stats/lwIP counters (proto + memp pools)🟥 powerUser
/api/debug/menu/UI menu state🟥 powerUser
/api/debug/keyget/Physical button state🟥 powerUser
/api/service/firmware/upload/status/OTA upload-session status🟥 powerUser
/api/service/identity/get/Current identity state and hardware-lock status🟥 powerUser
/api/service/challenge/status/Overvis physical-access verification statusWireGuard + 🟨 user
/api/service/calibration/report/Most recently saved calibration report; no dongle required🟥 powerUser
/api/service/calibration/status/Active calibration-session status and heartbeat🟥 powerUser + dongle

PathPurposeAccess
/api/auth/login/Authenticate the user🟩 guest
/api/auth/logout/End the session🟨 user
/api/settings/set/Partially update settings🟥 powerUser
/api/log/acknowledge/Acknowledge viewed events🟨 user
/api/recorder/clear/Clear the recorder🟥 powerUser
/api/log/clear/Clear the log🟥 powerUser
/api/service/settings/reset/Reset settings to factory defaults🟥 powerUser
/api/service/reboot/Schedule a reboot🟥 powerUser
/api/service/time/set/Set the system time🟥 powerUser
/api/service/time/sync/Force SNTP synchronization🟨 user
/api/service/identity/set/Update and save identity fields🟥 powerUser
/api/service/challenge/set/Set, replace, or reset the Overvis challengeWireGuard + 🟨 user
/api/service/calibration/begin/Start a calibration session🟥 powerUser + dongle
/api/service/calibration/range/Select a range and point🟥 powerUser + dongle
/api/service/calibration/capture/Capture four raw ADC values and start verification🟥 powerUser + dongle
/api/service/calibration/commit/Save the points and four quality snapshots🟥 powerUser + dongle
/api/service/calibration/finish/End the session and release the measurement path🟥 powerUser + dongle
/api/service/firmware/upload/begin/Start uploading an OTA image🟥 powerUser
/api/service/firmware/upload/chunk/?offset=Write an OTA-image chunk🟥 powerUser
/api/service/firmware/upload/finish/Finish the upload and validation🟥 powerUser
/api/service/firmware/upload/discard/Delete the uploaded OTA image and reset the upload session🟥 powerUser
/api/service/firmware/apply/Apply the OTA update🟥 powerUser
/api/debug/relay/start/Relay test — start🟥 powerUser
/api/debug/relay/stop/Relay test — stop🟥 powerUser
/api/debug/led/start/LED test — start🟥 powerUser
/api/debug/led/stop/LED test — stop🟥 powerUser
/api/debug/display/start/Display test — enable override🟥 powerUser
/api/debug/display/stop/Display test — disable override🟥 powerUser
/api/debug/keypress/Simulate a button press🟥 powerUser

HTTPerrorPurpose
400ERROR_INVALID_ARGUMENT, ERROR_INVALID_VALUE, ERROR_API_PARSINGInvalid request
401ERROR_UNAUTHORIZEDNo valid authorization
403ERROR_NO_ACCESS, ERROR_WRITE_PROTECTInsufficient permissions
404ERROR_NOT_FOUNDResource not found
408ERROR_TIMEOUTOperation timed out
429ERROR_LOCKEDLockout after failed login attempts
500ERROR, ERROR_IOInternal error
503ERROR_NOT_READYSubsystem not ready
507ERROR_NO_MEMORYInsufficient memory

Documentation updated: 2026-07-30