Skip to Content
This documentation is provided with the HEAT environment and describes this HEAT instance.

Interface control document

1. Identification

ItemValue
DocumentICD-CAPTUREAPP-001 rev 1
ProductHEAT Capture
Product versions coveredmain at 170a1eca, four commits after v2.0.34
HostWindows x64
Module SDKHEAT.Capture.ModuleSDK 2.0.5
Data modelHEAT ProtoLib 0.37.0, commit 05270c5d
Date2026-09-01
OwnerVRAI Simulation

2. Scope

This document defines the supported integration boundary around HEAT Capture:

  • REST session control and operational monitoring
  • WebSocket frame publishing by simulator plugins and other publishers
  • WebSocket event, live-view and administrator streams
  • the named-pipe protocol between HEAT Capture and an isolated capture module
  • the HEAT platform calls consumed for authentication, sessions and data delivery

Settings, package, inference, after-action and system-management routes used by the browser UI are private interfaces. They are not a supported third-party contract and may change with the UI. Their network exposure is still material; see Section 12.

Individual gaze, simulator, physiology and other payload components are defined by HEAT ProtoLib and the module or plugin ICD that populates them.

3. Interface inventory

IDNameDirectionTransportPeer
IF-CAPTUREAPP-01Session control and monitoringBidirectionalJSON over HTTP or HTTPSOperator tool or simulator plugin
IF-CAPTUREAPP-02Frame publishPeer to HEAT CaptureBinary WebSocketHEAT Capture Plugin or custom publisher
IF-CAPTUREAPP-03Events and live monitoringProduct to peer, with subscription controls from peerJSON WebSocketBrowser or monitoring client
IF-CAPTUREAPP-04Isolated module transportBidirectionalWindows named pipeHEAT Capture Module Host
IF-CAPTUREAPP-05HEAT platform serviceBidirectionalJSON and protobuf over HTTP or HTTPSHEAT platform

4. IF-CAPTUREAPP-01 Session control and monitoring

4.1 Transport and addressing

ItemDesktop default
SchemeHTTP
Bind address0.0.0.0
Port5005
Base path/api
JSONUTF-8, camel-case properties
HTTPSDisabled; default HTTPS port is the HTTP port plus 1

WebSettings:Host, Port, EnableHttps and HttpsPort configure the listener and require a restart. The HTTPS certificate is self-signed. HTTPS binds every interface regardless of Host.

4.2 Lifecycle and access control

A user signs in through HEAT Capture, then the peer starts, optionally pauses or resumes, and stops the session. Authentication state belongs to the process, not to the HTTP client. Session routes return 401 when no user is signed in. Storage administration requires the Admin role.

Pause rejects new packets before local storage and delivery. Modules and plugins may continue producing data, but data received during the pause is discarded. Resume accepts newly arriving packets; it cannot recover packets produced during the pause.

4.3 Messages

EndpointMethodSuccessPurpose
/api/session/start-sessionPOST200 with sessionCreate and start a session
/api/session/pause-sessionPOST200, emptyReject new packets before storage and delivery
/api/session/resume-sessionPOST200, emptyAccept newly arriving packets again
/api/session/stop-sessionPOST200, emptyDrain, finalise and close the session
/api/session/current-sessionGET200 with stateRead active state and session details
/api/session/reset-sessionPOST200, emptyForce-clear local session state; does not close the platform session
/api/session/launch-simPOST200, emptyLaunch the configured simulator
/api/session/stop-simPOST200, emptyStop the launched simulator
/api/session/simulation-statusGET200 with isRunningRead simulator process state
/api/healthGET200 with status: okProcess liveness; unauthenticated
/api/ui/versionGET200Product version; unauthenticated
/api/storage/capacityGET200Capture-drive capacity and canStartCapture
/api/operations/summaryGET200Storage, delivery, module, socket and process state
/api/storage/pending-sessionsGET200Admin-only undelivered-session inventory
/api/storage/pending-sessions/{id}/retryPOST200Admin-only delivery retry
/api/storage/pending-sessions/{id}DELETE200Admin-only permanent discard

