# LitmusEdge 4.0.x API Documentation/Integration/Streaming - LE, LEM, LUNS API Docs

## 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

```http
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

```graphql
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.                        |

```json
{ "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.                     |

```json
{
  "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:

```json
{ "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**

```graphql
query ListSubscriptions($input: ListSubscriptionsRequest!) {
    ListSubscriptions(input: $input) {
        TopicID
        IsLocalToRemote
        Enabled
        LocalName
        RemoteName
        Config
        Description
    }
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}"
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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

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

```http
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

```graphql
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.                                            |

```json
{
  "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 `TopicID`s.

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
mutation CreateSubscriptions($input: CreateSubscriptionsRequest!) {
    CreateSubscriptions(input: $input) {
        TopicID
        IsLocalToRemote
        Enabled
        LocalName
        RemoteName
        Config
        Description
        __typename
    }
}
```

**Variables**

```json
{
    "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

```Text
{
    "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

```http
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

```graphql
mutation UpdateSubscriptions($input: UpdateSubscriptionsRequest!) {
  UpdateSubscriptions(input: $input) {
    TopicID
    IsLocalToRemote
    Enabled
    LocalName
    RemoteName
    Config
    Description
  }
}
```

### Variables

```json
{
  "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:

```json
{ "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**

```graphql
mutation UpdateSubscriptions($input: UpdateSubscriptionsRequest!) {
    UpdateSubscriptions(input: $input) {
        TopicID
        IsLocalToRemote
        Enabled
        LocalName
        RemoteName
        Config
        Description
    }
}
```

**Variables**

```json
{
  "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

```Text
{
    "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 `TopicID`s. 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

```http
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

```graphql
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.                                     |

```json
{
  "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:

```json
{ "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**

```graphql
mutation EnableSubscriptions($input: EnableSubscriptionsRequest!) {
    EnableSubscriptions(input: $input) {
        TopicID
        IsLocalToRemote
        Enabled
        LocalName
        RemoteName
        Config
        Description
    }
}
```

**Variables**

```json
{
  "input": {
    "InstanceID": "{{integration_instance_id}}",
    "TopicIDs": [
      "{{integration_topic_id}}"
    ]
  }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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 `TopicID`s. 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

```http
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

```graphql
mutation DisableSubscriptions($input: DisableSubscriptionsRequest!) {
  DisableSubscriptions(input: $input) {
    TopicID
    IsLocalToRemote
    Enabled
    LocalName
    RemoteName
    Config
    Description
  }
}
```

### Variables

```json
{
  "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:

```json
{ "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**

```graphql
mutation DisableSubscriptions($input: DisableSubscriptionsRequest!) {
    DisableSubscriptions(input: $input) {
        TopicID
        IsLocalToRemote
        Enabled
        LocalName
        RemoteName
        Config
        Description
    }
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}",
        "TopicIDs": [
            "{{integration_topic_id}}"
            ]
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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

```http
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

```graphql
mutation DeleteSubscriptions($input: DeleteSubscriptionsRequest!) {
  DeleteSubscriptions(input: $input)
}
```

### Variables

```json
{
  "input": {
    "InstanceID": "{{integration_instance_id}}",
    "TopicIDs": ["{{integration_topic_id}}"]
  }
}
```

## Response

`200 OK` -- `application/json`. No data returned on success.

```json
{ "data": { "DeleteSubscriptions": null } }
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
mutation DeleteSubscriptions($input: DeleteSubscriptionsRequest!) {
    DeleteSubscriptions(input: $input)
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}",
        "TopicIDs": ["{{integration_topic_id}}"]
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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

```http
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

```graphql
query DownloadTemplate($input: DownloadTemplateRequest!) {
  DownloadTemplate(input: $input)
}
```

### Variables

```json
{ "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.

```json
{
  "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:

```json
{ "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**

```graphql
query DownloadTemplate($input: DownloadTemplateRequest!) {
    DownloadTemplate(input: $input)
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}"
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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

```http
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

```graphql
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.        |

```json
{ "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:

```json
{ "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**

```graphql
query DownloadCSV($input: DownloadCSVRequest!) {
    DownloadCSV(input: $input)
}
```

**Variables**

```json
{
    "input": {
        "InstanceIDs": [
            "{{integration_instance_id}}"
            ]
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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

```http
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

```graphql
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.) |

```json
{
  "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.                                           |

```json
{
  "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:

```json
{ "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**

```graphql
mutation ImportTopics($input: ImportTopicsRequest!) {
    ImportTopics(input: $input) {
        DeviceHub {
            ImportedTags
            UpdatedTags
            SkippedTags
            Error
        }
        DigitalTwins {
            ImportedTags
            UpdatedTags
            SkippedTags
            Error
        }
        Analytics {
            ImportedTags
            UpdatedTags
            SkippedTags
            Error
        }
    }
}
```

**Variables**

```json
{
  "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

```Text
{
    "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

```http
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

```graphql
mutation EnableAllTopics($input: EnableAllTopicsRequest!) {
  EnableAllTopics(input: $input)
}
```

### Variables

```json
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
```

## Response

`200 OK` -- `application/json`. No data returned on success.

```json
{ "data": { "EnableAllTopics": null } }
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
mutation EnableAllTopics($input: EnableAllTopicsRequest!) {
    EnableAllTopics(input: $input)
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}"
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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

```http
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

```graphql
mutation DisableAllTopics($input: DisableAllTopicsRequest!) {
  DisableAllTopics(input: $input)
}
```

### Variables

```json
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
```

## Response

`200 OK` -- `application/json`. No data returned on success.

```json
{ "data": { "DisableAllTopics": null } }
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
mutation DisableAllTopics($input: DisableAllTopicsRequest!) {
    DisableAllTopics(input: $input)
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}"
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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/s` first if you may want to restore.

## Endpoint

```http
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

```graphql
mutation DeleteAllTopics($input: DeleteAllTopicsRequest!) {
  DeleteAllTopics(input: $input)
}
```

### Variables

```json
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
```

## Response

`200 OK` -- `application/json`. No data returned on success.

```json
{ "data": { "DeleteAllTopics": null } }
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
mutation DeleteAllTopics($input: DeleteAllTopicsRequest!) {
    DeleteAllTopics(input: $input)
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}"
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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](https://github.com/jaydenseric/graphql-multipart-request-spec).

The CSV format must match what `Download Topic Sample` / `Download CSV for Instance/s` produces. A typical round-trip:

1. `Download CSV for Instance/s` -> grab the current subscriptions.
2. Edit in a spreadsheet (add/remove rows, change `RemoteName`, toggle `Enable`).
3. `Upload CSV` -> apply.

## Endpoint

```http
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

```json
{
  "operationName": "UploadCSV",
  "variables": { "input": { "InstanceID": "{{integration_instance_id}}", "File": null } },
  "query": "mutation UploadCSV($input: UploadCSVRequest!) { UploadCSV(input: $input) { Errors { Line Column Error } } }"
}
```

### `map` value

```json
{ "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.                                                    |

```json
{ "data": { "UploadCSV": { "Errors": [] } } }
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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

```Text
{
    "data": {
        "UploadCSV": {
            "Errors": [],
            "__typename": "UploadCSVResponse"
        }
    }
}
```

---

## 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

```http
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

```graphql
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.

```json
{
  "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:

```json
{ "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**

```graphql
subscription GetStats {
    GetStats(
        input: { Metrics: null, Tags: null, GroupByInMSec: null, BeginShiftSec: null }
    ) {
        Columns
        Values
    }
}

```

### Response

**Status**: 200 OK

```Text
{
    "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`

# List Instances

Returns every Integration instance on the device along with its configuration, runtime state, and last-known status. Pass an empty `input` object to list all; pass `{ InstanceIDs: [...] }` to filter.

## Endpoint

```http
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

```graphql
query ListInstances($input: ListInstancesRequest!) {
  ListInstances(input: $input) {
    InstanceID
    ProviderID
    Config
    Enabled
    ErrorLogging
    TagSyncEnabled
    System
    Online
    Status
    SizeOnDisk
    ErrCode
    ErrMsg
  }
}
```

### Variables

| Field          | Type      | Required | Description                                                       |
|----------------|-----------|----------|-------------------------------------------------------------------|
| `InstanceIDs`  | `[ID!]`   | No       | Filter to specific instances. Omit (or `{}`) to return every instance. |

```json
{ "input": {} }
```

## Response

`200 OK` -- `application/json`

| Field              | Type    | Description                                                                                |
|--------------------|---------|--------------------------------------------------------------------------------------------|
| `InstanceID`       | string  | Instance UUID. Use as `{{integration_instance_id}}` in subsequent calls.                   |
| `ProviderID`       | string  | Provider slug (e.g. `generic-mqtt-ssl`, `azure-iothub-mqtt-device-cert`, `kafka`).         |
| `Config`           | string  | **JSON-encoded** provider-specific configuration. Decode before reading. Secrets are masked as `<protected>`. |
| `Enabled`          | boolean | Whether the instance is enabled (started on boot).                                         |
| `ErrorLogging`     | boolean | Surface errors from this instance in `System > Events`.                                    |
| `TagSyncEnabled`   | boolean | Sync tag selection between LE and the upstream system (when the provider supports it).      |
| `System`           | boolean | `true` for system-managed instances; `false` for user-created.                              |
| `Online`           | boolean | Last-observed connection state.                                                            |
| `Status`           | string  | Human-readable status (`Online`, `Offline`, `Error: ...`).                                  |
| `SizeOnDisk`       | integer | Bytes used by the instance's persistence layer (queued / buffered messages).                |
| `ErrCode` / `ErrMsg` | string| Most recent error, if any.                                                                  |

> **Sensitive data**: `Config` contains the provider's credentials. Secrets like passwords, API keys, and TLS keys are masked as `<protected>` (`\u003cprotected\u003e` in the wire-encoded form), but hostnames, ports, and topic patterns come back verbatim. Treat the entire response as sensitive.

```json
{
  "data": {
    "ListInstances": [
      {
        "InstanceID": "75D68C24-B8C3-47B5-AE08-5A30CBD7751F",
        "ProviderID": "azure-iothub-mqtt-device-cert",
        "Config": "{\"certificate\":\"<protected>\",\"clientId\":\"...\",\"hostname\":\"{IoTHub}.azure-devices.net\",\"name\":\"Azure\",\"port\":8883}",
        "Enabled": true,
        "ErrorLogging": true,
        "TagSyncEnabled": true,
        "System": false,
        "Online": true,
        "Status": "Online",
        "SizeOnDisk": 0,
        "ErrCode": "",
        "ErrMsg": ""
      }
    ]
  }
}
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
query ListInstances($input: ListInstancesRequest!) {        
    ListInstances(input: $input) {
        InstanceID
        ProviderID
        Config
        Enabled
        ErrorLogging
        TagSyncEnabled
        System
        Online
        Status
        SizeOnDisk
        ErrCode
        ErrMsg
    }
}
```

**Variables**

```json
{"input": {}}
```

### Response

**Status**: 200 OK

```Text
{
    "data": {
        "ListInstances": [
            {
                "InstanceID": "75D68C24-B8C3-47B5-AE08-5A30CBD7751F",
                "ProviderID": "azure-iothub-mqtt-device-cert",
                "Config": "{\"certificate\":\"\\u003cprotected\\u003e\",\"clientId\":\"630c95e8-03e4-4de6-84da-50376daefa79\",\"deviceId\":\"device\",\"hostname\":\"{IoTHub}.azure-devices.net\",\"name\":\"Azure\",\"port\":8883,\"privateKey\":\"\\u003cprotected\\u003e\",\"topic\":\"devices/device/messages/events/\",\"willPayloadType\":\"string\",\"willQoS\":0,\"willRetained\":false,\"workersCount\":16}",
                "Enabled": false,
                "ErrorLogging": false,
                "TagSyncEnabled": false,
                "System": false,
                "Online": false,
                "Status": "DISABLED",
                "SizeOnDisk": 0,
                "ErrCode": null,
                "ErrMsg": null
            },
            {
                "InstanceID": "0D934847-FC33-4E1A-861B-34CE264CFFF4",
                "ProviderID": "mssql",
                "Config": "{\"createTable\":false,\"database\":\"litmus\",\"hostname\":\"172.172.0.1\",\"mapping\":{\"SKU\":\"{{.SKU}}\",\"asset\":\"{{.asset}}\",\"comment\":\"{{.comment}}\",\"duration\":\"{{.duration}}\",\"endTime\":\"{{.downtimeEnd}}\",\"line\":\"{{.line}}\",\"planned\":\"{{.planned}}\",\"plant\":\"{{.plant}}\",\"reasonCode_L1\":\"{{.reasonCode_L1}}\",\"reasonCode_L1_text\":\"{{.reasonCode_L1_text}}\",\"reasonCode_L2\":\"{{.reasonCode_L2}}\",\"reasonCode_L2_text\":\"{{.reasonCode_L2_text}}\",\"reasoncode_entered\":\"{{.reasoncode_entered}}\",\"shift\":\"{{.shift}}\",\"startTime\":\"{{.downtimeStart}}\\t\"},\"name\":\"Insert Downtime History\",\"password\":\"\\u003cprotected\\u003e\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"port\":1433,\"queueMode\":\"lifo\",\"table\":\"downtimeHistory\",\"throttlingLimit\":0,\"username\":\"sa\"}",
                "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"
            },
            {
                "InstanceID": "9A733283-F977-4E10-AF5C-5CE0DA7FE0F3",
                "ProviderID": "gcloud-pubsub",
                "Config": "{\"key\":\"\\u003cprotected\\u003e\",\"name\":\"Google\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"projectId\":\"ASDDSAS\",\"publishByteThreshold\":0,\"publishCountThreshold\":0,\"publishDelayThreshold\":0,\"throttlingLimit\":0,\"topic\":\"DSFDSFG\",\"workersCount\":100}",
                "Enabled": false,
                "ErrorLogging": false,
                "TagSyncEnabled": true,
                "System": false,
                "Online": false,
                "Status": "DISABLED",
                "SizeOnDisk": 0,
                "ErrCode": null,
                "ErrMsg": null
            },
            {
                "InstanceID": "78794A5D-1FBB-449B-BF0C-083C2845DFA9",
                "ProviderID": "mssql",
                "Config": "{\"bulkSize\":0,\"commitTimeout\":1000,\"createTable\":false,\"database\":\"litmus\",\"hostname\":\"172.172.0.1\",\"mapping\":{\"Assigned_To\":\"{{.Assigned_To}}\",\"Priority\":\"{{.Priority}}\",\"Task_Description\":\"{{.Task_Description}}\",\"WO_Date\":\"{{.WO_Date}}\",\"WO_Number\":\"{{.WO_Number}}\",\"WO_Type\":\"{{.WO_Type}}\",\"asset\":\"{{.asset}}\",\"line\":\"{{.line}}\",\"plant\":\"{{.plant}}\"},\"maxTransactionSize\":100,\"name\":\"Insert Scheduled Work Order\",\"password\":\"\\u003cprotected\\u003e\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"port\":1433,\"queueMode\":\"lifo\",\"table\":\"ScheduledWorkOrders\",\"throttlingLimit\":0,\"username\":\"sa\"}",
                "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"
            },
            {
                "InstanceID": "E7F3F8A5-0399-4246-BF68-A772A4B66F52",
                "ProviderID": "generic-mqtt-tcp",
                "Config": "{\"clientId\":\"randomClient\",\"hostname\":\"10.17.100.136\",\"name\":\"MQTT\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"port\":1883,\"qos\":1,\"queueMode\":\"lifo\",\"throttlingLimit\":0,\"willPayloadType\":\"string\",\"willQoS\":1,\"willRetained\":false,\"workersCount\":100}",
                "Enabled": false,
                "ErrorLogging": false,
                "TagSyncEnabled": true,
                "System": false,
                "Online": false,
                "Status": "DISABLED",
                "SizeOnDisk": 0,
                "ErrCode": null,
                "ErrMsg": null
            },
            {
                "InstanceID": "34C194F0-0BF9-4F7A-867F-724C2AF27B26",
                "ProviderID": "rest",
                "Config": "{\"endpoint\":\"http://example-endpoint.com\",\"insecureSkipVerify\":true,\"method\":\"POST\",\"name\":\"REST API\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"queueMode\":\"lifo\",\"throttlingLimit\":0,\"workersCount\":100}",
                "Enabled": false,
                "ErrorLogging": false,
                "TagSyncEnabled": true,
                "System": false,
                "Online": false,
                "Status": "DISABLED",
                "SizeOnDisk": 0,
                "ErrCode": null,
                "ErrMsg": null
            },
            {
                "InstanceID": "19AEA71E-C750-4968-B2FC-0B27D79064D6",
                "ProviderID": "mssql",
                "Config": "{\"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}}\"},\"name\":\"Insert Scrap History\",\"password\":\"\\u003cprotected\\u003e\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"port\":1433,\"queueMode\":\"lifo\",\"table\":\"scrapHistory\",\"throttlingLimit\":0,\"username\":\"sa\"}",
                "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"
            },
            {
                "InstanceID": "7C5660C9-C2DA-43ED-BB00-40355E23F023",
                "ProviderID": "mssql",
                "Config": "{\"createTable\":false,\"database\":\"litmus\",\"hostname\":\"172.172.0.1\",\"mapping\":{\"anomaly\":\"{{.anomaly}}\",\"asset\":\"{{.asset}}\",\"line\":\"{{.line}}\",\"numDeviations\":\"{{.numDeviations}}\",\"plant\":\"{{.plant}}\",\"time\":\"{{.time}}\"},\"name\":\"Insert Anomaly History\",\"password\":\"\\u003cprotected\\u003e\",\"persistentStorage\":true,\"plSizeLimitMB\":1024,\"port\":1433,\"queueMode\":\"fifo\",\"table\":\"anomalyHistory\",\"throttlingLimit\":0,\"username\":\"sa\"}",
                "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"
            },
            {
                "InstanceID": "89402763-7B7E-48C1-B130-F22D0B25FA87",
                "ProviderID": "aws-iotcore-mqtt-ssl",
                "Config": "{\"certificate\":\"\\u003cprotected\\u003e\",\"clientId\":\"AWSClientID\",\"hostname\":\"AWS.Hostname\",\"name\":\"AWS\",\"port\":8883,\"privateKey\":\"\\u003cprotected\\u003e\",\"qos\":0,\"throttlingLimit\":0,\"topic\":\"AWSIntegrationTopic\",\"willPayloadType\":\"string\",\"willQoS\":0,\"willRetained\":false,\"workersCount\":100}",
                "Enabled": false,
                "ErrorLogging": false,
                "TagSyncEnabled": false,
                "System": false,
                "Online": false,
                "Status": "DISABLED",
                "SizeOnDisk": 0,
                "ErrCode": null,
                "ErrMsg": null
            }
        ]
    }
}
```

---

## Delete Instance

**POST** `{{edgeUrl}}/cc/v2`

# Delete Instance

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

```http
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

```graphql
mutation DeleteInstance($input: DeleteInstanceRequest!) {
  DeleteInstance(input: $input)
}
```

### Variables

| Field          | Type   | Required | Description                                  |
|----------------|--------|----------|----------------------------------------------|
| `InstanceID`   | `ID!`  | Yes      | UUID of the instance to delete.              |

```json
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
```

## Response

`200 OK` -- `application/json`. No data returned on success.

```json
{ "data": { "DeleteInstance": null } }
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
mutation DeleteInstance($input: DeleteInstanceRequest!) {
    DeleteInstance(input: $input)
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}"
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "data": {
        "DeleteInstance": null
    }
}
```

---

## Update Instance

**POST** `{{edgeUrl}}/cc/v2`

# Update Instance

Updates an existing instance's configuration. The mutation is a **full replacement** of `Config` (and the other top-level fields you include).

`Config` is a **JSON string** -- not a nested object -- so you have to stringify the provider's config map before sending. The shape inside `Config` is provider-specific; the example below is for `mssql`.

To discover the legal `Config` keys for a provider, use the matching entry in `Provider Schemas - Reference` (the schema includes JSON-Schema validators for every field).

## Endpoint

```http
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

```graphql
mutation UpdateInstance($input: UpdateInstanceRequest!) {
  UpdateInstance(input: $input) {
    InstanceID
    ProviderID
    Config
    Enabled
    ErrorLogging
    TagSyncEnabled
    System
    Online
    Status
    SizeOnDisk
    ErrCode
    ErrMsg
  }
}
```

### Variables

| Field             | Type      | Required | Description                                                                                |
|-------------------|-----------|----------|--------------------------------------------------------------------------------------------|
| `InstanceID`      | `ID!`     | Yes      | UUID of the instance to update.                                                            |
| `Config`          | `String!` | Yes      | New JSON-encoded provider-specific config. See `Provider Schemas - Reference > <provider>`. |
| `Enabled`         | `Boolean` | No       | Toggle started / stopped.                                                                  |
| `ErrorLogging`    | `Boolean` | No       | Toggle error surfacing.                                                                    |
| `TagSyncEnabled`  | `Boolean` | No       | Toggle tag synchronization (when supported by the provider).                               |

```json
{
  "input": {
    "InstanceID": "{{integration_instance_id}}",
    "Config": "{\"commitTimeout\":1000,\"createTable\":false,\"hostname\":\"172.172.0.1\",\"database\":\"litmus\",\"name\":\"Insert Scrap\"}"
  }
}
```

## Response

`200 OK` -- `application/json`. Echoes the updated instance (same shape as `List Instances`).

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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`.

### Operational note

Updating connection-relevant fields (hostname, port, credentials) restarts the instance's worker behind the scenes -- expect a brief window of `Offline` status until it reconnects.

> **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**

```graphql
mutation UpdateInstance($input: UpdateInstanceRequest!) {
    UpdateInstance(input: $input) {
        InstanceID
        ProviderID
        Config
        Enabled
        ErrorLogging
        TagSyncEnabled
        System
        Online
        Status
        SizeOnDisk
        ErrCode
        ErrMsg
    }
}
```

**Variables**

```json
{
    "input": {
        "Config": "{\"commitTimeout\":1000,\"createTable\":false,\"mapping\":{\"SKU\":\"{{.SKU}}\",\"asset\":\"{{.asset}}\",\"comment\":\"{{.comment}}\",\"line\":\"{{.line}}\",\"plant\":\"{{.plant}}\",\"scrapCode\":\"{{.scrapCode}}\",\"scrapCode_text\":\"{{.scrapCode_text}}\",\"scrapTime\":\"{{.scrapTime}}\",\"shift\":\"{{.shift}}\"},\"maxTransactionSize\":100,\"plSizeLimitMB\":1024,\"port\":1433,\"bulkSize\":0,\"workersCount\":1,\"queueMode\":\"lifo\",\"persistentStorage\":true,\"table\":\"scrapHistory\",\"username\":\"sa\",\"name\":\"Insert Scrap History\",\"hostname\":\"172.172.0.1\",\"password\":\"<protected>\",\"throttlingLimit\":0,\"database\":\"litmus\"}",
        "ErrorLogging": false,
        "InstanceID": "{{integration_instance_id}}"
  }
}
```

### Response

**Status**: 200 OK

```Text
{
    "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

```http
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

```graphql
mutation ClearInstancePersistenceLayer($input: ClearInstancePersistenceLayerRequest!) {
  ClearInstancePersistenceLayer(input: $input) {
    CleanUpSizeKb
  }
}
```

### Variables

| Field          | Type   | Required | Description                                  |
|----------------|--------|----------|----------------------------------------------|
| `InstanceID`   | `ID!`  | Yes      | UUID of the instance.                        |

```json
{ "input": { "InstanceID": "{{integration_instance_id}}" } }
```

## Response

`200 OK` -- `application/json`

| Field                                                | Type    | Description                                  |
|------------------------------------------------------|---------|----------------------------------------------|
| `data.ClearInstancePersistenceLayer.CleanUpSizeKb`   | integer | KB reclaimed from the persistence layer.     |

```json
{ "data": { "ClearInstancePersistenceLayer": { "CleanUpSizeKb": 0 } } }
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect the `errors` array in the response body:

```json
{ "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**

```graphql
mutation ClearInstancePersistenceLayer($input: ClearInstancePersistenceLayerRequest!) {
    ClearInstancePersistenceLayer(input: $input) {
        CleanUpSizeKb
    }
}
```

**Variables**

```json
{
    "input": {
        "InstanceID": "{{integration_instance_id}}"
    }
}
```

### Response

**Status**: 200 OK

```Text
{
    "data": {
        "ClearInstancePersistenceLayer": {
            "CleanUpSizeKb": 0
        }
    }
}
```

---

