Litmus Edge 4.4.x - Integration: Streaming
List Instance Subscriptions
POST {{edgeUrl}}/cc/v2
List Instance Subscriptions
Returns every topic / subscription configured on one instance. Each subscription is a (LocalName -> RemoteName) pair plus a direction flag and per-subscription config.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
query ListSubscriptions($input: ListSubscriptionsRequest!) {
ListSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
| Field | Type | Required | Description |
|---|---|---|---|
InstanceID |
ID! |
Yes | UUID of the instance. |
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
Response
200 OK -- application/json
| Field | Type | Description |
|---|---|---|
TopicID |
string | Subscription UUID. Use as {{integration_topic_id}} in mutation calls. |
IsLocalToRemote |
boolean | true for outbound (local-to-remote); false for inbound (remote-to-local). |
Enabled |
boolean | Whether the subscription is active. |
LocalName |
string | Local topic name (e.g. devicehub.alias.<device>.<tag>). |
RemoteName |
string | Remote topic / table / queue name. Empty when the provider uses a single fixed sink. |
Config |
string | Provider-specific subscription config (JSON-encoded). Typically empty. |
Description |
string | Free-form description. By default holds the source tag's display name. |
{
"data": {
"ListSubscriptions": [
{
"TopicID": "92057D78-AE19-4653-8DC9-69CACBF6D678",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.BadPart",
"RemoteName": "",
"Config": "",
"Description": "BadPart"
}
]
}
}
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
query ListSubscriptions($input: ListSubscriptionsRequest!) {
ListSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"ListSubscriptions": [
{
"TopicID": "92057D78-AE19-4653-8DC9-69CACBF6D678",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.BadPart",
"RemoteName": "",
"Config": "",
"Description": "BadPart"
},
{
"TopicID": "C2030499-AD56-4109-96FD-DB90CA39E2F0",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.BadPartInterval_Base",
"RemoteName": "",
"Config": "",
"Description": "BadPartInterval_Base"
},
{
"TopicID": "2C453EE5-CD4D-4C59-9F60-605F06F53EF9",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.BadPartInterval_Variation",
"RemoteName": "",
"Config": "",
"Description": "BadPartInterval_Variation"
},
{
"TopicID": "CED861F9-A32B-4FB5-85F7-F2604FCDAD6F",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Current",
"RemoteName": "",
"Config": "",
"Description": "Current"
},
{
"TopicID": "1F6F4DBA-9834-43D2-B957-5D8629456750",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.CycleStarted",
"RemoteName": "",
"Config": "",
"Description": "CycleStarted"
},
{
"TopicID": "31D89E00-11D9-4A62-86B4-5D57223E7849",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.CycleTime_Base",
"RemoteName": "",
"Config": "",
"Description": "CycleTime_Base"
},
{
"TopicID": "D5F096ED-0A45-4AFE-9697-B992AC6A6088",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.CycleTime_Variation_Factor",
"RemoteName": "",
"Config": "",
"Description": "CycleTime_Variation_Factor"
},
{
"TopicID": "A4919906-2639-4788-A544-0DC32C67A919",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Downtime_Base",
"RemoteName": "",
"Config": "",
"Description": "Downtime_Base"
},
{
"TopicID": "E82F143A-E8DF-47F2-B853-6AB7098F5B02",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Downtime_Variation_Factor",
"RemoteName": "",
"Config": "",
"Description": "Downtime_Variation_Factor"
},
{
"TopicID": "272D0394-7778-4E88-A54A-8BEDA35E3EF9",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.FaultCode",
"RemoteName": "",
"Config": "",
"Description": "FaultCode"
},
{
"TopicID": "3FB51294-F342-41C8-A0BC-22896A30E231",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.FaultCode_L2",
"RemoteName": "",
"Config": "",
"Description": "FaultCode_L2"
},
{
"TopicID": "DB645339-6BB3-437C-8AE2-8BFC23F79F79",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.FaultCode_L2_Max_Value",
"RemoteName": "",
"Config": "",
"Description": "FaultCode_L2_Max_Value"
},
{
"TopicID": "4D40E836-17A0-4B24-A706-078C49991FA1",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.FaultCode_L2_Min_Value",
"RemoteName": "",
"Config": "",
"Description": "FaultCode_L2_Min_Value"
},
{
"TopicID": "D8502A19-0724-472F-A13D-CE66C2EEADFF",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.FaultCode_Max_Value",
"RemoteName": "",
"Config": "",
"Description": "FaultCode_Max_Value"
},
{
"TopicID": "340BB4BC-DA34-4CB5-A744-A5ECDC38D2DD",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.FaultCode_Min_Value",
"RemoteName": "",
"Config": "",
"Description": "FaultCode_Min_Value"
},
{
"TopicID": "0CB7E9C1-2868-4200-9EAE-03FEDCD22ABC",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.FaultOccurrence_Factor",
"RemoteName": "",
"Config": "",
"Description": "FaultOccurrence_Factor"
},
{
"TopicID": "E9FFF342-0C90-46EE-8277-029510FF09A8",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.GoodPart",
"RemoteName": "",
"Config": "",
"Description": "GoodPart"
},
{
"TopicID": "06162BE6-FEA4-4847-A119-4699BA1B76C7",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Level_PV",
"RemoteName": "",
"Config": "",
"Description": "Level_PV"
},
{
"TopicID": "7FE5FBA6-9C9F-4E6B-84DE-073EF44FE00E",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Level_SP",
"RemoteName": "",
"Config": "",
"Description": "Level_SP"
},
{
"TopicID": "7223CD70-CCC5-41DB-AB05-4328AFE12507",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.PartMade",
"RemoteName": "",
"Config": "",
"Description": "PartMade"
},
{
"TopicID": "29F99299-A911-4BFA-9C3D-AA5341D47FF5",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.PartSize_TestResult",
"RemoteName": "",
"Config": "",
"Description": "PartSize_TestResult"
},
{
"TopicID": "C01CC7EE-426D-408C-BCC7-E07EA1D52592",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Pressure",
"RemoteName": "",
"Config": "",
"Description": "Pressure"
},
{
"TopicID": "C6317894-4209-4507-909C-9871219AB040",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Pressure_PV",
"RemoteName": "",
"Config": "",
"Description": "Pressure_PV"
},
{
"TopicID": "948AC14C-0547-445E-ACF2-DE0BE0EFB3A8",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Pressure_SP",
"RemoteName": "",
"Config": "",
"Description": "Pressure_SP"
},
{
"TopicID": "0BA2094C-B6EF-46F1-BD01-7A226C5EC4F3",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.QualityCode",
"RemoteName": "",
"Config": "",
"Description": "QualityCode"
},
{
"TopicID": "F3A2BC52-3F33-4744-B415-AAC2A8A830A7",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.QualityCode_Scrap_Max",
"RemoteName": "",
"Config": "",
"Description": "QualityCode_Scrap_Max"
},
{
"TopicID": "0AAA2D6B-A6E2-4F44-AF24-40FE0D838931",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.QualityCode_Scrap_Min",
"RemoteName": "",
"Config": "",
"Description": "QualityCode_Scrap_Min"
},
{
"TopicID": "560FD6D9-E7D5-4D38-9033-7924E200D194",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.ReasonCode",
"RemoteName": "",
"Config": "",
"Description": "ReasonCode"
},
{
"TopicID": "7E49D5A8-0DE1-4EA9-A3CB-2D7592DF2B32",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.ReasonCode_L2",
"RemoteName": "",
"Config": "",
"Description": "ReasonCode_L2"
},
{
"TopicID": "282EF144-28AE-4F82-958B-21FFBB380D78",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.ReasonCode_L2_Max",
"RemoteName": "",
"Config": "",
"Description": "ReasonCode_L2_Max"
},
{
"TopicID": "5C562A95-E141-4377-B63B-3BB5C73189AB",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.ReasonCode_L2_Min",
"RemoteName": "",
"Config": "",
"Description": "ReasonCode_L2_Min"
},
{
"TopicID": "64F05A8C-1DE8-4798-884E-E03D2D4DCD51",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.ReasonCode_Max",
"RemoteName": "",
"Config": "",
"Description": "ReasonCode_Max"
},
{
"TopicID": "1660D3C4-D6F9-4A98-B9C5-95D86975E1CA",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.ReasonCode_Min",
"RemoteName": "",
"Config": "",
"Description": "ReasonCode_Min"
},
{
"TopicID": "176B5687-7E32-4578-A8B4-6D250368B506",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.SKU",
"RemoteName": "",
"Config": "",
"Description": "SKU"
},
{
"TopicID": "A3D20A43-E258-4AEA-B5A0-4EE4F0C8ED89",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.SerialNumber",
"RemoteName": "",
"Config": "",
"Description": "SerialNumber"
},
{
"TopicID": "85352165-1A4D-4343-A68D-53B834AD562D",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Speed",
"RemoteName": "",
"Config": "",
"Description": "Speed"
},
{
"TopicID": "9239CC17-EE9D-4D76-A3B1-7A023FFB7D16",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Step1",
"RemoteName": "",
"Config": "",
"Description": "Step1"
},
{
"TopicID": "339BB520-312A-482A-85D1-6533291155C4",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Step2",
"RemoteName": "",
"Config": "",
"Description": "Step2"
},
{
"TopicID": "B68A52F5-42F2-4D0B-A510-483911BBB0E0",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Step3",
"RemoteName": "",
"Config": "",
"Description": "Step3"
},
{
"TopicID": "FA890F08-A4AB-4F5F-9F2F-6D145C9B7838",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Step4",
"RemoteName": "",
"Config": "",
"Description": "Step4"
},
{
"TopicID": "3B7EC3CF-BB0F-4B7D-AD71-BD753B399C2A",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Step5",
"RemoteName": "",
"Config": "",
"Description": "Step5"
},
{
"TopicID": "348162D8-C971-4463-9BAD-55F88F5029B3",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.TaktTime_Base",
"RemoteName": "",
"Config": "",
"Description": "TaktTime_Base"
},
{
"TopicID": "90B6CF0D-A93F-4CB3-9E3C-F6B616CD1919",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.TaktTime_Variation_Factor",
"RemoteName": "",
"Config": "",
"Description": "TaktTime_Variation_Factor"
},
{
"TopicID": "68DF5D61-171E-4F20-8CAC-11E5120F5B5E",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Temperature",
"RemoteName": "",
"Config": "",
"Description": "Temperature"
},
{
"TopicID": "E4D347C5-9C2A-4DFB-B0E8-493C9966BB81",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Temperature_LowerControlLimit",
"RemoteName": "",
"Config": "",
"Description": "Temperature_LowerControlLimit"
},
{
"TopicID": "0116A824-440D-4168-826F-CDA652522BF6",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Temperature_PV",
"RemoteName": "",
"Config": "",
"Description": "Temperature_PV"
},
{
"TopicID": "41D5E445-CA4C-43CC-8E81-4391DDDE78DE",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Temperature_SP",
"RemoteName": "",
"Config": "",
"Description": "Temperature_SP"
},
{
"TopicID": "4308A622-E9FC-43BB-966A-A5665551EA99",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Temperature_UpperControlLimit",
"RemoteName": "",
"Config": "",
"Description": "Temperature_UpperControlLimit"
},
{
"TopicID": "DDDFC41C-C3B5-401F-9156-6E9AB1650CD8",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Uptime_Base",
"RemoteName": "",
"Config": "",
"Description": "Uptime_Base"
},
{
"TopicID": "F4503821-AC59-446F-A703-30EB60762B43",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Uptime_Variation_Factor",
"RemoteName": "",
"Config": "",
"Description": "Uptime_Variation_Factor"
},
{
"TopicID": "77055F65-4E68-48E5-B34B-20FBAB33580E",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Voltage",
"RemoteName": "",
"Config": "",
"Description": "Voltage"
},
{
"TopicID": "62F74BA7-AC14-44C6-A098-F65AC3A1616B",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.isFaulted",
"RemoteName": "",
"Config": "",
"Description": "isFaulted"
},
{
"TopicID": "8B809E5F-DDAE-4845-AF55-BBE2CEEA6A16",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.isRunning",
"RemoteName": "",
"Config": "",
"Description": "isRunning"
}
]
}
}
Create Subscription
POST {{edgeUrl}}/cc/v2
Create Subscription
Requires: an existing Integration instance (
InstanceIDfromCreate InstanceorList Instances). An unknown ID fails withinstance not found.LocalNameis not checked: it may name a topic that no device publishes yet.
Creates one or more subscriptions inside an instance. Each subscription wires a local NATS topic to a remote topic / table / queue on the upstream system.
The mutation is batched -- pass a Subscriptions[] array to create many in one call. Useful for bulk provisioning after running Import Topics.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation CreateSubscriptions($input: CreateSubscriptionsRequest!) {
CreateSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
__typename
}
}
Variables
| Field | Type | Required | Description |
|---|---|---|---|
InstanceID |
ID! |
Yes | UUID of the instance. |
Subscriptions |
[SubscriptionInput!]! |
Yes | One or more subscription inputs. |
Subscriptions[].LocalName |
String! |
Yes | Local NATS topic (e.g. devicehub.alias.<device>.<tag>). |
Subscriptions[].RemoteName |
String |
No | Remote topic / table / queue. Empty for providers with fixed sinks. |
Subscriptions[].IsLocalToRemote |
Boolean |
Yes | true = outbound, false = inbound. |
Subscriptions[].Enabled |
Boolean |
No | Default false. Use Enable Topic/s Subscription later. |
Subscriptions[].Description |
String |
No | Free-form description. |
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"Subscriptions": [
{
"Description": "",
"Enabled": false,
"IsLocalToRemote": true,
"LocalName": "{{integration_topic_name}}",
"RemoteName": "apiCreatedRemoteTopic"
}
]
}
}
Response
200 OK -- application/json. Returns the new subscriptions with their server-assigned TopicIDs.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation CreateSubscriptions($input: CreateSubscriptionsRequest!) {
CreateSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
__typename
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"Subscriptions": [
{
"Description": "",
"Enabled": false,
"IsLocalToRemote": true,
"LocalName": "{{integration_topic_name}}",
"RemoteName": "{{integration_remote_topic_name}}",
"TopicID": null,
"Config": "{}"
}
]
}
}
Response
Status: 200 OK
{
"data": {
"CreateSubscriptions": [
{
"TopicID": "D678051A-09D8-4A05-A534-745F5327A8CE",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "{{integration_topic_name}}",
"RemoteName": "apiCreatedRemoteTopic",
"Config": "{}",
"Description": "",
"__typename": "Topic"
}
]
}
}
Update Subscription
POST {{edgeUrl}}/cc/v2
Update Subscription
Updates one or more subscriptions in place. Pass the full subscription object inside Subscriptions[] -- this is not a patch.
Common changes: re-target a different RemoteName, switch direction (IsLocalToRemote), update the description, change per-subscription config.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation UpdateSubscriptions($input: UpdateSubscriptionsRequest!) {
UpdateSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"Subscriptions": [
{
"Description": "Downtime_Base",
"Enabled": false,
"IsLocalToRemote": true,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Downtime_Base",
"RemoteName": ""
}
]
}
}
The Postman example omits TopicID; the service identifies the subscription by (InstanceID, LocalName, IsLocalToRemote). Include TopicID in your own client for safety against rename races.
Response
Same shape as Create Subscription.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation UpdateSubscriptions($input: UpdateSubscriptionsRequest!) {
UpdateSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"Subscriptions": [
{
"Description": "Downtime_Base",
"Enabled": false,
"IsLocalToRemote": true,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Downtime_Base",
"RemoteName": "",
"TopicID": "{{integration_topic_id}}",
"Config": "{}"
}
]
}
}
Response
Status: 200 OK
{
"data": {
"UpdateSubscriptions": [
{
"TopicID": "A4919906-2639-4788-A544-0DC32C67A919",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Downtime_Base",
"RemoteName": "",
"Config": "{}",
"Description": "Downtime_Base"
}
]
}
}
Enable Topic/s Subscription
POST {{edgeUrl}}/cc/v2
Enable Topic/s Subscription
Enables one or more subscriptions by their TopicIDs. The instance begins forwarding (or receiving) messages on the enabled subscriptions immediately, assuming the instance itself is Enabled and Online.
Idempotent for already-enabled subscriptions.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation EnableSubscriptions($input: EnableSubscriptionsRequest!) {
EnableSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
| Field | Type | Required | Description |
|---|---|---|---|
InstanceID |
ID! |
Yes | UUID of the instance. |
TopicIDs |
[ID!]! |
Yes | Subscription UUIDs to enable. |
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"TopicIDs": ["{{integration_topic_id}}"]
}
}
Response
200 OK -- application/json. Returns the updated subscriptions.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation EnableSubscriptions($input: EnableSubscriptionsRequest!) {
EnableSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"TopicIDs": [
"{{integration_topic_id}}"
]
}
}
Response
Status: 200 OK
{
"data": {
"EnableSubscriptions": [
{
"TopicID": "A4919906-2639-4788-A544-0DC32C67A919",
"IsLocalToRemote": true,
"Enabled": true,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Downtime_Base",
"RemoteName": "",
"Config": "{}",
"Description": "Downtime_Base"
}
]
}
}
Disable Topic/s Subscription
POST {{edgeUrl}}/cc/v2
Disable Topic/s Subscription
Disables one or more subscriptions by their TopicIDs. The instance stops forwarding / receiving on the disabled subscriptions; the configuration is preserved (re-enable with Enable Topic/s Subscription).
Idempotent for already-disabled subscriptions.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation DisableSubscriptions($input: DisableSubscriptionsRequest!) {
DisableSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"TopicIDs": ["{{integration_topic_id}}"]
}
}
Response
Same shape as Enable Topic/s Subscription.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation DisableSubscriptions($input: DisableSubscriptionsRequest!) {
DisableSubscriptions(input: $input) {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"TopicIDs": [
"{{integration_topic_id}}"
]
}
}
Response
Status: 200 OK
{
"data": {
"DisableSubscriptions": [
{
"TopicID": "A4919906-2639-4788-A544-0DC32C67A919",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "devicehub.alias.L1_Machine1_1_OPC.Downtime_Base",
"RemoteName": "",
"Config": "{}",
"Description": "Downtime_Base"
}
]
}
}
Remove Topic/s Subscription
POST {{edgeUrl}}/cc/v2
Remove Topic/s Subscription
Permanently deletes one or more subscriptions by TopicID. The configuration is gone; re-create via Create Subscription to restore.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation DeleteSubscriptions($input: DeleteSubscriptionsRequest!) {
DeleteSubscriptions(input: $input)
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"TopicIDs": ["{{integration_topic_id}}"]
}
}
Response
200 OK -- application/json. No data returned on success.
{ "data": { "DeleteSubscriptions": null } }
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation DeleteSubscriptions($input: DeleteSubscriptionsRequest!) {
DeleteSubscriptions(input: $input)
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"TopicIDs": ["{{integration_topic_id}}"]
}
}
Response
Status: 200 OK
{
"data": {
"DeleteSubscriptions": null
}
}
Download Topic Sample
POST {{edgeUrl}}/cc/v2
Download Topic Sample
Returns a sample CSV template showing the expected column layout for the instance's subscription import (Upload CSV). The sample has the header row plus one placeholder row -- use it as a skeleton when building a CSV from scratch in a spreadsheet.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
query DownloadTemplate($input: DownloadTemplateRequest!) {
DownloadTemplate(input: $input)
}
Variables
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
Response
200 OK -- application/json. data.DownloadTemplate is a CSV-formatted string -- parse client-side or write to a file.
{
"data": {
"DownloadTemplate": "InstanceInfo ID,InstanceInfo Name,Direction,Local Remote Topic,Remote Data Topic,Enable,Description\n\"<the instance id>\",\"<the instance name>\",Inbound/Outbound,<local-remote-topic>,<remote-data-topic>,true/false,<description>\n"
}
}
CSV columns
| Column | Maps to |
|---|---|
InstanceInfo ID |
InstanceID. |
InstanceInfo Name |
Cosmetic -- the service identifies by ID. |
Direction |
Inbound (= IsLocalToRemote: false) or Outbound (= true). |
Local Remote Topic |
LocalName. |
Remote Data Topic |
RemoteName. |
Enable |
true / false. |
Description |
Description. |
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
query DownloadTemplate($input: DownloadTemplateRequest!) {
DownloadTemplate(input: $input)
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"DownloadTemplate": "InstanceInfo ID,InstanceInfo Name,Direction,Local Remote Topic,Remote Data Topic,Enable,Description\n\"<the instance id, ie. 7b7628c4-a065-425e-9515-f8469d7a2c7f>\",\"<the instance name, ie. local mqtt>\",Inbound/Outbound,<local-remote-topic>,<remote-data-topic>,true/false,<description>\n"
}
}
Download CSV for Instance/s
POST {{edgeUrl}}/cc/v2
Download CSV for Instance/s
Exports the actual subscription list of one or more instances as a CSV string. Compatible with Upload CSV: download, edit in a spreadsheet, re-upload to apply.
Different from Download Topic Sample -- that endpoint returns a header-only skeleton with one placeholder row; this one returns the live data.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
query DownloadCSV($input: DownloadCSVRequest!) {
DownloadCSV(input: $input)
}
Variables
| Field | Type | Required | Description |
|---|---|---|---|
InstanceIDs |
[ID!]! |
Yes | UUIDs to include. Pass an array even for a single instance. |
{ "input": { "InstanceIDs": ["{{integration_instance_id}}"] } }
Response
200 OK -- application/json. data.DownloadCSV is a CSV string with the same columns as Download Topic Sample, one row per subscription.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
query DownloadCSV($input: DownloadCSVRequest!) {
DownloadCSV(input: $input)
}
Variables
{
"input": {
"InstanceIDs": [
"{{integration_instance_id}}"
]
}
}
Response
Status: 200 OK
{
"data": {
"DownloadCSV": "InstanceInfo ID,InstanceInfo Name,Direction,Local Remote Topic,Remote Data Topic,Enable,Description\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Temperature_PV,,false,Temperature_PV\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Level_PV,,false,Level_PV\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.QualityCode_Scrap_Min,,false,QualityCode_Scrap_Min\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.QualityCode,,false,QualityCode\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.FaultOccurrence_Factor,,false,FaultOccurrence_Factor\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.ReasonCode_Min,,false,ReasonCode_Min\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.SKU,,false,SKU\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.FaultCode,,false,FaultCode\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.ReasonCode_L2_Max,,false,ReasonCode_L2_Max\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.PartSize_TestResult,,false,PartSize_TestResult\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.BadPartInterval_Variation,,false,BadPartInterval_Variation\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.CycleTime_Base,,false,CycleTime_Base\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Step2,,false,Step2\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.FaultCode_Min_Value,,false,FaultCode_Min_Value\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.TaktTime_Base,,false,TaktTime_Base\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Step5,,false,Step5\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.FaultCode_L2,,false,FaultCode_L2\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Temperature_SP,,false,Temperature_SP\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Temperature_UpperControlLimit,,false,Temperature_UpperControlLimit\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.FaultCode_L2_Min_Value,,false,FaultCode_L2_Min_Value\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.ReasonCode,,false,ReasonCode\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.ReasonCode_L2_Min,,false,ReasonCode_L2_Min\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.isFaulted,,false,isFaulted\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.ReasonCode_Max,,false,ReasonCode_Max\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Temperature,,false,Temperature\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.PartMade,,false,PartMade\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Voltage,,false,Voltage\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.ReasonCode_L2,,false,ReasonCode_L2\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Level_SP,,false,Level_SP\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Speed,,false,Speed\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.isRunning,,false,isRunning\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.TaktTime_Variation_Factor,,false,TaktTime_Variation_Factor\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.BadPart,,false,BadPart\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Step1,,false,Step1\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Pressure_SP,,false,Pressure_SP\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.SerialNumber,,false,SerialNumber\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Step3,,false,Step3\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Pressure,,false,Pressure\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.BadPartInterval_Base,,false,BadPartInterval_Base\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Pressure_PV,,false,Pressure_PV\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Current,,false,Current\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.CycleTime_Variation_Factor,,false,CycleTime_Variation_Factor\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.FaultCode_Max_Value,,false,FaultCode_Max_Value\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.FaultCode_L2_Max_Value,,false,FaultCode_L2_Max_Value\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Uptime_Base,,false,Uptime_Base\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Temperature_LowerControlLimit,,false,Temperature_LowerControlLimit\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Downtime_Variation_Factor,,false,Downtime_Variation_Factor\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.GoodPart,,false,GoodPart\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.QualityCode_Scrap_Max,,false,QualityCode_Scrap_Max\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Uptime_Variation_Factor,,false,Uptime_Variation_Factor\n75d68c24-b8c3-47b5-ae08-5a30cbd7751f,Azure,outbound,devicehub.alias.L1_Machine1_1_OPC.Step4,,false,Step4\n"
}
}
Import Topics
POST {{edgeUrl}}/cc/v2
Import Topics
Bulk-imports topics from other LE services (DeviceHub registers, Digital Twins instances, Analytics outputs) into one instance as subscriptions. This is the API equivalent of the LE UI's "Pick from DeviceHub / Digital Twins / Analytics" buttons.
Each section in the body addresses one source service and lists (ParentID, ChildIDs) pairs -- the parent is the device / instance / group, the children are the specific registers / attributes / topics to import.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation ImportTopics($input: ImportTopicsRequest!) {
ImportTopics(input: $input) {
DeviceHub { ImportedTags UpdatedTags SkippedTags Error }
DigitalTwins { ImportedTags UpdatedTags SkippedTags Error }
Analytics { ImportedTags UpdatedTags SkippedTags Error }
}
}
Variables
| Field | Type | Required | Description |
|---|---|---|---|
InstanceID |
ID! |
Yes | Target Integration instance. |
DeviceHub[].ParentID |
ID |
No | DeviceHub device UUID. ChildIDs: [] to import every register on the device. |
DeviceHub[].ChildIDs |
[ID!]! |
No | Register UUIDs to import from that device. |
DigitalTwins[] |
object[] | No | Same shape, with ParentID = Instance UUID, ChildIDs = dynamic-attribute UUIDs. |
Analytics[] |
object[] | No | ParentID = group name. (No ChildIDs for analytics -- imports all outputs of the group.) |
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"DeviceHub": [
{ "ParentID": "{{deviceID}}", "ChildIDs": ["{{register_id}}"] }
],
"Analytics": [
{ "ParentID": "{{analytics_group_name}}" }
]
}
}
Response
200 OK -- application/json. Per-source counters:
| Field | Type | Description |
|---|---|---|
data.ImportTopics.DeviceHub.ImportedTags |
integer | Newly created subscriptions. |
data.ImportTopics.DeviceHub.UpdatedTags |
integer | Subscriptions already present and refreshed. |
data.ImportTopics.DeviceHub.SkippedTags |
integer | Subscriptions skipped (typically duplicates). |
data.ImportTopics.DeviceHub.Error |
string[] | Per-tag error messages. |
{
"data": {
"ImportTopics": {
"DeviceHub": { "ImportedTags": 1, "UpdatedTags": 0, "SkippedTags": 0, "Error": [] },
"DigitalTwins": { "ImportedTags": 1, "UpdatedTags": 0, "SkippedTags": 0, "Error": [] },
"Analytics": { "ImportedTags": 1, "UpdatedTags": 0, "SkippedTags": 0, "Error": [] }
}
}
}
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation ImportTopics($input: ImportTopicsRequest!) {
ImportTopics(input: $input) {
DeviceHub {
ImportedTags
UpdatedTags
SkippedTags
Error
}
DigitalTwins {
ImportedTags
UpdatedTags
SkippedTags
Error
}
Analytics {
ImportedTags
UpdatedTags
SkippedTags
Error
}
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"DeviceHub": [
{
"ParentID": "{{deviceID}}",
"ChildIDs": [
"{{register_id}}"
]
}
],
"Analytics": [
{
"ParentID": "{{analytics_group_name}}"
}
],
"DigitalTwins": [
{
"ParentID": "{{digital_twins_model_id}}",
"ChildIDs": [
"{{digital_twins_instance_id}}"
]
}
]
}
}
Response
Status: 200 OK
{
"data": {
"ImportTopics": {
"DeviceHub": {
"ImportedTags": 1,
"UpdatedTags": 0,
"SkippedTags": 0,
"Error": []
},
"DigitalTwins": {
"ImportedTags": 1,
"UpdatedTags": 0,
"SkippedTags": 0,
"Error": []
},
"Analytics": {
"ImportedTags": 1,
"UpdatedTags": 0,
"SkippedTags": 0,
"Error": []
}
}
}
}
Enable All Topics
POST {{edgeUrl}}/cc/v2
Enable All Topics
Enables every subscription on one instance in a single call. Useful after a bulk import.
Idempotent.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation EnableAllTopics($input: EnableAllTopicsRequest!) {
EnableAllTopics(input: $input)
}
Variables
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
Response
200 OK -- application/json. No data returned on success.
{ "data": { "EnableAllTopics": null } }
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation EnableAllTopics($input: EnableAllTopicsRequest!) {
EnableAllTopics(input: $input)
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"EnableAllTopics": null
}
}
Disable All Topics
POST {{edgeUrl}}/cc/v2
Disable All Topics
Disables every subscription on one instance. The configuration is preserved; re-enable individually via Enable Topic/s Subscription or all at once via Enable All Topics.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation DisableAllTopics($input: DisableAllTopicsRequest!) {
DisableAllTopics(input: $input)
}
Variables
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
Response
200 OK -- application/json. No data returned on success.
{ "data": { "DisableAllTopics": null } }
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation DisableAllTopics($input: DisableAllTopicsRequest!) {
DisableAllTopics(input: $input)
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"DisableAllTopics": null
}
}
Delete All Topics
POST {{edgeUrl}}/cc/v2
Delete All Topics
Permanently deletes every subscription on one instance. The instance configuration itself is preserved (use Delete Instance to remove the instance too).
Destructive. Export with
Download CSV for Instance/sfirst if you may want to restore.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation DeleteAllTopics($input: DeleteAllTopicsRequest!) {
DeleteAllTopics(input: $input)
}
Variables
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
Response
200 OK -- application/json. No data returned on success.
{ "data": { "DeleteAllTopics": null } }
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation DeleteAllTopics($input: DeleteAllTopicsRequest!) {
DeleteAllTopics(input: $input)
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"DeleteAllTopics": null
}
}
Upload CSV
POST {{edgeUrl}}/cc/v2
Upload CSV
Imports subscriptions from a CSV file. Multipart form-data following the GraphQL multipart request spec.
The CSV format must match what Download Topic Sample / Download CSV for Instance/s produces. A typical round-trip:
Download CSV for Instance/s-> grab the current subscriptions.- Edit in a spreadsheet (add/remove rows, change
RemoteName, toggleEnable). Upload CSV-> apply.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: multipart/form-data
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body (form-data parts)
| Form key | Type | Description |
|---|---|---|
operations |
text | GraphQL envelope (see below) with a null placeholder where the file should go. |
map |
text | JSON mapping form file keys to placeholder locations within operations. |
1 |
file | The CSV file. |
operations value
{
"operationName": "UploadCSV",
"variables": { "input": { "InstanceID": "{{integration_instance_id}}", "File": null } },
"query": "mutation UploadCSV($input: UploadCSVRequest!) { UploadCSV(input: $input) { Errors { Line Column Error } } }"
}
map value
{ "1": ["variables.input.File"] }
Response
200 OK -- application/json
| Field | Type | Description |
|---|---|---|
data.UploadCSV.Errors |
[CSVError!]! |
One entry per error row. Empty array means clean import. |
data.UploadCSV.Errors[].Line |
integer (nullable) | 1-indexed CSV line number, or null for summary entries. |
data.UploadCSV.Errors[].Column |
integer (nullable) | 1-indexed column, or null. |
data.UploadCSV.Errors[].Error |
string | Error message. |
{ "data": { "UploadCSV": { "Errors": [] } } }
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
Response
Status: 200 OK
{
"data": {
"UploadCSV": {
"Errors": [],
"__typename": "UploadCSVResponse"
}
}
}
List Subscriptions with Paging and Filter
POST {{edgeUrl}}/cc/v2
List Subscriptions with Paging and Filter
Lists an instance's topics a page at a time, optionally filtered. This is what the UI's topic table uses; prefer it over List Instance Subscriptions for instances with many topics, which that query returns in one response.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
query ListSubscriptionsWithPagingAndFilter($input: ListSubscriptionsWithPagingAndFilterRequest!) {
ListSubscriptionsWithPagingAndFilter(input: $input) {
Subscriptions {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
TotalCount
Last
}
}
Variables (input: ListSubscriptionsWithPagingAndFilterRequest!)
| Field | Type | Required | Description |
|---|---|---|---|
InstanceID |
UUID! |
Yes | Instance whose topics to list. |
Limit |
Int |
No | Page size. Omit to return every matching topic. |
SkipCount |
Int |
No | Number of matching topics to skip. Page n (from 0) is n * Limit. |
FilterOptions |
[SubscriptionFilterOptionRequest] |
No | Filters, all of which must match. |
Each filter:
| Field | Type | Required | Description |
|---|---|---|---|
Field |
SubscriptionFilterOptionFieldNameEnum! |
Yes | TOPIC_ID, ENABLED, LOCAL_NAME, REMOTE_NAME, DESCRIPTION, IS_LOCAL_TO_REMOTE or CONFIG. |
SearchOption |
SubscriptionFilterPatternOptionsEnum! |
Yes | CONTAINS, EQUAL_TO, NOT_EQUAL or REGEX. |
FilterValue |
String! |
Yes | Value or pattern to match. |
ConfigField |
String |
No | Key inside the topic's Config JSON, used with Field: CONFIG. |
IsCaseSensitive |
Boolean |
No | Deprecated. Sending it at all, true or false, fails with deprecated filter option; omit it. |
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"Limit": 2,
"SkipCount": 0,
"FilterOptions": [
{ "Field": "REMOTE_NAME", "SearchOption": "REGEX", "FilterValue": "^plant/line[13]$" }
]
}
}
Response
200 OK -- application/json. data.ListSubscriptionsWithPagingAndFilter:
| Field | Type | Description |
|---|---|---|
Subscriptions |
[Topic!]! |
The page of topics, same shape as List Instance Subscriptions. |
TotalCount |
Int! |
Number of topics matching the filters, across all pages. |
Last |
Boolean! |
true when this page reaches the end of the matches. |
Keep requesting with SkipCount increased by Limit until Last is true. The example response is the first page of an instance with three topics and Limit: 2.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
query ListSubscriptionsWithPagingAndFilter($input: ListSubscriptionsWithPagingAndFilterRequest!) {
ListSubscriptionsWithPagingAndFilter(input: $input) {
Subscriptions {
TopicID
IsLocalToRemote
Enabled
LocalName
RemoteName
Config
Description
}
TotalCount
Last
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"Limit": 2,
"SkipCount": 0,
"FilterOptions": []
}
}
Response
Status: 200 OK
{
"data": {
"ListSubscriptionsWithPagingAndFilter": {
"Subscriptions": [
{
"TopicID": "2ABE8221-67A6-49FC-B185-423B485945F8",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "apidocs/backfill/line1",
"RemoteName": "plant/line1",
"Config": "{}",
"Description": ""
},
{
"TopicID": "C5B1EB6B-C86B-4A90-8F28-0C4EC3AE4B53",
"IsLocalToRemote": true,
"Enabled": false,
"LocalName": "apidocs/backfill/line2",
"RemoteName": "plant/line2",
"Config": "{}",
"Description": ""
}
],
"TotalCount": 3,
"Last": false
}
}
}
Get Stats
POST {{edgeUrl}}/cc/v2
Get Stats (subscription)
Streams per-instance runtime statistics in real time: messages sent, dropped, live, persisted, and on-disk size. This is a GraphQL subscription -- a one-shot POST returns at most a single event. For continuous streaming, use a WebSocket transport (graphql-ws / subscriptions-transport-ws).
Transport
WebSocket: wss://{{edgeHost}}/cc/v2. The Postman item is shown as a POST for documentation; switch to a Postman WebSocket request when actually streaming.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Subscription body
subscription GetStats {
GetStats(input: { Metrics: null, Tags: null, GroupByInMSec: null, BeginShiftSec: null }) {
Columns
Values
}
}
Variables (input: GetStatsRequest!)
| Field | Type | Required | Description |
|---|---|---|---|
Metrics |
[String!]? |
No | Filter to specific metric names (e.g. ["field_SentCount"]). null returns all. |
Tags |
object? | No | Tag filter (e.g. by instance ID). |
GroupByInMSec |
Int? |
No | Aggregation bucket in milliseconds. |
BeginShiftSec |
Int? |
No | Window size in seconds. |
Passing null for all fields uses the LE UI's defaults (1-second buckets, last few minutes).
Event shape
Each event carries a Columns array and a Values array of rows, the same shape used by the /sysinfo/* REST endpoints.
{
"data": {
"GetStats": {
"Columns": [
"time",
"field_DiskUsageSize",
"field_DropCount",
"field_LiveCount",
"field_SentCount",
"field_PersistenceSize"
],
"Values": [
["2025-09-12T00:08:54Z", 0, 0, 0, 0, 0]
]
}
}
}
Metric reference
| Metric | Description |
|---|---|
field_SentCount |
Messages successfully forwarded to the upstream system. |
field_DropCount |
Messages dropped (typically because the persistence layer overflowed). |
field_LiveCount |
Messages currently in flight (sent but unacknowledged). |
field_PersistenceSize |
Messages currently queued in the persistence layer. |
field_DiskUsageSize |
Bytes on disk used by the persistence layer. |
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
subscription GetStats {
GetStats(
input: { Metrics: null, Tags: null, GroupByInMSec: null, BeginShiftSec: null }
) {
Columns
Values
}
}
Response
Status: 200 OK
{
"data": {
"GetStats": {
"Columns": [
"time",
"field_DiskUsageSize",
"field_DropCount",
"field_LiveCount",
"field_SentCount",
"field_PersistenceSize"
],
"Values": [
[
"2025-09-12T00:08:54Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:08:55Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:08:56Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:08:57Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:08:58Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:08:59Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:00Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:01Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:02Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:03Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:04Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:05Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:06Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:07Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:08Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:09Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:10Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:11Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:12Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:13Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:14Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:15Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:16Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:17Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:18Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:19Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:20Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:21Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:22Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:23Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:24Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:25Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:26Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:27Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:28Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:29Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:30Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:31Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:32Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:33Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:34Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:35Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:36Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:37Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:38Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:39Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:40Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:41Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:42Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:43Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:44Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:45Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:46Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:47Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:48Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:49Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:50Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:51Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:52Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:53Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:54Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:55Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:56Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:57Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:58Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:09:59Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:00Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:01Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:02Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:03Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:04Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:05Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:06Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:07Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:08Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:09Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:10Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:11Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:12Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:13Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:14Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:15Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:16Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:17Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:18Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:19Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:20Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:21Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:22Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:23Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:24Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:25Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:26Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:27Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:28Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:29Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:30Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:31Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:32Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:33Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:34Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:35Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:36Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:37Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:38Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:39Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:40Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:41Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:42Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:43Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:44Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:45Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:46Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:47Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:48Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:49Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:50Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:51Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:52Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:53Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:54Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:55Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:56Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:57Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:58Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:10:59Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:00Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:01Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:02Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:03Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:04Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:05Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:06Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:07Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:08Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:09Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:10Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:11Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:12Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:13Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:14Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:15Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:16Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:17Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:18Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:19Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:20Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:21Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:22Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:23Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:24Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:25Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:26Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:27Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:28Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:29Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:30Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:31Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:32Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:33Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:34Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:35Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:36Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:37Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:38Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:39Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:40Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:41Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:42Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:43Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:44Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:45Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:46Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:47Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:48Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:49Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:50Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:51Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:52Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:53Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:54Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:55Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:56Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:57Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:58Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:11:59Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:00Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:01Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:02Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:03Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:04Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:05Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:06Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:07Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:08Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:09Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:10Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:11Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:12Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:13Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:14Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:15Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:16Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:17Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:18Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:19Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:20Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:21Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:22Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:23Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:24Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:25Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:26Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:27Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:28Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:29Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:30Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:31Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:32Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:33Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:34Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:35Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:36Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:37Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:38Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:39Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:40Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:41Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:42Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:43Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:44Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:45Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:46Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:47Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:48Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:49Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:50Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:51Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:52Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:53Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:54Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:55Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:56Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:57Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:58Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:12:59Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:00Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:01Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:02Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:03Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:04Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:05Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:06Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:07Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:08Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:09Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:10Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:11Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:12Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:13Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:14Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:15Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:16Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:17Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:18Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:19Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:20Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:21Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:22Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:23Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:24Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:25Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:26Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:27Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:28Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:29Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:30Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:31Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:32Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:33Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:34Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:35Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:36Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:37Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:38Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:39Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:40Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:41Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:42Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:43Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:44Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:45Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:46Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:47Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:48Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:49Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:50Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:51Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:52Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:53Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:54Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:55Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:56Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:57Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:58Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:13:59Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:00Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:01Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:02Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:03Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:04Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:05Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:06Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:07Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:08Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:09Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:10Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:11Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:12Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:13Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:14Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:15Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:16Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:17Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:18Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:19Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:20Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:21Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:22Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:23Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:24Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:25Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:26Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:27Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:28Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:29Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:30Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:31Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:32Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:33Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:34Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:35Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:36Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:37Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:38Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:39Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:40Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:41Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:42Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:43Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:44Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:45Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:46Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:47Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:48Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:49Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:50Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:51Z",
0,
0,
0,
0,
0
],
[
"2025-09-12T00:14:52Z",
0,
0,
0,
0,
0
]
]
}
}
}
List Instances
POST {{edgeUrl}}/cc/v2
Updated in 4.2.x. Instance gained ExecCommandEnabled: Boolean, reporting whether the instance is permitted to run commands received over the integration.
It sits alongside TagSyncEnabled as a per-instance capability flag. Treat a null as 'not applicable to this provider' rather than as false.
Additive: queries that do not select it behave as in 4.1.x.
Request Body
GraphQL Query
query ListInstances($input: ListInstancesRequest) {
ListInstances(input: $input) {
InstanceID
ProviderID
ProviderName
Enabled
ErrorLogging
TagSyncEnabled
ExecCommandEnabled
System
Online
Status
SizeOnDisk
ErrCode
ErrMsg
}
}
Variables
{
"input": {
"Limit": 50,
"SkipCount": 0
}
}
Delete Instance
POST {{edgeUrl}}/cc/v2
Delete Instance
Also deletes: the instance's subscriptions. There is no need to delete them first.
Deletes a single Integration instance. The instance's queued messages (in its persistence layer) are also discarded -- if you want to flush them upstream first, ensure the instance is Online and Enabled before deleting, or clear them explicitly with Clear Persistence Layer.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation DeleteInstance($input: DeleteInstanceRequest!) {
DeleteInstance(input: $input)
}
Variables
| Field | Type | Required | Description |
|---|---|---|---|
InstanceID |
ID! |
Yes | UUID of the instance to delete. |
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
Response
200 OK -- application/json. No data returned on success.
{ "data": { "DeleteInstance": null } }
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation DeleteInstance($input: DeleteInstanceRequest!) {
DeleteInstance(input: $input)
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"DeleteInstance": null
}
}
Update Instance
POST {{edgeUrl}}/cc/v2
Updated in 4.1.x. Added ProviderName to the Instance selection set.
Request Body
GraphQL Query
mutation UpdateInstance($input: UpdateInstanceRequest!) {
UpdateInstance(input: $input) {
InstanceID
ProviderID
ProviderName
Config
Enabled
ErrorLogging
TagSyncEnabled
System
Online
Status
SizeOnDisk
ErrCode
ErrMsg
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}",
"ErrorLogging": false,
"Config": "{\"name\":\"Updated Instance Name\"}"
}
}
Response
Status: 200 OK
{
"data": {
"UpdateInstance": {
"InstanceID": "19AEA71E-C750-4968-B2FC-0B27D79064D6",
"ProviderID": "mssql",
"Config": "{\"bulkSize\":0,\"commitTimeout\":1000,\"createTable\":false,\"database\":\"litmus\",\"hostname\":\"172.172.0.1\",\"mapping\":{\"SKU\":\"{{.SKU}}\",\"asset\":\"{{.asset}}\",\"comment\":\"{{.comment}}\",\"line\":\"{{.line}}\",\"plant\":\"{{.plant}}\",\"scrapCode\":\"{{.scrapCode}}\",\"scrapCode_text\":\"{{.scrapCode_text}}\",\"scrapTime\":\"{{.scrapTime}}\",\"shift\":\"{{.shift}}\"},\"maxTransactionSize\":100,\"name\":\"Insert Scrap History\",\"password\":\"\\u003cprotected\\u003e\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"port\":1433,\"queueMode\":\"lifo\",\"table\":\"scrapHistory\",\"throttlingLimit\":0,\"username\":\"sa\",\"workersCount\":1}",
"Enabled": true,
"ErrorLogging": false,
"TagSyncEnabled": false,
"System": false,
"Online": false,
"Status": "FAILED",
"SizeOnDisk": 0,
"ErrCode": "CONNECTION_LOST",
"ErrMsg": "unable to open tcp connection with host '172.172.0.1:1433': dial tcp 172.172.0.1:1433: connect: connection refused"
}
}
}
Clear Persistence Layer
POST {{edgeUrl}}/cc/v2
Clear Persistence Layer
Flushes the persistence layer of one instance -- the local queue of buffered messages that have not yet been delivered upstream. The mutation returns the number of KB reclaimed.
Use this to recover from a stuck instance whose persistence layer has grown unbounded (visible as a high SizeOnDisk in List Instances), or when you have changed the upstream's schema and the buffered messages are no longer valid.
Destructive: cleared messages are lost. Confirm you don't need to flush upstream before calling.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
mutation ClearInstancePersistenceLayer($input: ClearInstancePersistenceLayerRequest!) {
ClearInstancePersistenceLayer(input: $input) {
CleanUpSizeKb
}
}
Variables
| Field | Type | Required | Description |
|---|---|---|---|
InstanceID |
ID! |
Yes | UUID of the instance. |
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
Response
200 OK -- application/json
| Field | Type | Description |
|---|---|---|
data.ClearInstancePersistenceLayer.CleanUpSizeKb |
integer | KB reclaimed from the persistence layer. |
{ "data": { "ClearInstancePersistenceLayer": { "CleanUpSizeKb": 0 } } }
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
mutation ClearInstancePersistenceLayer($input: ClearInstancePersistenceLayerRequest!) {
ClearInstancePersistenceLayer(input: $input) {
CleanUpSizeKb
}
}
Variables
{
"input": {
"InstanceID": "{{integration_instance_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"ClearInstancePersistenceLayer": {
"CleanUpSizeKb": 0
}
}
}
Subscribe to Instance Status
POST {{edgeUrl}}/cc/v2
New in 4.1.x. WebSocket subscription. Response gains InstanceState enum (Enabled | Disabled). Convert to a WebSocket request after import (URL: wss://.../cc/v2).
Request Body
GraphQL Query
subscription GetInstanceStatus($input: GetInstanceStatusRequest!) {
GetInstanceStatus(input: $input) {
ID
Status
StatusCode
StatusCodeType
ErrCode
ErrMsg
SizeOnDisk
InstanceState
}
}
Variables
{
"input": {
"InstanceIDs": [
"{{integration_instance_id}}"
]
}
}
Get Instance
POST {{edgeUrl}}/cc/v2
Updated in 4.2.x. Same ExecCommandEnabled addition as on ListInstances.
Config is the provider configuration as a JSON string. After upgrading an instance off a retired provider, re-read it here to confirm the new connectionType value landed.
Request Body
GraphQL Query
query GetInstance($input: GetInstanceRequest!) {
GetInstance(input: $input) {
InstanceID
ProviderID
ProviderName
Config
Enabled
ErrorLogging
TagSyncEnabled
ExecCommandEnabled
System
Online
Status
SizeOnDisk
ErrCode
ErrMsg
}
}
Variables
{
"input": {
"InstanceID": "{{cc_instance_id}}"
}
}
Get Provider Schema
POST {{edgeUrl}}/cc/v2
Updated in 4.4.x. This item replaces its 4.3.x counterpart.
Each property's Value gains Required: Boolean, so whether a property is required is now stated on the property itself. OneOf[].Required, the list of required keys on ProviderSchema.OneOf (type Config), is deprecated in its favour: it still works, but read the per-property flag in new code.
Otherwise unchanged. The query returns the description of a provider's configuration: every property, its type, default, allowed values, and whether it is protected, read-only or required.
This is still the reliable way to discover the exact Config shape a provider expects, rather than copying a config between versions or between providers.
Request Body
GraphQL Query
query GetProviderSchema($input: GetProviderInfoRequest!) {
GetProviderSchema(input: $input) {
ID
Type
IsExperimental
Properties {
Key
Value {
Type Default Enum Label ToolTip
Protected ReadOnly Advanced AllowEmpty Required
Minimum Maximum MinLength MaxLength
}
}
OneOf { Required Order }
LimitDataDirectionScope
}
}
Variables
{
"input": {
"ProviderID": "{{cc_provider_id}}"
}
}
List Providers
POST {{edgeUrl}}/cc/v2
Updated in 4.3.x. This item replaces its 4.2.x counterpart.
New in 4.3.x: IsExperimental: Boolean! marks a provider Litmus ships for evaluation rather than production. It is non-null, so every provider carries an explicit true or false and there is no 'unknown' state to handle. Surface it wherever you present a provider picker, so an operator is not choosing an experimental integration without knowing it.
| Field | Meaning |
|---|---|
ID |
ProviderID. The value every instance operation expects |
Name |
Display name. Do not key on it, it can change between releases |
Logo |
Provider logo |
Hidden |
Provider is not offered in the UI picker |
IsExperimental |
New in 4.3.x. Shipped for evaluation, not production |
Hidden and IsExperimental are independent: an experimental provider is still listed and selectable unless it is also hidden. Filter on both if you are building a production-only picker.
This query remains the right way to resolve a ProviderID at runtime rather than pinning a UUID in client code.
Request Body
GraphQL Query
query ListProviders {
ListProviders {
ID
Name
Logo
Hidden
IsExperimental
}
}
List Providers Grouped
POST {{edgeUrl}}/cc/v2
Updated in 4.3.x. This item replaces its 4.2.x counterpart.
GroupedProvider gains IsExperimental: Boolean!, the same flag ListProviders returns.
New in 4.3.x: IsExperimental: Boolean! marks a provider Litmus ships for evaluation rather than production. It is non-null, so every provider carries an explicit true or false and there is no 'unknown' state to handle. Surface it wherever you present a provider picker, so an operator is not choosing an experimental integration without knowing it.
Note the flag is on the nested Providers entries, not on the ProviderGroup itself: a group can hold a mix of production and experimental providers, so there is no group-level answer to read instead.
Use this form when you are rendering the provider catalogue by category and ListProviders when you just need to resolve one ID.
Request Body
GraphQL Query
query ListProvidersGrouped {
ListProvidersGrouped {
ID
Name
Logo
Providers {
ID
Name
Logo
Hidden
IsExperimental
}
}
}
Get Provider Description
POST {{edgeUrl}}/cc/v2
Get Provider Description
Returns a provider's documentation as one Markdown string: an overview, supported versions, which directions it supports (outbound from the edge, inbound to the edge), and a table of its configuration settings. This is the text the UI shows beside the configuration form when you add an integration.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
query GetProviderDescription($input: GetProviderInfoRequest!) {
GetProviderDescription(input: $input)
}
Variables (input: GetProviderInfoRequest!)
| Field | Type | Required | Description |
|---|---|---|---|
ProviderID |
String! |
Yes | Provider to describe. Take it from List Providers. |
{
"input": {
"ProviderID": "{{integration_provider_id}}"
}
}
Response
200 OK -- application/json. data.GetProviderDescription is a String! holding Markdown, with \n line breaks. Render it as Markdown; it is not structured data. For the machine-readable configuration fields, use Provider Schemas - Reference (GetProviderSchema).
An unknown ID returns provider id "<id>": provider not found.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
query GetProviderDescription($input: GetProviderInfoRequest!) {
GetProviderDescription(input: $input)
}
Variables
{
"input": {
"ProviderID": "{{integration_provider_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"GetProviderDescription": "Overview\n--------\n\nNATS Integration enables Edge System to connect to NATS server.\n\nSupported Communication\n-----------------------\n\n* Outbound (Publish data from Edge to NATS server) - Yes\n\n* Inbound (Subscribe data from NATS Server to Edge) - Yes\n\n\nConfigurations\n--------------\n\n| **Variable** | **Detail** | **Required** |\n| --- | --- | --- |\n| Name | Connector Name | Yes |\n| Hostname | NATS server host name | Yes |\n| Port | NATS server port | Yes |\n| NATS username | NATS username, which is part of the client's authentication credentials. | No |\n| NATS password | NATS password, which is part of the client's authentication credentials. | No |\n| Default topic name | Default topic for publishing | Yes |\n| Enable TLS secure connection | If enabled, message are transmitted securely. This certificate ensures that data transmitted between the server and clients is encrypted and secure, safeguarding it from unauthorized access and eavesdropping. | No |\n| Insecure skip verify | If enabled, the verification of the server's certificate and hostname is skipped. | No |\n| Throttling limit | Set a limit on the number of outbound messages per second. If sending data to a server that has restrictions on the rate of incoming messages, this ensures that no messages are lost. | No |\n| Persistent storage | If enabled, messages in the outbound queue are stored on disk. If there are interruptions in connection or power loss, messages will be retained and eventually sent when the connection is restored. | No |\n| Queue mode | Select the sequence of data transfer: FIFO or LIFO. Selecting FIFO (First In First Out) will send the earliest message first. Selecting LIFO (Last In First Out) will send the latest message first. | No |\n\nCompatibility Validation\n------------------------\n\nThis information is just for reference. More products and versions may be supported.\n\n| **Product** | **Version** | **Date** |\n| --- | --- | --- |\n| N/A | N/A | N/A |"
}
}
Get Provider Tag Schema
POST {{edgeUrl}}/cc/v2
Get Provider Tag Schema
Returns the per-topic settings a provider accepts, separately for outbound and inbound topics. These are the extra fields the UI shows when you add a topic to an instance, and they end up in the topic's Config JSON string (see Create Subscription). For MQTT providers, for example, it is the per-topic QoS.
Many providers have no per-topic settings and return two empty arrays.
Endpoint
POST {{edgeUrl}}/cc/v2
Content-Type: application/json
The operation is chosen by the GraphQL query body, not the URL path.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.
Request body
query GetProviderTagSchema($input: GetProviderInfoRequest!) {
GetProviderTagSchema(input: $input) {
Inbound { Type TagType FieldId Label Tooltip DefaultValue TagDefaultValue Enum TagEnum Example }
Outbound { Type TagType FieldId Label Tooltip DefaultValue TagDefaultValue Enum TagEnum Example }
}
}
Variables (input: GetProviderInfoRequest!)
| Field | Type | Required | Description |
|---|---|---|---|
ProviderID |
String! |
Yes | Provider to read. Take it from List Providers. |
Response
200 OK -- application/json. data.GetProviderTagSchema has Inbound (topics with IsLocalToRemote: false) and Outbound (topics with IsLocalToRemote: true), each a list of fields:
| Field | Type | Description |
|---|---|---|
FieldId |
String! |
Key to use inside the topic's Config JSON. |
TagType |
TagSchemaType! |
Integer, String, Boolean or TextBox. |
Type |
String |
Underlying JSON type, e.g. string. |
Label |
String |
Form label. |
Tooltip |
String |
Help text. |
DefaultValue |
String |
Default as a string. |
TagDefaultValue |
Any |
Default in its native type. |
Enum |
[String] |
Allowed values as strings, when the field is a choice. |
TagEnum |
[Any] |
Allowed values in their native type. |
Example |
String |
Example value, often empty. |
An unknown ID returns provider id "<id>": provider not found.
Errors
GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:
{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code |
Meaning |
|---|---|
UNAUTHENTICATED |
Missing or invalid API token. |
FORBIDDEN |
Token lacks permission for this operation. |
BAD_USER_INPUT |
Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.). |
NOT_FOUND |
The targeted entity does not exist. |
INTERNAL_SERVER_ERROR |
DeviceHub fault. Retry, then escalate via System > Support. |
A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
GraphQL Query
query GetProviderTagSchema($input: GetProviderInfoRequest!) {
GetProviderTagSchema(input: $input) {
Inbound {
Type
TagType
FieldId
Label
Tooltip
DefaultValue
TagDefaultValue
Enum
TagEnum
Example
}
Outbound {
Type
TagType
FieldId
Label
Tooltip
DefaultValue
TagDefaultValue
Enum
TagEnum
Example
}
}
}
Variables
{
"input": {
"ProviderID": "{{integration_provider_id}}"
}
}
Response
Status: 200 OK
{
"data": {
"GetProviderTagSchema": {
"Inbound": [
{
"Type": "string",
"TagType": "String",
"FieldId": "qos",
"Label": "Qos",
"Tooltip": "Qos",
"DefaultValue": "default",
"TagDefaultValue": "default",
"Enum": [
"default",
"0",
"1",
"2"
],
"TagEnum": [
"default",
"0",
"1",
"2"
],
"Example": ""
}
],
"Outbound": [
{
"Type": "string",
"TagType": "String",
"FieldId": "qos",
"Label": "Qos",
"Tooltip": "Qos",
"DefaultValue": "default",
"TagDefaultValue": "default",
"Enum": [
"default",
"0",
"1",
"2"
],
"TagEnum": [
"default",
"0",
"1",
"2"
],
"Example": ""
}
]
}
}
}
Create Instance (REST)
POST {{edgeUrl}}/cc/instances
Create Instance (REST)
Creates an Integration instance through the service's REST API instead of the GraphQL CreateInstance mutation. It takes the same provider ID and configuration and returns the new instance. GET {{edgeUrl}}/cc/instances (Dashboard > Number of Integrations) lists instances in the same shape. Manage the instance afterwards with the GraphQL calls in this folder (Get Instance, Update Instance, Delete Instance).
Endpoint
POST {{edgeUrl}}/cc/instances
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
providerId |
string | Yes | Provider ID from List Providers. 4.0.x uses slugs such as generic-mqtt-tcp; later releases use UUIDs. |
config |
string | Yes | Provider configuration as a JSON-encoded string. Must contain name; the other keys follow Get Provider Description / the provider schema. |
enabled |
boolean | No | Start the instance right away. Default false. |
errorLogging |
boolean | No | Error logging flag, as in CreateInstance. |
Response
200 OK -- application/json. The instance, with lower-camel-case keys (the GraphQL API uses InstanceID, ProviderID, ...). Secrets in config come back as <protected>.
| Field | Type | Description |
|---|---|---|
instanceId |
string | New instance ID. |
providerId |
string | Provider ID. |
config |
string | Stored configuration, JSON-encoded. |
enabled |
boolean | Running state requested. |
errorLogging |
boolean | Error logging flag. |
tagSyncEnabled |
boolean | Tag sync flag. |
system |
boolean | true for instances the device created itself. |
online |
boolean | Connected to the target. |
status |
string | DISABLED for an instance created with enabled: false. |
sizeOnDisk |
integer | Persistence layer size in bytes. |
Errors
| HTTP status | Body / when it happens |
|---|---|
400 Bad Request |
{"Msg":"provider id \"<id>\": provider not found"}: unknown or missing providerId. |
400 Bad Request |
{"Msg":"name field not found in config value not exists"}: config has no name. |
401 Unauthorized |
Missing or invalid API token. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
{
"providerId": "generic-mqtt-tcp",
"config": "{\"name\": \"My MQTT Integration\", \"hostname\": \"192.168.1.100\", \"port\": 1883, \"clientId\": \"edge-mqtt-1\", \"username\": \"admin\", \"password\": \"password\", \"qos\": 1, \"workersCount\": 100, \"topic\": \"integration/data\", \"throttlingLimit\": 0, \"persistentStorage\": false, \"queueMode\": \"lifo\", \"plSizeLimitMB\": 1024, \"plSizeLimitGB\": 1}",
"enabled": false,
"errorLogging": false
}
Response
Status: 200 OK
{
"instanceId": "812719a5-32dc-46ac-83a7-56dfd4e90808",
"providerId": "generic-mqtt-tcp",
"config": "{\"clientId\":\"edge-mqtt-1\",\"hostname\":\"192.168.1.100\",\"name\":\"My MQTT Integration\",\"password\":\"<protected>\",\"persistentStorage\":false,\"plSizeLimitGB\":1,\"plSizeLimitMB\":1024,\"port\":1883,\"qos\":1,\"queueMode\":\"lifo\",\"throttlingLimit\":0,\"topic\":\"integration/data\",\"username\":\"admin\",\"workersCount\":100}",
"enabled": false,
"errorLogging": false,
"tagSyncEnabled": true,
"system": false,
"online": false,
"status": "DISABLED",
"sizeOnDisk": 0
}