GET requests to the start, pause, resume and stop action paths return 400 with {"error":"Invalid request, use post method"}.

4.4 Data elements

FieldTypeUnitRangeReferenceOptionality
activebooleann/atrue or falseProcess session stateRequired from current-session
session.userIdUUID stringn/aRFC 4122 UUIDSigned-in userPresent when active
session.sessionIdUUID stringn/aRFC 4122 UUIDPlatform sessionPresent when active
session.startTimedate-time stringUTCISO 8601 representable rangeHEAT Capture clockPresent when active
session.endTimedate-time string or nullUTCISO 8601 representable rangeHEAT Capture clockPresent when active
session.sessionDetails.projectIdsigned integern/a32-bit signedHEAT projectPresent when active
session.sessionDetails.sessionTemplateIdsigned integern/a32-bit signedHEAT templatePresent when active
isRunningbooleann/atrue or falseSimulator processRequired from simulation-status
capacity.pathstringn/aValid Windows pathCapture storeRequired
capacity.availableBytessigned integerbytes0 to 9,223,372,036,854,775,807FilesystemRequired
capacity.minimumBytessigned integerbytes0 to 9,223,372,036,854,775,807ConfigurationRequired
capacity.warningBytessigned integerbytes0 to 9,223,372,036,854,775,807ConfigurationRequired
capacity.canStartCapturebooleann/atrue or falseAvailable versus minimumRequired

The platform-owned session object can also contain project, sessionTemplate, metadataJson, sessionUsers and nodeInstances. Clients must tolerate null, absent and additional fields.

4.5 Timing, ordering and errors

State-changing requests are serialised. Callers must wait for each response before the next transition. Stopping allows up to 15 seconds for in-flight delivery, 30 seconds to drain disk writes and a further 30 seconds for final delivery.

ConditionStatusBehaviour
No signed-in process user401User not authenticated
Start while active409A session is already active
Start below free-space minimum507Error plus capacity snapshot
Pause, resume or stop while inactive404Error naming the missing session
Session or simulator operation fails500Error text; detail in log
Wrong action method400Invalid request, use post method
Non-Admin storage operation403Refused

There are no idempotency keys. After a lost response, read current-session before retrying.

5. IF-CAPTUREAPP-02 Frame publish

5.1 Transport, lifecycle and authentication

Open /ws/publish on the IF-CAPTUREAPP-01 listener, using ws for HTTP or wss for HTTPS. The server keep-alive interval is 10 seconds. A user must already be signed in to the HEAT Capture process; the client presents no token. Otherwise the upgrade returns HTTP 401.

Each complete binary WebSocket message is one serialized google.protobuf.Any. Fragmentation is allowed. The socket may stay connected without an active session, but messages sent then are discarded. Reconnecting creates an independent ingress stream.

5.2 Message and data elements

FieldTypeUnitRangeReferenceOptionality
WebSocket typeenumn/aBinaryWebSocketRequired; text is ignored
Message lengthunsigned integerbytes1 to 10,485,760 inclusiveReassembled messageRequired
Any.type_urlprotobuf stringn/aNon-empty UTF-8HEAT ProtoLib message typeRequired and non-empty
Any.valueprotobuf bytesbytes0 to less than 10,485,760 after envelope overheadSerialized named messageRequired by Any

HEAT Capture wraps accepted data in a DataPacket, stamps signed 64-bit milliseconds since the Unix epoch from its UTC wall clock, and injects the signed-in user’s UUID when no origin is present. There is no application acknowledgement.

5.3 Timing, ordering and errors

The interface has no prescribed period, frequency or latency budget. Messages on one socket are parsed sequentially in arrival order; there is no global order across sockets.

ConditionObservableBehaviour
Not a WebSocket upgradeHTTP 400No socket
No signed-in userHTTP 401No socket
Over 10 MiBClose 1009, Message exceeds maximum sizeMessage not stored
Invalid protobuf or empty type_urlWarning once per connectionDiscarded; socket remains open
No sessionNo replyDiscarded
Session pausedNo replyDiscarded before storage and delivery
Text messageNo replyIgnored
DisconnectInformation logAccepted data remains on disk; client reconnects

