Changelog: Litmus Edge 4.0.x to 4.4.x
You are at https://api.litmus.io/reference/changelog-le.md. Parent: https://api.litmus.io/agents.md (product router: /le/agents.md) What changed in the LE API between 4.0.x and 4.4.x. This tree documents 4.4.x only; 4.0.x endpoints live only in the full collection JSON.
This document describes the API differences between LitmusEdge 4.0.x and 4.4.x, for installations and integrations upgrading from 4.0.x. Every entry was checked against live 4.0.x and 4.4.x devices. Changes are grouped by service; anything not listed is unchanged.
Breaking changes at a glance
Fourteen classes of change can break an existing 4.0.x client. They are listed in the order you should act on them; the detail for each is in its service section below. Most of them are invisible to a GraphQL schema check: they live in the driver and provider catalogues, in REST routing, or in nullability, and no GraphQL type, field or enum value was removed outside Analytics.
| # | Severity | What breaks | Service | Action |
|---|---|---|---|---|
| 1 | Critical | Every Integration ProviderID changed: all 43 providers that exist in both releases were re-keyed from readable slugs to UUIDs, and 39 of them also changed name |
Integration | Map each 4.0.x slug to its 4.4.x UUID with the table in the Integration section. Do not look providers up by their 4.0.x name |
| 2 | Critical | Instance.ProviderID retyped String! to UUID! |
Integration | Anything that stores or compares a ProviderID as an arbitrary string must accept a UUID |
| 3 | High | Mark (3) and Space (4) parity options removed from 14 serial drivers, and from the register-level parity of three of them |
DeviceHub | Audit device and tag configs for parity 3 or 4 and re-point to 0, 1 or 2 |
| 4 | High | Five /apps routes became strict about the trailing slash |
Applications | Use the exact form per route. The failure is a bare 404, not an error payload |
| 5 | High | Analytics global parameters removed: GetParameters and SetParameter no longer exist |
Analytics | Move parameter values onto the processor instances that use them, or to variables |
| 6 | Medium | 12 Digital Twins input fields became required | Digital Twins | Requests that omitted these now fail GraphQL validation |
| 7 | Medium | Subscription.DataAccess(input:) became required |
Digital Twins | Callers that omitted input now fail validation |
| 8 | Medium | The Configuration API rejects unknown request fields, and template option marketplaceV2 is gone |
System | Remove marketplaceV2 from template options; send only documented fields |
| 9 | Medium | IDEC Serial moved bit access to new *_bit registers and narrowed four address ranges |
DeviceHub | Re-create bit tags on the *_bit registers; check addresses on I, Q, M, R |
| 10 | Low | Toyopuc CMP-Link Serial dropped the accessType register property |
DeviceHub | Remove accessType from tag definitions |
| 11 | Low | AB CompactLogix Ethernet Advanced dropped pollPLCProgramChecksum (replaced by PLCProgramChangeAction); AB Logix Ethernet register R dropped value types byte and dword |
DeviceHub | Re-express the setting; re-type affected tags |
| 12 | Low | AWS IoT Core no longer offers QoS 2 for qos and willQoS |
Integration | Use QoS 0 or 1 |
| 13 | Low | CIP Ethernet register property classId is now unsigned |
DeviceHub | Send values in 0-65535 only |
| 14 | Low | Five Modbus-family drivers recased their parity labels and retyped parity from String to SignedInteger |
DeviceHub | Values are unchanged; match on the value, not the label |
Summary
| Service | Impact | Highlights |
|---|---|---|
| Integration | Breaking | Every ProviderID re-keyed; Instance.ProviderID retyped; catalogue 48 to 64 providers; Gen 2 providers take the plain names and the originals become "(Gen 1)"; IsExperimental, ExecCommandEnabled, InstanceState and per-property Required added |
| DeviceHub | Breaking | GraphQL additive, but the driver catalogue changed: parity options, IDEC Serial bit registers, removed properties; catalogue 153 to 207 drivers; bulk-selection mutations; one deprecation |
| Digital Twins | Breaking | 13 nullability tightenings; nested model attributes; asset hierarchy; paging on attribute lists; Playground subscription |
| Analytics | Breaking | Global parameters removed; workspaces, groups, AI Suite and component variables added; two log operations deprecated |
| Applications | Breaking | Five /apps routes strict about the trailing slash; new dashboard endpoint |
| System | Breaking | Configuration API strict about request fields; saved templates and snapshots added; new log query service and log forwarding |
| OPC UA | Additive | 62 to 90 types, 22 new operations: paged navigation, node versioning, staged bulk upload, worker sync, server settings; 4 deprecations |
| Dashboard, DataHub, Flows Manager | None | Unchanged |
Deprecations
Eight operations and fields are deprecated in 4.4.x that were not deprecated in 4.0.x. All still work and all have replacements. Two are scheduled for removal after 2027-09-01.
| Deprecated | Replacement | Reason |
|---|---|---|
Query.GetNodes (OPC UA) |
GetNodesByRef |
Node IDs can collide across the tree, making ID-only addressing ambiguous |
Mutation.UpdateNode (OPC UA) |
UpdateNodeByRef |
Same |
Mutation.DeleteNode (OPC UA) |
DeleteNodeByRef |
Same |
Mutation.UploadHierarchy (OPC UA) |
UploadHierarchyWithResult |
Returns no result; the replacement reports Added/Removed/Modified/RestartRequired counts |
UploadStatus.Warnings (DeviceHub) |
UploadStatus.Stats and FailDetails |
Warnings reported problems but not what actually landed |
Query.GetAnalyticsLogs (Analytics) |
GET /logs/query |
Local logs superseded by central logging; removal after 2027-09-01 |
Subscription.SubscribeToAnalyticsLogs (Analytics) |
Poll GET /logs/query with the returned cursor |
Same; removal after 2027-09-01 |
Config.Required (Integration) |
SchemaProperty.Required |
Required-ness moves onto each property in GetProviderSchema |
Integration
Breaking: every ProviderID changed
This is the largest breaking change on this upgrade path, and it affects every client that creates or inspects an Integration instance.
In 4.0.x a ProviderID was a readable slug. In 4.4.x it is a UUID, and most providers also have a new name. The table maps every provider present in both releases from its 4.0.x slug to its 4.4.x UUID and name.
| 4.0.x name | 4.0.x ProviderID | 4.4.x ProviderID | 4.4.x name |
|---|---|---|---|
AMQP SSL |
amqp-ssl |
900f51b2-936b-43c2-9af8-d65046f312a5 |
AMQP SSL (Gen 1) |
AMQP TCP |
amqp-tcp |
800bfae1-9d30-4e90-932c-e646a7771c1b |
AMQP TCP (Gen 1) |
Aveva Data Hub |
aveva-datahub |
1486437a-8208-4ec8-bb50-cf7f394fcf51 |
Aveva Data Hub (Gen 1) |
AWS IoT SiteWise |
aws-sitewise |
493124c6-c9c0-4583-a10f-c100fbfd9f42 |
AWS IoT SiteWise (Gen 1) |
Azure Event Hubs |
azure-event-hubs |
e37d3ef0-888c-480c-ad85-14e98c8162cb |
Azure Event Hubs (Gen 1) |
Cognite Connector |
cognite |
aa838ac1-a31e-4166-b9c9-aeb7973bd122 |
Cognite Connector (Gen 1) |
Databricks Zerobus Ingest |
databricks-zerobus-ingest |
0fb51adf-9e8c-49a7-80ac-1f232159a457 |
Databricks Zerobus Ingest |
DB - Databricks SQL |
databricks |
133c003c-2310-472d-95fe-991b74049311 |
DB - Databricks SQL (Gen 1) |
DB - InfluxDB v1.7.x SSL |
influxdb-ssl |
f9fda829-c2e0-47a0-83bc-7a20f3ff897a |
DB - InfluxDB v1.7.x SSL (Gen 1) |
DB - InfluxDB v1.7.x TCP |
influxdb-tcp |
a2ead4a5-d7de-41b4-a69b-76800fe6b978 |
DB - InfluxDB v1.7.x TCP (Gen 1) |
DB - InfluxDB v2.x TCP |
influxdb-v2-tcp |
a2796f78-bab4-429a-9b18-47bcf104adb7 |
DB - InfluxDB v2.x TCP (Gen 1) |
DB - InfluxDB v2.x+ SSL |
influxdb-v2-ssl |
7ee2ff5b-9f5f-4299-83f8-9b3617d79ace |
DB - InfluxDB v2.x+ SSL (Gen 1) |
DB - Microsoft SQL Server |
mssql |
b49b6e76-5c8f-4ca8-93b4-901edf3b2857 |
DB - Microsoft SQL Server (Gen 1) |
DB - Microsoft SQL Server SSL |
mssql-ssl |
5121e79f-4e74-4048-b5f0-3a7f1242b148 |
DB - Microsoft SQL Server SSL (Gen 1) |
DB - MongoDB |
mongodb |
abc92242-1591-49b2-a747-439c72ecf68d |
DB - MongoDB (Gen 1) |
DB - MongoDB v4+ |
mongodb-v4 |
363c6939-b6dc-409b-a6d6-b553692bcf2a |
DB - MongoDB v4+ (Gen 1) |
DB - MySQL |
mysql |
2dff6cc6-c383-4744-a78b-e2892ae05c49 |
DB - MySQL (Gen 1) |
DB - MySQL SSL |
mysql-ssl |
e4aa0200-3dae-4292-b7bf-499e293c7b33 |
DB - MySQL SSL (Gen 1) |
DB - PostgreSQL |
postgresql |
13e1ec1f-4774-4515-8af9-26fccd4590a8 |
DB - PostgreSQL (Gen 1) |
DB - PostgreSQL SSL |
postgresql-ssl |
b3c894c3-f11b-4d06-b720-68a52d1f6835 |
DB - PostgreSQL SSL (Gen 1) |
DB - Snowflake |
snowflake |
a870453f-e1bc-4c04-ba9f-b8f8224646a9 |
DB - Snowflake (Gen 1) |
Google Cloud Pub/Sub Connector |
gcloud-pubsub |
962fa4a8-3c82-4e3a-af50-9603b179d435 |
Google Cloud Pub/Sub Connector (Gen 1) |
InfluxDB v3 |
influxDB-v3 |
a55ebcc8-3ec9-4a10-8f2b-ff615d480e36 |
InfluxDB v3 |
Kafka SSL |
kafka-ssl |
d2413da3-fd32-48dd-ab66-6e62090a5f6d |
Kafka SSL (Gen 1) |
Kafka TCP |
kafka-tcp |
8e2f6527-519b-484c-ae51-226d67036e86 |
Kafka TCP (Gen 1) |
Litmus UNS |
litmus-uns |
2a7e325f-0dc5-4069-be4b-a6ba88d6f8a4 |
Litmus UNS (Gen 1) |
MQTT - Amazon AWS IoT Core over SSL |
aws-iotcore-mqtt-ssl |
f0df18e2-9ef9-480a-87e8-0510ef27d21d |
MQTT - AWS IoT Core over SSL (Gen 1) |
MQTT - AWS IoT Core Gen 2 |
aws-iot-core-mqtt-gen-2 |
8a7829cb-95cc-4ab8-9ed3-94fa99a8e4db |
AWS IoT Core |
MQTT - AWS IoT SiteWise Edge |
aws-sitewise-edge |
69d06521-c16f-4f38-a9e9-4cd0f0edbfe7 |
MQTT - AWS IoT SiteWise Edge (Gen 1) |
MQTT - AWS IoT SiteWise Edge Gen 2 |
aws-iot-sitewise-edge-gen-2 |
3de888ec-a6cf-4de8-9ed7-b87b70b98e7c |
AWS IoT SiteWise Edge |
MQTT - Azure IoT Hub using Device Certificates |
azure-iothub-mqtt-device-cert |
395bf3a8-17f9-4ebf-8bd9-23d1b88d887e |
MQTT - Azure IoT Hub using Device Certificates (Gen 1) |
MQTT - Azure IoT Hub using SAS Key |
azure-iothub-mqtt-sas-key |
02fcf6e4-fcdf-490e-b578-1e8b4cf03684 |
MQTT - Azure IoT Hub using SAS Key (Gen 1) |
MQTT - Generic |
generic-mqtt-tcp |
91d5953e-91bd-4564-acf8-05d662ddb090 |
MQTT - Generic (Gen 1) |
MQTT - Generic Gen 2 |
generic-mqtt-gen-2 |
0e04a6f5-dc0c-4bd8-84b9-dc2b1b74b110 |
MQTT - Generic |
MQTT - Generic over SSL |
generic-mqtt-ssl |
53efdc1f-4e02-413f-b28d-b69334041718 |
MQTT - Generic over SSL (Gen 1) |
MQTT - IBM Watson over SSL |
ibm-watson-mqtt-ssl |
3f87d2be-a30e-4304-b618-b9f1b48d21a3 |
MQTT - IBM Watson over SSL (Gen 1) |
MQTT - v5 Generic Gen 2 |
generic-mqtt-v5-tcp-gen-2 |
6d460871-d540-491d-89ea-909b783a222a |
MQTT - v5 Generic |
NATS |
nats |
286b6ec7-4069-4022-81c4-6e4826a9662c |
NATS (Gen 1) |
NATS Gen 2 |
nats-gen-2 |
b281db24-2092-4e8d-b735-f774bde9bd62 |
NATS |
Oracle Smart Operations in Fusion Cloud SCM |
rest-oracle-smart-operations-fusion |
943ecb8a-b215-4d48-ab51-2855302a3916 |
Oracle Smart Operations in Fusion Cloud SCM |
OSI PI Historian |
osi-pi-web |
88a54a10-322a-4b9b-99e0-5a7b82a2f193 |
OSI PI Historian (Gen 1) |
REST API |
rest |
1532a2b5-590f-43d3-9faf-35df646890de |
REST API (Gen 1) |
Splunk |
splunk-http |
aa1886dd-260d-4aad-b0d1-b9c49e814956 |
Splunk (Gen 1) |
48 providers in 4.0.x, 64 in 4.4.x, 43 present in both. None of those 43 kept its ProviderID.
The schema records the same change: Instance.ProviderID is retyped from String! to UUID!. CreateInstance takes a ProviderID, so every hard-coded ID fails. There is no alias or compatibility mapping: the old slug is simply not a valid ID.
Action required: migrate stored ProviderIDs with the table above, keyed on the 4.0.x slug, and treat the result as an opaque UUID.
Do not resolve by the 4.0.x name. The Gen 2 providers took the plain names and the originals became "(Gen 1)". A 4.0.x client that looks up MQTT - Generic on 4.4.x gets the Gen 2 provider 0e04a6f5-dc0c-4bd8-84b9-dc2b1b74b110, a different implementation from the generic-mqtt-tcp it used on 4.0.x, which is now MQTT - Generic (Gen 1). The same applies to NATS, REST API, Splunk, OSI PI Historian, AWS IoT SiteWise and the other renamed providers. The lookup succeeds, so nothing reports the mistake.
Five providers present in 4.0.x are gone in 4.4.x: Azure IoT Hub using SAS Key over SSL Gen 2, Kafka SSL Gen 2, Kafka TCP Gen 2, MQTT - v5 Generic over SSL Gen 2 and Snowpipe Streaming. The first four are covered by single Gen 2 providers that select the transport through a connectionType config property.
Breaking: AWS IoT Core QoS 2
AWS IoT Core (4.0.x MQTT - AWS IoT Core Gen 2) no longer offers QoS 2 for qos and willQoS. A config that sets either to 2 is invalid; use 0 or 1.
Deprecated
Config.Required is deprecated in favour of SchemaProperty.Required: GetProviderSchema now states on each property whether it is required.
Behaviour changes
On Databricks Zerobus Ingest, proxyValue is required when a proxy is configured, and on MQTT - Generic (the 4.0.x MQTT - Generic Gen 2), caCert is required for TLS connections. On Azure IoT Hub and MQTT - Generic, credentials that only apply to one connectionType are not required for the other.
New
Provider catalogue. 21 new providers: AMQP, AWS IoT SiteWise, Aveva DataHub, Azure Event Hubs, Azure IoT Hub, Cognite, Google Cloud Pub/Sub, Kafka, Litmus Unify (7c1f3a92-5b8e-4d6a-9f27-0a4c8e35b1d3), MQTT - IBM Watson over SSL, MaintainX API, Microsoft SQL Server, MongoDB v4+, MySQL, OSI PI Historian, PostgreSQL, REST API, SAP Hana Cloud, Snowflake Snowpipe Stream, Splunk and TimescaleDB.
Experimental providers. Provider, GroupedProvider and ProviderSchema gain IsExperimental: Boolean!, marking providers shipped for evaluation rather than production. It is independent of Hidden: an experimental provider is still listed and selectable unless separately hidden, so a production-only picker must filter on both. In 4.4.x, Aveva DataHub and OSI PI Historian are flagged.
Provider configuration. 37 optional properties were added across 9 providers, all with defaults, so existing configs are unaffected. They include connectTimeout, pingTimeout, reconnectInterval and publishWaitTimeout on the Gen 1 MQTT-family providers.
Instances. Instance gains ExecCommandEnabled: Boolean and ProviderName: String!. GetInstanceStatusResponse gains InstanceState: InstanceState!, backed by a new InstanceState enum.
DeviceHub
Breaking: the Mark and Space parity options are gone
Fourteen serial drivers dropped two values from their parity device property, and Generic Device, IND256x and Scale dropped them from the register-level parity as well.
| 4.0.x label | Value | Status in 4.4.x |
|---|---|---|
None |
0 |
Kept |
Odd |
1 |
Kept |
Even |
2 |
Kept |
Mark |
3 |
Removed |
Space |
4 |
Removed |
Affected drivers: AB DF1 Serial, AB Logix Serial, Enron Modbus, Generic Device, IDEC Serial, IND256x, Mitsubishi A Series Serial, Modbus Multi-Station RTU to TCP Converter, Omron Fins Ethernet, Omron Fins Serial, Omron HostLink, Scale, Siemens S7-200 Serial, Toyopuc CMP-Link Serial.
The surviving options keep their value codes, so a device configured with 0, 1 or 2 needs no action. Action required: audit device and tag configurations for parity 3 or 4 on these drivers and re-point each to 0, 1 or 2. Mark and Space parity have no equivalent among the survivors, so this is a decision about what the physical device expects rather than a relabelling.
Breaking: IDEC Serial bit registers
The bit value type moved out of registers I, Q, M, R, C and T into six new registers, I_bit, Q_bit, M_bit, R_bit, C_bit and T_bit. A tag that reads a bit through, for example, I with value type bit must be re-created on I_bit. The address ranges also narrowed: I and Q from 0-37 to 0-20, M from 0-317 to 0-300, R from 0-63 to 0-48.
Breaking: removed driver properties and value types
| Driver | Change | Action |
|---|---|---|
AB CompactLogix Ethernet Advanced |
Device property pollPLCProgramChecksum removed; PLCProgramChangeAction added |
Re-express the setting with PLCProgramChangeAction |
Toyopuc CMP-Link Serial |
Register property accessType (Block / Random memory access) removed from all 28 registers |
Drop accessType from tag definitions |
AB Logix Ethernet |
Register R no longer offers value types byte and dword |
Re-type affected tags |
CIP Ethernet |
Register property classId retyped from signed to unsigned integer (range 0-65535 unchanged) |
Send non-negative values only |
Breaking: parity labels on five Modbus-family drivers
Cutler-Hammer ELC Serial, Modbus ASCII, Modbus ASCII Advanced, Modbus RTU and Modbus RTU Advanced changed their parity labels from none / even / odd to None / Even / Odd, and the property type from String to SignedInteger. The values 0, 1, 2 are unchanged, so this only affects a client that matches on the label string.
These five drivers do not use the same value mapping as the fourteen above: for them 1 is Even and 2 is Odd, the reverse of the fourteen. Always read the mapping from the driver's own ListValues.
Deprecated
UploadStatus.Warnings is deprecated in favour of UploadStatus.Stats and FailDetails.
Behaviour changes
Default values changed on these driver properties. Devices that set the property explicitly are unaffected; devices that relied on the default behave differently after the upgrade.
| Property | 4.0.x default | 4.4.x default | Drivers |
|---|---|---|---|
requestTimeoutMs |
2000 |
1500 |
Cutler-Hammer ELC Ethernet, Cutler-Hammer ELC Serial, Modbus ASCII, Modbus ASCII Advanced, Modbus RTU, Modbus RTU Advanced, Modbus RTU over TCP, Modbus TCP, Modbus UDP |
KeepAlive |
60 |
5 |
Generic Device, IND256x, Keyence Nano, Opto22 CONT Protocol Ethernet, Scale, Toyopuc Ethernet, Yokogawa DX Ethernet; register level on Generic Device, IND256x, Scale |
accessMode |
0 |
1 |
AB CompactLogix Ethernet Advanced, AB Logix Ethernet |
DefaultDataFile (register) |
0 |
1 |
AB EthernetIP Ethernet |
responseTimeout |
5000 |
1500 |
Modbus Multi-Station RTU to TCP Converter |
retryRequestCount |
3 |
2 |
Modbus Multi-Station RTU to TCP Converter |
retryRequestCount |
0 |
2 |
Modbus RTU over TCP |
Sparkplug B Client Namespace is now required, with default spBv1.0. Generator widened the address range of registers M, S and Ssub from 1-32768 to 0-65535.
New
Driver catalogue. 153 drivers to 207. No driver was removed or renamed. The 54 new drivers are: AB ControlLogix Unsolicited, ABB Totalflow DB2, ABB Totalflow DB2 Serial, Beckhoff TwinCAT2/3 Ethernet Absolute, Beckhoff TwinCAT3 Ethernet Symbolic, Brother Ethernet, CAN Raw, CODESYS V2 Ethernet Absolute, CODESYS V2 Ethernet Symbolic, Delta DVP Ethernet, Excel, Fanuc CNC Ethernet, Fuji NB Serial, Fuji SPH2000 Ethernet, GE Fanuc 90-30 Ethernet, GE Fanuc RX3i Serial, GE Fanuc SNP Serial, GE Fanuc SNPX Serial, HID Device, Heidenhain 530 Ethernet, Heidenhain 640 Ethernet, Hitachi EH Serial, IEC60870-5-102 Ethernet, IEC60870-5-104 Ethernet, Keyence KV-10 Serial, Keyence Serial, Koyo Click Serial, Koyo Direct Serial, Koyo Ethernet, LS Serial, MTConnect Ethernet, Mitsubishi F Ethernet, Mitsubishi F Serial, Mitsubishi Q Serial, Mitsubishi iQ-F Serial (FX5U), Oemax Serial, Opto22 MMIO Protocol Ethernet, Panasonic FP Ethernet, Panasonic FP Serial, Panasonic FP7 Ethernet, Parker ACR9000 Ethernet, Ping, SEW Drive Ethernet, SICK Flexi Soft, Saia S-Bus Ethernet, Siemens Logo Ethernet, Siemens S7-300 Serial, Siemens Sinumerik 808D Serial, Siemens TI505 Ethernet, Siemens TI505 Serial, Toshiba Computer Link Ethernet, VIPA 300S Ethernet, Yaskawa MP2300 Ethernet, Yokogawa FA-M3 Ethernet.
Additions to existing drivers. Open Protocol Ethernet gains 50 register types and useGenericSubscribe; OPC UA Client Advanced can call OPC UA methods (value type Method, with DefaultInputArgumentsOPCUAMethod); AB Logix Ethernet gains array and unsigned value types on register R plus fwVersion and PLCProgramChangeAction; CIP Ethernet gains serviceType and register properties data, respDataOffset and respDataEndianness; Siemens S5 Ethernet gains value type sint; Fanuc CNC Ethernet (Gen1.3) gains register cnc_rdprgnum; Siemens S7CommPlus gains ReconnectInterval; AB Logix Serial gains readTimeout; Ignition Module gains publishStat.
GraphQL. The schema is additive: 125 types to 130, nothing removed. BrowseTask_CreateRegistersByFoldersSelection and Cart_AddItemsByFoldersSelection, both taking CreateRegistersByFoldersSelectionRequest, let a caller onboard tags by selecting folders rather than enumerating registers. UploadStatus gains Stats: UploadStats! and FailDetails: [UploadLineDetail], which report per-import counts and per-line failures; check Stats.Failed rather than trusting the absence of warnings. Smaller additions: BrowseTaskItem.DeviceID, Topic.Description, TableColumn.ReadOnly, TableColumn.AllowEmpty, FormatEnum values Call and CallResponse, ValueTypeEnum value RowFixedTable.
Digital Twins
Breaking: optional fields became required
Twelve input fields and one subscription argument went from optional to required. Nothing was removed, but any request that omitted these now fails GraphQL validation before it reaches the resolver.
| Type | Field | 4.0.x | 4.4.x |
|---|---|---|---|
CreateModelRequest |
Name |
String |
String! |
CreateModelRequest |
Assets |
String |
String! |
DeleteDynamicAttributeRequest |
ID |
UUID |
UUID! |
DeleteHierarchyNodeRequest |
ID |
UUID |
UUID! |
DeleteInstanceRequest |
ID |
UUID |
UUID! |
DeleteModelRequest |
ID |
UUID |
UUID! |
DeleteStaticAttributeRequest |
ID |
UUID |
UUID! |
DeleteTransformationRequest |
ID |
UUID |
UUID! |
UpdateHierarchyNodeRequest |
ID |
UUID |
UUID! |
UpdateInstanceRequest |
ID |
UUID |
UUID! |
UpdateModelRequest |
ID |
UUID |
UUID! |
UpdateTransformationRequest |
ID |
UUID |
UUID! |
Subscription.DataAccess |
input argument |
DataAccessRequest |
DataAccessRequest! |
Most of these were already semantically required: a delete without an ID could never succeed. What changes is where the failure happens: validation now rejects the document before execution, so the error shape differs. CreateModelRequest.Name and Assets are the two worth checking properly, since a model create that relied on a server-side default for either is now invalid.
New
Nested model attributes. DynamicAttributeType gains nestedModel, and CreateDynamicAttributeRequest, UpdateDynamicAttributeRequest and DynamicAttribute gain NestedModelID and NestedInstanceID. One model can now reference another instead of restating its attributes. Set one of the two, leave the other null. Nothing prevents a nesting cycle, and a cycle surfaces when the twin is resolved rather than when the attribute is saved.
Asset hierarchy. SetInstanceAssetHierarchy(input: SetInstanceAssetHierarchyRequest!) places instances in a hierarchy path with optional metadata, batch-first via an Items list. AttributeType gains AssetHierarchy, so it is now Regular | UNS | AssetHierarchy. An exhaustive match on AttributeType written against 4.0.x will meet a third member; check the default branch.
Instance source. Instance and CreateInstanceRequest gain Source: InstanceSource (local | external). There is no server-side filter by source; filter client-side.
Paging on attribute lists. ListStaticAttributeRequest and ListDynamicAttributeRequest gain Limit and Offset.
Counts and nested instances. Model gains InstanceCount, StaticAttributeCount, DynamicAttributeCount, ParameterCount and Instances. Instance gains the three attribute counts.
Playground. New PlaygroundMessages subscription for live topic inspection.
OPC UA
The schema grew from 62 types to 90, with 22 new operations and no breaking change.
Deprecated
GetNodes, UpdateNode and DeleteNode are deprecated in favour of GetNodesByRef, UpdateNodeByRef and DeleteNodeByRef, and UploadHierarchy in favour of UploadHierarchyWithResult. UpdateNode and DeleteNode are simultaneously extended: both gained originId, and DeleteNode gained expectedVersion, so callers who cannot move to the ByRef variants immediately still get versioning and origin tracking.
New
Hierarchy navigation and search. GetFolderItems, GetChildFolders, GetChildFoldersPage, GetFolderSkeleton and SearchNodes replace unpaged traversal with cursor-paged access. GetFolderItems returns a node's tag children only, and GetChildFolders returns its folder and device children; neither returns both.
Node versioning and unambiguous addressing. NodeItem gains Version, SyncState, SyncFailureReason, HasChildren and AccessControl. GetNodesByRef, UpdateNodeByRef and DeleteNodeByRef address nodes by reference rather than by an ID that can collide. DeleteNodeByRef and DeleteNode take expectedVersion for optimistic concurrency, and the mutations take originId for change attribution.
Staged bulk upload. StageHierarchy, CommitStagedHierarchy and CancelStagedHierarchy turn a bulk upload into a two-phase operation. UploadHierarchyWithResult returns applied counts where UploadHierarchy returned nothing.
Worker sync. SyncNodes, GetSyncStatus, GetCurrentSync and SubscribeSyncStatus. GetCurrentSync falls back to the most recent terminal sync, so a non-null result does not mean a sync is currently running; check the state.
Server settings and access control. GetServerSettings, UpdateServerSettings and BulkUpdateTagAccessControl.
Subscriptions. SubscribeNodeStateChanged, SubscribeTreeChanged and SubscribeSyncStatus.
Analytics
Analytics changes are stated against the operations in the LitmusEdge 4.0.x API documentation.
Breaking: global parameters removed
GetParameters and SetParameter no longer exist, and there are no global parameters in 4.4.x. Parameters now belong to individual processor instances: CreateProcessorInstanceRequest, UpdateProcessorInstanceRequest and ProcessorInstance carry Parameters. Global values that processors read and write are handled by variables (GetVariables, GetVariable, SetVariable). Action required: move each global parameter onto the processor instances that use it, or into a variable.
Deprecated
GetAnalyticsLogs and SubscribeToAnalyticsLogs are superseded by central logging (GET /logs/query) and scheduled for removal after 2027-09-01.
New
46 operations not in the 4.0.x documentation:
| Area | Operations |
|---|---|
| Workspaces | GetWorkspaces, GetWorkspace, CreateWorkspace, UpdateWorkspace, DeleteWorkspace, ExportWorkspace, ImportWorkspace, GetWorkspaceGroups, GetWorkspaceProcessors, GetWorkspacePositions, DeleteWorkspaceGroupsAndProcessorInstances |
| Groups | GetGroup, CreateGroup, UpdateGroup, DeleteGroup, AddProcessorsToGroup, RemoveProcessorsFromGroup, DeleteAllGroupsAndProcessorInstances |
| Processor instances | DeleteProcessorInstance, DeleteAllProcessorInstances, CopyProcessorInstances, RenameProcessorInstance, ReconnectProcessorInstances, SetProcessorInstancesPositionMap, TestProcessorScript, ValidateProcessorScript |
| Variables | GetVariable, GetComponentVariable, GetComponentVariables, SetComponentVariable, DeleteComponentVariable |
| AI Suite | ExportAISuite, ImportAISuite, GetAISuiteFiles, GetAISuiteFileContent, DeleteAISuiteFile, CreateAISuiteUploadSession, ResumeAISuiteUploadSession, CloseAISuiteUploadSession, TestAISuiteMCPServer, ListProviderModels |
| Models | CreateModelUploadSession, ResumeModelUploadSession, CloseModelUploadSession, GetModelUploadSession |
| Metrics | SubscribeServerMetrics |
Applications
Breaking: five /apps routes became strict about the trailing slash
In 4.0.x both the slashed and unslashed form of these routes returned the list. In 4.4.x each route matches its path exactly, and the strictness runs in both directions.
| Route | 4.0.x | 4.4.x | Required form in 4.4.x |
|---|---|---|---|
/apps |
200 either way |
404 without slash |
with trailing slash |
/apps/dc/containers |
200 either way |
404 without slash |
with trailing slash |
/apps/dc/networks |
200 either way |
404 without slash |
with trailing slash |
/apps/images |
200 either way |
400 without slash |
with trailing slash |
/apps/registries |
200 either way |
404 with slash |
without trailing slash |
Action required: do not apply a blanket rule. /apps/registries requires the absence of the trailing slash while the other four require its presence. The failure is a bare 404 page not found rather than an error payload, so a client that joins a base path without a separator fails silently.
New
GET /apps/overview/dashboard (query parameter cpuHistorySeconds) returns an application overview. GET /apps/registries/schemas gained schema.properties.region.minLength on the registry schema entries.
System
Breaking: the Configuration API rejects unknown request fields
The Configuration service now decodes request bodies strictly: an unknown field fails with 400 and failed to decode request body: json: unknown field "<name>". Template option marketplaceV2 (datastruct.MarketplaceOptionsV2) was removed, so a template download or create that sends it now fails this way. Use marketplace.
New: saved templates and snapshots
The Configuration API grew from 6 paths to 14, with 14 new operations and nothing removed. In 4.0.x only the session-based /config/template flow existed; templates are now first-class saved objects.
| Method | Route | Purpose |
|---|---|---|
GET / POST |
/config/templates |
List saved templates; create one from current config |
GET / PUT / DELETE |
/config/templates/{id} |
Read, update metadata, delete |
POST |
/config/templates/delete |
Bulk delete |
GET / POST |
/config/templates/{id}/download |
Download a saved template |
POST |
/config/templates/{id}/apply |
Apply a saved template |
POST |
/config/templates/{id}/preview |
Report what an apply would do, without applying |
POST |
/config/templates/{id}/merge |
Save the union of current config and a template as a new template |
GET / POST / DELETE |
/config/snapshots |
List, capture and prune configuration snapshots |
Apply and preview take a mode: legacy (the default), use or merge-apply; any other value is 400. use hard-resets each section in the template to exactly the template's contents, deleting what is not in it. merge-apply restarts most services, and a merge that would overwrite existing configuration is refused with 409 confirm_required unless confirm_overwrite is set. Applying a snapshot with no mode or legacy rolls back to it. parameters is an object keyed by section, not an array. DELETE /config/snapshots keeps the most recent snapshot and deletes the rest, oldest first, bounded per call; repeat while truncated is true. The most recent snapshot cannot be deleted.
The session-based apply (Step 3: Apply Uploaded Template) accepts optional name, description, encryptionKey, failFast and saveOnly; a non-empty name also saves the template, and saveOnly saves it without applying. {} still applies the whole uploaded template.
New: log query service
GET /logs/query and GET /logs/version are new. GET /logs/query returns entries, count and cursor; each entry carries timestamp, level, message, component and a fields object with the underlying journald metadata. Query parameters: limit (default 100), level, component (the exact service name, such as loopedge-dh), search, start and cursor. The response cursor is the RFC3339 timestamp of the newest entry in the page: send it back as start to tail forward, or as cursor to page backwards. cursor=0 is rejected with 400, while start=0 and unrecognised parameters are silently ignored, so confirm a filter applied by inspecting the entries.
New: log forwarding
Five Device Management v2 operations: GET and PUT /dm/v2/log-forwarding/config, GET /dm/v2/log-forwarding/status, POST /dm/v2/log-forwarding/start and POST /dm/v2/log-forwarding/stop.
Other changes
GET /dm/ifconfig accepts an optional show_bridges query parameter. High availability (/dm/v2/ha/role), static routes (/dm/v2/routes) and the rest of Device Management are unchanged. Cloud storage sync (/cloudstorage/*) moved from service version 0.14.0 to 0.16.1 with no API difference.
Unchanged
Dashboard, DataHub and Flows Manager have no API changes between 4.0.x and 4.4.x.
Upgrade checklist
- Replace every hard-coded Integration
ProviderIDusing the slug-to-UUID table, and accept a UUID wherever you store one. Do not resolve by the 4.0.x provider name. - Audit device and tag configurations for
parity3or4on the fourteen drivers listed under DeviceHub. - Use the exact trailing-slash form for the five
/appsroutes. - Move Analytics global parameters onto processor instances or variables.
- Confirm your Digital Twins mutations always send the now-required IDs, and that
CreateModelRequestsendsNameandAssets. - Remove
marketplaceV2and any other undocumented field from Configuration API requests. - Re-create
IDEC Serialbit tags on the*_bitregisters and check their addresses; dropaccessTypefromToyopuc CMP-Link Serialtags; re-expresspollPLCProgramChecksumonAB CompactLogix Ethernet Advanced; re-typebyte/dwordtags onAB Logix EthernetregisterR. - Set QoS 0 or 1 on
AWS IoT Coreinstances that used QoS 2. - Set driver properties explicitly where you relied on a default that changed (
requestTimeoutMs,KeepAlive,accessMode,DefaultDataFile, the Modbus Multi-Station timeouts). - Find exhaustive matches on
AttributeTypeand handle the third member. - Switch CSV-import checks from
UploadStatus.WarningstoStatsandFailDetails. - Plan the move from
GetAnalyticsLogs/SubscribeToAnalyticsLogstoGET /logs/querybefore 2027-09-01, and to the OPC UAByRefoperations when convenient.