6. IF-CAPTUREAPP-03 Events and live monitoring

6.1 Paths and access

PathPurposeAccess
/ws/eventsProduct eventsNone
/ws/liveLossy live dataNone
/ws/operatorLogs and operationsProcess user must have Admin role

For events and operator streams, send {"op":"subscribe","topics":[...]}. It replaces the current subscription set. Event topics are session, config, packages and auth; operator topics are logs and operations. Unknown topics are ignored. There is no replay.

If the Admin user signs out or loses the role, HEAT Capture closes /ws/operator and checks the role again before each send. /ws/live ignores client data except close frames.

6.2 Data elements

FieldTypeUnitRangeReferenceOptionality
opstringn/asubscribeClient controlRequired for subscription update
topicsstring array or nulln/aAllowed topic namesReplaces current setOptional; null clears
topicstringn/aSubscribed topicEvent envelopeRequired
namestringn/aEvent-specific nameEvent envelopeRequired
tsdate-time stringUTCISO 8601 representable rangeHEAT Capture clockRequired
dataJSON valuen/aEvent-specificEvent envelopeRequired; may be null
Live typestringn/adataPacket, simulationFrame, videoFrameLive envelopeRequired
Live dataJSON objectn/aSelected by typeHEAT data modelRequired

Non-finite live floating-point values are JSON null.

6.3 Timing and errors

These streams are deliberately lossy and are not durable capture feeds. Events and operator streams hold 512 messages per connection and drop the oldest when full. Live streams hold eight messages per type per connection and drop the oldest of that type. Slow viewers never back-pressure capture.

Malformed subscription JSON and unknown topics are ignored without closing the socket. An unserialisable outbound value is dropped. A non-upgrade request returns 400; a non-Admin operator upgrade returns 403.

7. IF-CAPTUREAPP-04 Isolated module transport

7.1 Addressing and framing

HEAT Capture creates one full-duplex byte-mode named pipe per module. Its name is heat.capture.module. followed by 32 random uppercase hexadecimal characters. It permits one server instance and grants full control only to the Windows user that launched HEAT Capture.

The module host receives --pipe, --module-file and --module-type, then connects locally. Each frame is:

OffsetSizeTypeMeaning
04 bytesunsigned little-endianPayload length, excluding header
41 byteunsignedChannel: 0 control, 1 data
5Declared lengthbytesPayload, maximum 16,777,216 bytes

7.2 Lifecycle and trust

  1. HEAT Capture verifies the module package signature.
  2. It creates the pipe and starts the module process.
  3. The module has 10 seconds to connect.
  4. HEAT Capture sends init, negotiates the maximum protocol version, then sends start.
  5. It sends ping every 10 seconds. Two missed heartbeats mark the module crashed.
  6. On stop it sends stop with a 15-second RPC timeout. A process that does not exit within 5 seconds is killed.

There is no protocol credential. Trust comes from package verification, the unpredictable pipe name passed to the child and the current-user pipe ACL.

7.3 Control messages

Channel 0 is a UTF-8 JSON envelope.

FieldTypeUnitRangeReferenceOptionality
idsigned integern/a0 to 9,223,372,036,854,775,807Request correlation; 0 for eventsRequired
kindstringn/areq, res, evtControl protocolRequired
methodstring or nulln/aMethod tableControl protocolRequired for request/event
bodyJSON value or nulln/aMethod-specificControl protocolOptional
errorstring or nulln/aUTF-8 JSON stringFailed responsePresent on failure
MethodDirectionPurpose
init, start, stop, configUpdate, pingHEAT Capture to moduleLifecycle, settings and heartbeat
getSchema, evaluateCondition, getAsyncValues, getDebugDescriptorHEAT Capture to moduleModule settings and debug UI metadata
sessionChanged, event.dispatchHEAT Capture to moduleSession state and curated host events
debugState, transportTelemetryModule to HEAT CaptureBest-effort diagnostics
startSession, stopSession, sessionStateModule to HEAT CaptureAutomatic-mode session control and state
logModule to HEAT Capture{level, message, exception}
http.sendModule to HEAT CaptureBrokered HTTP request and response

Protocol version is integer 3 at this product ref. Initialization and configuration contain either typed settingsJson or flattened settingsValues, plus locale and localized strings. http.send uses required method and uri, multi-value headers, optional Base64 body and a 32-bit signed HTTP status response. Every control frame remains subject to the 16 MiB limit.

7.4 Data channel, timing and errors

Channel 1 is four bytes of signed little-endian destination node id followed by one serialized HEAT DataPacket. Node id range is -2,147,483,648 to 2,147,483,647. Total channel payload must not exceed 16,777,216 bytes. There is no per-packet acknowledgement. During pause the frame is accepted from the pipe, but its packet is rejected before storage.

Writes retain frame order per pipe. Normal RPC timeout is 15 seconds; asynchronous value discovery allows 45 seconds. Framing errors, unknown channels and partial writes close and poison the connection. Two missed heartbeats mark the module crashed. Failed graceful stop leads to process termination and may quarantine the module for the application run.

8. IF-CAPTUREAPP-05 HEAT platform service

8.1 Addressing, authentication and lifecycle

HEATSettings:HEAT_URL is the base URI. Production deployments must use HTTPS. The operator signs in with username and password; HEAT Capture then sends a bearer access token and refreshes the token pair when required. Changing the URL signs the user out and recreates HTTP clients.

A session creates or joins a platform shared session, resolves template nodes to session node instances, uploads locally stored packets, and closes the session. Network failure does not stop capture; packets remain on disk.

8.2 Messages

EndpointMethodContentPurpose
/api/authorization/tokenPOSTJSON username and passwordObtain tokens and user
/api/authorization/refreshPOSTJSON refresh tokenRotate tokens
/api/authorization/validatePOSTJSON access tokenValidate restored credentials
/api/v2/session/session_templatesGETJSONRead templates
/api/v2/Session/shared_session?projectId={id}POSTJSONCreate or join shared session
/api/v2/session/{sessionId}GETJSONResolve session nodes
/api/v2/node-instance/{nodeId}/outputs/dataPOSTProtobuf DataPacket as application/octet-streamDeliver one stored packet
/api/v2/Session/{sessionId}/closePOSTJSONClose session
Session fieldTypeUnitRangeReferenceOptionality
name, simulationNamestringn/aNon-empty UTF-8Session configurationRequired
emailstringn/aValid emailSigned-in userRequired
sessionTemplateIdsigned integern/a32-bit signedHEAT templateRequired
startTimeUtcdate-time stringUTCISO 8601 representable rangeHEAT Capture clockRequired
machineGroupsigned integern/a32-bit signedSimulation groupRequired
timeWindowSecondssigned integer or nullseconds1 to 2,147,483,647; default 300Join windowOptional
projectId querysigned integern/a32-bit signed; default 1HEAT projectRequired
Close email, reasonstringn/aNon-empty; valid email for emailUser and productRequired
closeAtdate-time stringUTCISO 8601 representable rangeHEAT Capture clockRequired
nodeId pathsigned integern/a1 to 2,147,483,647Session nodeRequired

Delivery retries with exponential backoff from 250 ms to 5 seconds for 10 attempts by default. A failed packet is then parked for a later launch. Replay requires a signed-in user and an exact match between the stored platform URL and current HEAT_URL. The interface does not promise exactly-once delivery.

9. Data model, units and conventions

HEAT Capture Module SDK 2.0.5 supplies HEAT.ProtoLib.CSharp 0.37.0, pinned by its assembly product version to commit 05270c5d.

IF-CAPTUREAPP-02 accepts any protobuf Any with a non-empty type_url. IF-CAPTUREAPP-04 and IF-CAPTUREAPP-05 carry DataPacket. Module and plugin ICDs define the message types they produce.

ConceptConvention
Protobuf valuesEncoding, units and fields defined by the named HEAT ProtoLib message
Named-pipe integersLittle-endian
JSONUTF-8, camel-case properties
JSON UTC timeISO 8601 emitted by .NET System.Text.Json
Publish timestampSigned 64-bit milliseconds since Unix epoch, assigned by HEAT Capture
Coordinate frame, handedness and datumDefined by payload schema and producer ICD

10. Configuration affecting interfaces

SettingEffect
WebSettings:Host, PortIF-01 to IF-03 listener; restart required
WebSettings:EnableHttps, HttpsPortIF-01 to IF-03 HTTPS/WSS listener; restart required
HEATSettings:HEAT_URLIF-05 base URI and replay identity
HEATSettings:TemplateID, InputNodeIDIF-05 template and upload node
StorageSettings:MinimumFreeSpaceBytesIF-01 start returns 507 below this value
StorageSettings:MaxBundleRetriesIF-05 retry count
StorageSettings:RetryBackoffMs, RetryBackoffMaxMsIF-05 retry timing
ModuleSecurity:AllowUnsignedModulesIF-04 may launch unsigned packages; invalid signatures remain blocked
Modules:AllowedModulesLimits IF-04 peers when enforcement is enabled

See Configure HEAT Capture.

11. Compatibility and versioning

  • JSON clients must ignore unknown properties and event names. Optional nested session values may be null or absent.
  • Protobuf peers must tolerate unknown fields and use messages compatible with HEAT ProtoLib 0.37.0.
  • IF-CAPTUREAPP-04 peers negotiate their maximum integer protocol version in init; this ref supports up to 3. Unknown frame channels close the pipe.
  • IF-CAPTUREAPP-05 depends on the platform’s /api/authorization and /api/v2 contracts.
  • An interface identifier remains assigned if the interface is deprecated or withdrawn.

12. Security considerations

đźš«

The embedded server is not a security perimeter. It binds to 0.0.0.0 by default, most private UI routes are unauthenticated, and authenticated routes share the workstation operator’s process-global sign-in state. Do not expose the port to the internet or a general-purpose user network.

Bind to localhost unless a remote peer needs access. Otherwise use a host firewall allowlist, enable HTTPS and establish explicit trust for the self-signed certificate.

  • /ws/events and /ws/live disclose product and capture data without authentication.
  • /ws/publish checks process sign-in, not peer identity. Any reachable client can publish under the active user’s session.
  • Private package, settings and restart routes are unauthenticated.
  • Module trust depends on package signatures and the current-user named-pipe ACL.
  • Platform tokens are encrypted, but their master key is stored on the same workstation.
  • A Module Library token in heat.modules.json is clear text. Remove it from support bundles.

13. Conformance

13.1 REST and publish peer

  1. Start HEAT Capture, sign in, and verify /api/health returns 200 with status: ok.
  2. Verify /api/storage/capacity returns canStartCapture: true.
  3. POST start-session; expect 200 and a non-empty session UUID.
  4. Open /ws/publish, send a valid binary protobuf Any, and verify the accepted-packet counter in /api/operations/summary increases.
  5. POST pause-session, send another valid message, and verify the stored-packet counter does not increase.
  6. POST resume-session, send another message, and verify the counter increases again.
  7. POST stop-session; expect 200 and current-session to report active: false.

13.2 Event peer

  1. Open /ws/events and subscribe to session.
  2. Start and stop a session.
  3. Verify SessionStartedEvent and SessionStoppedEvent envelopes with ISO 8601 ts values.
  4. Send malformed subscription JSON and verify the socket remains usable.

13.3 Module peer

  1. Install a valid signed package compatible with Module SDK 2.0.5.
  2. Connect within 10 seconds and return ok: true from init and start.
  3. Negotiate protocol version 3 or lower.
  4. During an active session, publish a channel-1 node id plus valid DataPacket; verify storage counters increase.
  5. Pause and publish another frame; verify storage counters do not increase.
  6. Answer ping for 30 seconds, then return ok: true from stop and exit within 5 seconds.

14. Revision history

RevDateProduct versionChange
12026-09-01main at 170a1eca, after v2.0.34Initial issue.
Opens your browser's print dialog. Choose "Save as PDF" as the destination.