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

## DeviceHub Status

**GET** `{{edgeUrl}}/devicehub/version`

# DeviceHub Status

Returns the deployed version and git revision of the **DeviceHub** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to DeviceHub, and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

DeviceHub is the GraphQL-fronted service that owns drivers, devices, tags, and discovery. If this endpoint is unhealthy, every call to `{{edgeUrl}}/devicehub/v2` will also fail.

## Endpoint

```http
GET {{edgeUrl}}/devicehub/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). DeviceHub listens on the same host behind the device's reverse proxy at the path above; you do not need to target an internal port (typically 9000) directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed DeviceHub build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "2.18.15",
  "git": "bf1dbfcc3c"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to DeviceHub.                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | DeviceHub is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "version": "2.18.15",
    "git": "bf1dbfcc3c"
}
```

---

## Flows Manager Status

**GET** `{{edgeUrl}}/flows-manager/version`

# Flows Manager Status

Returns the deployed version and git revision of the **Flows Manager** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to Flows Manager, and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

Flows Manager is the Node-RED-based flow runtime. A red status here typically means user-deployed flows are not executing.

## Endpoint

```http
GET {{edgeUrl}}/flows-manager/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). Flows Manager listens on the same host behind the device's reverse proxy at the path above; you do not need to target the Flows Manager port directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed Flows Manager build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "1.9.3",
  "git": "48e313fa2b"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to Flows Manager.                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | Flows Manager is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "version": "1.9.3",
    "git": "48e313fa2b"
}
```

---

## Analytics Status

**GET** `{{edgeUrl}}/analytics/v2/version`

# Analytics Status

Returns the deployed version and git revision of the **Analytics** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to Analytics, and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

Analytics owns processors, groups, variables, models, and the pipeline runtime. If this is down, processed metrics will stop updating but raw tag data continues to flow.

## Endpoint

```http
GET {{edgeUrl}}/analytics/v2/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). Analytics listens on the same host behind the device's reverse proxy at the path above; you do not need to target the Analytics port directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed Analytics build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "1.17.5",
  "git": "04d3664a17"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to Analytics.                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | Analytics is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "version": "1.17.5",
    "git": "04d3664a17"
}
```

---

## Marketplace Status

**GET** `{{edgeUrl}}/apps/version`

# Marketplace Status

Returns the deployed version and git revision of the **Marketplace** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to Marketplace, and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

Marketplace controls Edge Applications (Docker containers deployed on the device). If this is down you cannot install, start, or stop edge apps.

## Endpoint

```http
GET {{edgeUrl}}/apps/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). Marketplace listens on the same host behind the device's reverse proxy at the path above; you do not need to target the Marketplace port directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed Marketplace build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "1.23.19",
  "git": "43e98fc37c"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to Marketplace.                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | Marketplace is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "version": "1.23.19",
    "git": "43e98fc37c"
}
```

---

## Integrations Status

**GET** `{{edgeUrl}}/cc/version`

# Integrations (CC) Status

Returns the deployed version and git revision of the **Integrations (CC)** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to Integrations (CC), and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

Integrations -- referred to internally as **CC** ("Cloud Connectors") -- forwards tag data to MQTT, Kafka, AWS, Azure, etc. If this is down, downstream cloud systems will stop receiving data even though the device looks healthy.

## Endpoint

```http
GET {{edgeUrl}}/cc/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). Integrations (CC) listens on the same host behind the device's reverse proxy at the path above; you do not need to target the Integrations port directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed Integrations (CC) build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "1.15.5",
  "git": "3a1ecffeea"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to Integrations (CC).                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | Integrations (CC) is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "version": "1.15.5",
    "git": "3a1ecffeea"
}
```

---

## OPC UA Status

**GET** `{{edgeUrl}}/opcua/version`

# OPC UA Status

Returns the deployed version and git revision of the **OPC UA** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to OPC UA, and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

This is the **OPC UA server** that LitmusEdge exposes to clients (not the OPC UA *client* used to scrape PLCs, which lives inside DeviceHub). If this is down, third-party OPC UA clients cannot read tags from the device.

## Endpoint

```http
GET {{edgeUrl}}/opcua/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). OPC UA listens on the same host behind the device's reverse proxy at the path above; you do not need to target the OPC UA service port directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed OPC UA build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "1.12.6",
  "git": "75b07950c7"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to OPC UA.                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | OPC UA is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "version": "1.12.6",
    "git": "75b07950c7"
}
```

---

## DeviceManagement Status

**GET** `{{edgeUrl}}/dm/version`

# DeviceManagement Status

Returns the deployed version and git revision of the **DeviceManagement** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to DeviceManagement, and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

DeviceManagement (DM) owns host-level configuration: networking, certificates, backup/restore, system services, support bundles, etc. A failure here usually means the device is in a degraded state requiring console access.

## Endpoint

```http
GET {{edgeUrl}}/dm/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). DeviceManagement listens on the same host behind the device's reverse proxy at the path above; you do not need to target the DeviceManagement port directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed DeviceManagement build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "5.9.16",
  "git": "7e892d15db"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to DeviceManagement.                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | DeviceManagement is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "git": "7e892d15db",
    "version": "5.9.16"
}
```

---

## Licensing Status

**GET** `{{edgeUrl}}/lic/v2/version`

# Licensing Status

Returns the deployed version and git revision of the **Licensing** microservice running on this edge device. Use this as a fast liveness probe before issuing functional calls to Licensing, and as the source of truth when filing a support ticket ("what version is in the field?"). A successful `200 OK` response proves the service is up, reachable, and responding within your client timeout.

Licensing governs which features and how many devices/tags are unlocked. If this is down the device keeps running on its last cached license; new activations and renewals will fail.

## Endpoint

```http
GET {{edgeUrl}}/lic/v2/version
```

`{{edgeUrl}}` resolves to the HTTPS base URL of the edge device (for example `https://10.17.8.42`). Licensing listens on the same host behind the device's reverse proxy at the path above; you do not need to target the Licensing port directly.

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None. This is a parameterless GET.

## Response

`200 OK` -- `application/json`

| Field     | Type   | Description                                                         |
|-----------|--------|---------------------------------------------------------------------|
| `version` | string | Semantic version of the deployed Licensing build.              |
| `git`     | string | Short git commit hash of the build, useful for matching to a release in source control. |

### Example response

```json
{
  "version": "1.6.26",
  "git": "f9a81c705d"
}
```

## Errors

| HTTP status | When it happens                                                                 |
|-------------|---------------------------------------------------------------------------------|
| `401 Unauthorized` | Missing `Authorization` header or wrong API token.                       |
| `403 Forbidden`    | Token is valid but lacks read access to Licensing.                   |
| `404 Not Found`    | The reverse proxy is up but does not know about this service path. Usually a misconfiguration. |
| `502 Bad Gateway` / `503 Service Unavailable` | Licensing is not running, crashed, or is restarting. |
| `5xx` other        | Internal device error. Inspect the device logs under `System > Support`. |

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


### Response

**Status**: 200 OK

```json
{
    "version": "1.6.26",
    "git": "f9a81c705d"
}
```

---

## Host Device Info

**GET** `{{edgeUrl}}/dm/host/info`

# Host Device Info

Returns the static, host-level metadata of the edge device: hostname, country, timezone, DNS servers, NTP servers, default gateway, docker bridge subnet, and the user-provided description. This is the same information shown on the **Device Info** tile of the LE dashboard.

Use this endpoint to confirm a device's identity before issuing destructive calls, to render a "you are connected to ..." banner in custom dashboards, or to capture environment snapshots for support tickets.

## Endpoint

```http
GET {{edgeUrl}}/dm/host/info
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`

| Field         | Type                | Description                                                            |
|---------------|---------------------|------------------------------------------------------------------------|
| `country`     | string              | Two-letter ISO 3166-1 country code configured for the device.          |
| `description` | string              | Free-form description set by the operator (often includes MAC + site). |
| `dns`         | string[]            | Resolver IPs the device uses for DNS lookups.                          |
| `docker.bip`  | string (CIDR)       | Docker bridge IP/subnet used by edge applications.                     |
| `etcHosts`    | object | null       | Static `/etc/hosts` overrides, or `null` if none configured.           |
| `gateway.ipv4`| string              | IPv4 default gateway.                                                  |
| `hostname`    | string              | Linux hostname of the device.                                          |
| `ntp`         | string[]            | NTP servers the device synchronizes time against.                      |
| `timezone`    | string              | IANA timezone name (e.g. `UTC`, `America/Los_Angeles`).                |

### Example response

```json
{
  "country": "US",
  "description": "Litmus Edge (aa:bb:cc:dd:ee:ff) - SJ sensor",
  "dns": ["8.8.8.8", "8.8.4.4"],
  "docker": { "bip": "10.30.50.1/24" },
  "etcHosts": null,
  "gateway": { "ipv4": "10.17.8.1" },
  "hostname": "litmus-edge-aabbccddeeff",
  "ntp": ["0.pool.ntp.org", "1.pool.ntp.org", "2.pool.ntp.org"],
  "timezone": "UTC"
}
```

## Errors

| HTTP status            | When it happens                                                        |
|------------------------|------------------------------------------------------------------------|
| `401 Unauthorized`     | Missing or invalid credentials.                                        |
| `403 Forbidden`        | Token lacks read access to DeviceManagement.                           |
| `502` / `503`          | DeviceManagement service is unreachable. Check `DeviceManagement 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.


### Response

**Status**: 200 OK

```json
{
    "country": "US",
    "description": "Litmus Edge (aa:bb:cc:dd:ee:ff)- SJ sensor",
    "dns": [
        "8.8.8.8",
        "8.8.4.4"
    ],
    "docker": {
        "bip": "10.30.50.1/24"
    },
    "etcHosts": null,
    "gateway": {
        "ipv4": "10.17.8.1"
    },
    "hostname": "litmus-edge-aabbccddeeff",
    "ntp": [
        "0.pool.ntp.org",
        "1.pool.ntp.org",
        "2.pool.ntp.org"
    ],
    "timezone": "UTC"
}
```

---

## Device Storage Utilization

**GET** `{{edgeUrl}}/dm/deviceinfo/stor`

# Device Storage Utilization

Returns disk usage statistics for the partition that holds device data. Sizes are reported in **kilobytes (KB)**. Use this to render the storage tile on the dashboard, or to alert when the free pool drops below a threshold.

The reported partition is the one mounted as the LE data volume, not the OS root partition. On a typical edge device the OS partition is small and the data partition is sized for retention.

## Endpoint

```http
GET {{edgeUrl}}/dm/deviceinfo/stor
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. All values are integers in **KB**.

| Field        | Type    | Description                                                        |
|--------------|---------|--------------------------------------------------------------------|
| `dataFree`   | integer | Free space on the data partition (KB).                             |
| `dataSize`   | integer | Used space on the data partition (KB).                             |
| `totalSize`  | integer | Total size of the data partition (KB). Approximately `dataFree + dataSize`. |

### Example response

```json
{
  "dataFree": 209650284,
  "dataSize": 18447636,
  "totalSize": 229162880
}
```

### Computing percent used

```text
percentUsed = dataSize / totalSize * 100
            = 18447636 / 229162880 * 100
            ~= 8.05 %
```

## Errors

| HTTP status        | When it happens                                                        |
|--------------------|------------------------------------------------------------------------|
| `401 Unauthorized` | Missing or invalid credentials.                                        |
| `403 Forbidden`    | Token lacks read access to DeviceManagement.                           |
| `502` / `503`      | DeviceManagement service is unreachable.                               |

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


### Response

**Status**: 200 OK

```json
{
    "dataFree": 209650284,
    "dataSize": 18447636,
    "totalSize": 229162880
}
```

---

## Network Utilization (Last 1 min)

**GET** `{{edgeUrl}}/sysinfo/system/net?beginShiftSec=360&groupByInMSec=10000`

# Network Utilization (Last 1 min)

Returns a time series of network bytes sent and received by the device, used to render the **Network** sparkline on the dashboard. The series is bucketed by `groupByInMSec` and trimmed to the most recent `beginShiftSec` seconds.

Values are in **bytes per second**, averaged within each bucket. Buckets are labelled with the start time of the bucket in RFC 3339 UTC format.

## Endpoint

```http
GET {{edgeUrl}}/sysinfo/system/net?beginShiftSec=360&groupByInMSec=10000
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Query parameters

| Parameter        | Type    | Required | Default | Description                                                                                       |
|------------------|---------|----------|---------|---------------------------------------------------------------------------------------------------|
| `beginShiftSec`  | integer | Yes      | n/a     | Window size in seconds. The series covers `now - beginShiftSec` to `now`. The dashboard uses `360` (6 min) to render a "last 1 min" view with a small server-side buffer. |
| `groupByInMSec`  | integer | Yes      | n/a     | Bucket width in **milliseconds**. The dashboard uses `10000` (10 s buckets).                      |

Smaller `groupByInMSec` produces a higher-resolution chart but more data points. Keep both values aligned with the polling cadence of your client so buckets do not lag or repeat.

## Response

`200 OK` -- `application/json`. The shape is a generic "rows of named columns" format used by every `/sysinfo/system/*` endpoint.

| Field      | Type           | Description                                                            |
|------------|----------------|------------------------------------------------------------------------|
| `columns`  | string[]       | Column names. Always `["time", "recieved", "sent"]` for this endpoint. Note the deliberate spelling `recieved`. |
| `values`   | array[]        | One row per bucket. Each row is `[time (ISO 8601 UTC), recieved (bytes/s), sent (bytes/s)]`. |

### Example response

```json
{
  "columns": ["time", "recieved", "sent"],
  "values": [
    ["2023-07-31T21:59:11Z", 2990.73, 3322.04],
    ["2023-07-31T21:59:21Z", 4339.52, 4664.84],
    ["2023-07-31T21:59:31Z", 2763.30, 2938.80]
  ]
}
```

## Errors

| HTTP status              | When it happens                                                    |
|--------------------------|--------------------------------------------------------------------|
| `400 Bad Request`        | Missing or malformed `beginShiftSec` / `groupByInMSec`.            |
| `401 Unauthorized`       | Missing or invalid credentials.                                    |
| `502` / `503`            | `sysinfo` service is unreachable.                                  |

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


### Response

**Status**: 200 OK

```json
{
    "columns": [
        "time",
        "recieved",
        "sent"
    ],
    "values": [
        [
            "2023-07-31T21:59:11Z",
            2990.7297261916765,
            3322.04409731697
        ],
        [
            "2023-07-31T21:59:21Z",
            4339.517470419101,
            4664.841270457664
        ],
        [
            "2023-07-31T21:59:31Z",
            2763.2997424604637,
            2938.7997261038654
        ],
        [
            "2023-07-31T21:59:41Z",
            2969.695886892016,
            3367.948977573456
        ],
        [
            "2023-07-31T21:59:51Z",
            6676.492527849511,
            4029.2765411399396
        ],
        [
            "2023-07-31T22:00:01Z",
            3533.6577169186626,
            2667.9925730122486
        ],
        [
            "2023-07-31T22:00:11Z",
            3204.959117296857,
            3395.892426338166
        ],
        [
            "2023-07-31T22:00:21Z",
            3908.024429337631,
            4878.504994946361
        ],
        [
            "2023-07-31T22:00:31Z",
            3616.1075913345185,
            3023.7210209226346
        ],
        [
            "2023-07-31T22:00:41Z",
            3908.70676414442,
            3890.2133560124867
        ],
        [
            "2023-07-31T22:00:51Z",
            6415.343232160673,
            6262.539820595305
        ],
        [
            "2023-07-31T22:01:01Z",
            3289.3578900965763,
            2959.881976638627
        ],
        [
            "2023-07-31T22:01:11Z",
            3648.359146079702,
            3479.3841959063707
        ],
        [
            "2023-07-31T22:01:21Z",
            5520.433651319147,
            5725.0572183552285
        ],
        [
            "2023-07-31T22:01:31Z",
            2757.2200667767015,
            3268.8639992725307
        ],
        [
            "2023-07-31T22:01:41Z",
            3737.2640156383786,
            3209.725557589095
        ],
        [
            "2023-07-31T22:01:51Z",
            3750.3630651944463,
            4132.914307176313
        ],
        [
            "2023-07-31T22:02:01Z",
            2579.1428250157,
            2886.804787399854
        ],
        [
            "2023-07-31T22:02:11Z",
            2940.7348252277725,
            3335.9185607501204
        ],
        [
            "2023-07-31T22:02:21Z",
            3871.8894689752196,
            4096.900479776527
        ],
        [
            "2023-07-31T22:02:31Z",
            3578.0473353756097,
            3187.9914438496394
        ],
        [
            "2023-07-31T22:02:41Z",
            4837.635725557517,
            3684.2470996136763
        ],
        [
            "2023-07-31T22:02:51Z",
            4469.949301516476,
            5822.122213000333
        ],
        [
            "2023-07-31T22:03:01Z",
            3037.9474669950037,
            3014.453286761883
        ],
        [
            "2023-07-31T22:03:11Z",
            2990.5317533546004,
            3358.320134931432
        ],
        [
            "2023-07-31T22:03:21Z",
            4532.105346991466,
            4987.735510824861
        ],
        [
            "2023-07-31T22:03:31Z",
            3120.307331616967,
            2783.569120177594
        ],
        [
            "2023-07-31T22:03:41Z",
            3173.251571075144,
            3606.93061813605
        ],
        [
            "2023-07-31T22:03:51Z",
            5069.2581808863115,
            6084.53047794436
        ],
        [
            "2023-07-31T22:04:01Z",
            2999.740539090264,
            3439.7584743812768
        ],
        [
            "2023-07-31T22:04:11Z",
            2763.0011864789512,
            3291.4910122057413
        ],
        [
            "2023-07-31T22:04:21Z",
            4654.368770046074,
            4254.394112016327
        ],
        [
            "2023-07-31T22:04:31Z",
            2831.9095943836255,
            3169.803354233126
        ],
        [
            "2023-07-31T22:04:41Z",
            3947.868184542754,
            3166.977776866372
        ],
        [
            "2023-07-31T22:04:51Z",
            6364.062975790826,
            5888.765740927549
        ],
        [
            "2023-07-31T22:05:01Z",
            2962.566004819056,
            3513.019812684599
        ]
    ]
}
```

---

## Memory Utilization (Last 1 min)

**GET** `{{edgeUrl}}/sysinfo/system/mem?beginShiftSec=360&groupByInMSec=10000`

# Memory Utilization (Last 1 min)

Returns a time series of system memory usage, expressed as a **percentage of total RAM in use**. This is the same data behind the dashboard's Memory sparkline.

The series is bucketed and windowed exactly like `Network Utilization (Last 1 min)` -- see that endpoint for parameter semantics.

## Endpoint

```http
GET {{edgeUrl}}/sysinfo/system/mem?beginShiftSec=360&groupByInMSec=10000
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Query parameters

| Parameter       | Type    | Required | Description                                              |
|-----------------|---------|----------|----------------------------------------------------------|
| `beginShiftSec` | integer | Yes      | Window size in seconds (dashboard uses `360`).           |
| `groupByInMSec` | integer | Yes      | Bucket width in milliseconds (dashboard uses `10000`).   |

## Response

`200 OK` -- `application/json`.

| Field     | Type      | Description                                                                |
|-----------|-----------|----------------------------------------------------------------------------|
| `columns` | string[]  | Always `["time", "mean_used_percent"]`.                                    |
| `values`  | array[]   | One row per bucket. Each row is `[time (ISO 8601 UTC), mean_used_percent]`. `mean_used_percent` is the average percent of RAM in use during the bucket, `0` -> `100`. |

### Example response

```json
{
  "columns": ["time", "mean_used_percent"],
  "values": [
    ["2023-07-31T22:00:41Z", 60.21],
    ["2023-07-31T22:00:51Z", 60.28],
    ["2023-07-31T22:01:01Z", 60.14]
  ]
}
```

## Errors

| HTTP status        | When it happens                                                        |
|--------------------|------------------------------------------------------------------------|
| `400 Bad Request`  | Missing or malformed `beginShiftSec` / `groupByInMSec`.                |
| `401 Unauthorized` | Missing or invalid credentials.                                        |
| `502` / `503`      | `sysinfo` service is unreachable.                                      |

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


### Response

**Status**: 200 OK

```json
{
    "columns": [
        "time",
        "mean_used_percent"
    ],
    "values": [
        [
            "2023-07-31T22:00:41Z",
            60.212857043298186
        ],
        [
            "2023-07-31T22:00:51Z",
            60.27682367113686
        ],
        [
            "2023-07-31T22:01:01Z",
            60.14446004201388
        ],
        [
            "2023-07-31T22:01:11Z",
            60.12469758967772
        ],
        [
            "2023-07-31T22:01:21Z",
            60.113298089463676
        ],
        [
            "2023-07-31T22:01:31Z",
            60.08980217635873
        ],
        [
            "2023-07-31T22:01:41Z",
            60.11912228826299
        ],
        [
            "2023-07-31T22:01:51Z",
            60.135947751461025
        ],
        [
            "2023-07-31T22:02:01Z",
            60.03539320808817
        ],
        [
            "2023-07-31T22:02:11Z",
            60.068894796053485
        ],
        [
            "2023-07-31T22:02:21Z",
            60.06526089423853
        ],
        [
            "2023-07-31T22:02:31Z",
            60.07292693368378
        ],
        [
            "2023-07-31T22:02:41Z",
            60.079647163067605
        ],
        [
            "2023-07-31T22:02:51Z",
            59.91746562727119
        ],
        [
            "2023-07-31T22:03:01Z",
            59.945143016437186
        ],
        [
            "2023-07-31T22:03:11Z",
            59.942405145206735
        ],
        [
            "2023-07-31T22:03:21Z",
            59.96186892068138
        ],
        [
            "2023-07-31T22:03:31Z",
            59.934490208376886
        ],
        [
            "2023-07-31T22:03:41Z",
            60.01329112033691
        ],
        [
            "2023-07-31T22:03:51Z",
            60.03529364913434
        ],
        [
            "2023-07-31T22:04:01Z",
            60.60163475802196
        ],
        [
            "2023-07-31T22:04:11Z",
            60.54503549276704
        ],
        [
            "2023-07-31T22:04:21Z",
            60.555837639258094
        ],
        [
            "2023-07-31T22:04:31Z",
            60.557679479904024
        ],
        [
            "2023-07-31T22:04:41Z",
            60.58017980347062
        ],
        [
            "2023-07-31T22:04:51Z",
            60.55922264368846
        ],
        [
            "2023-07-31T22:05:01Z",
            60.586452017562195
        ],
        [
            "2023-07-31T22:05:11Z",
            60.571518174487025
        ],
        [
            "2023-07-31T22:05:21Z",
            60.59098194996167
        ],
        [
            "2023-07-31T22:05:31Z",
            60.56096492538057
        ],
        [
            "2023-07-31T22:05:41Z",
            60.571916410302364
        ],
        [
            "2023-07-31T22:05:51Z",
            60.56708780104139
        ],
        [
            "2023-07-31T22:06:01Z",
            60.40391067570662
        ],
        [
            "2023-07-31T22:06:11Z",
            60.42252820007368
        ],
        [
            "2023-07-31T22:06:21Z",
            60.43965234013321
        ],
        [
            "2023-07-31T22:06:31Z",
            60.412323407305635
        ]
    ]
}
```

---

## CPU Utilization (Last 1 min)

**GET** `{{edgeUrl}}/sysinfo/system/cpu?beginShiftSec=360&groupByInMSec=10000`

# CPU Utilization (Last 1 min)

Returns a time series breakdown of CPU usage by mode (`system`, `user`, `idle`), bucketed and windowed the same way as the memory and network endpoints. This is the source for the dashboard's CPU sparkline.

The three modes sum to (approximately) `100` per bucket; small drift is normal because each is sampled independently.

## Endpoint

```http
GET {{edgeUrl}}/sysinfo/system/cpu?beginShiftSec=360&groupByInMSec=10000
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Query parameters

| Parameter       | Type    | Required | Description                                            |
|-----------------|---------|----------|--------------------------------------------------------|
| `beginShiftSec` | integer | Yes      | Window size in seconds (dashboard uses `360`).         |
| `groupByInMSec` | integer | Yes      | Bucket width in milliseconds (dashboard uses `10000`). |

## Response

`200 OK` -- `application/json`.

| Field     | Type      | Description                                                                 |
|-----------|-----------|-----------------------------------------------------------------------------|
| `columns` | string[]  | Always `["time", "system", "user", "idle"]`.                                |
| `values` | array[]   | Each row is `[time, system %, user %, idle %]`. Values are aggregated over the bucket. To compute "busy" use `100 - idle` or `system + user`. |

### Example response

```json
{
  "columns": ["time", "system", "user", "idle"],
  "values": [
    ["2023-07-31T22:01:31Z", 4.34, 7.05, 88.62],
    ["2023-07-31T22:01:41Z", 4.28, 7.25, 88.47],
    ["2023-07-31T22:01:51Z", 4.23, 7.38, 88.38]
  ]
}
```

## Errors

| HTTP status        | When it happens                                                        |
|--------------------|------------------------------------------------------------------------|
| `400 Bad Request`  | Missing or malformed `beginShiftSec` / `groupByInMSec`.                |
| `401 Unauthorized` | Missing or invalid credentials.                                        |
| `502` / `503`      | `sysinfo` service is unreachable.                                      |

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


### Response

**Status**: 200 OK

```json
{
    "columns": [
        "time",
        "system",
        "user",
        "idle"
    ],
    "values": [
        [
            "2023-07-31T22:01:31Z",
            4.335483870949717,
            7.045161290274512,
            88.61935483832514
        ],
        [
            "2023-07-31T22:01:41Z",
            4.280556987940589,
            7.246003093999703,
            88.47343991610845
        ],
        [
            "2023-07-31T22:01:51Z",
            4.233350542290552,
            7.382550336147276,
            88.38409912426671
        ],
        [
            "2023-07-31T22:02:01Z",
            4.300798351636475,
            7.622971928627538,
            88.07622971748744
        ],
        [
            "2023-07-31T22:02:11Z",
            4.252577319668052,
            7.113402061913822,
            88.63402061811809
        ],
        [
            "2023-07-31T22:02:21Z",
            4.281661078033668,
            7.144699509889155,
            88.57363941282786
        ],
        [
            "2023-07-31T22:02:31Z",
            4.3096774195665715,
            7.019354838806279,
            88.67096774252843
        ],
        [
            "2023-07-31T22:02:41Z",
            4.356792987885293,
            7.037896364987759,
            88.60531064727701
        ],
        [
            "2023-07-31T22:02:51Z",
            4.3096774192091996,
            7.019354838468871,
            88.67096774066958
        ],
        [
            "2023-07-31T22:03:01Z",
            4.145211122534004,
            7.1575695160623205,
            88.69721936230287
        ],
        [
            "2023-07-31T22:03:11Z",
            4.517294785833696,
            7.356737222583346,
            88.12596799248448
        ],
        [
            "2023-07-31T22:03:21Z",
            4.201030927867221,
            7.036082474212575,
            88.76288659702008
        ],
        [
            "2023-07-31T22:03:31Z",
            4.103225806419089,
            6.709677419433919,
            89.18709677339592
        ],
        [
            "2023-07-31T22:03:41Z",
            4.254770500241377,
            7.400722021776609,
            88.3445074790327
        ],
        [
            "2023-07-31T22:03:51Z",
            4.334365324980228,
            7.223942208150205,
            88.441692465518
        ],
        [
            "2023-07-31T22:04:01Z",
            4.616971885627786,
            9.027598658860862,
            86.35542945551136
        ],
        [
            "2023-07-31T22:04:11Z",
            4.622933884274536,
            7.618801653124269,
            87.75826446455548
        ],
        [
            "2023-07-31T22:04:21Z",
            4.310789881192737,
            7.124419204939052,
            88.56479091221544
        ],
        [
            "2023-07-31T22:04:31Z",
            4.276146316382928,
            6.929417825665815,
            88.79443585885092
        ],
        [
            "2023-07-31T22:04:41Z",
            4.197785217619184,
            7.030646407355486,
            88.7715683741259
        ],
        [
            "2023-07-31T22:04:51Z",
            4.409489427520152,
            7.478081485491046,
            88.11242908848978
        ],
        [
            "2023-07-31T22:05:01Z",
            4.203197524480908,
            7.11707065495295,
            88.67973181906517
        ],
        [
            "2023-07-31T22:05:11Z",
            4.30856553160872,
            7.3787409700787485,
            88.31269350011462
        ],
        [
            "2023-07-31T22:05:21Z",
            4.147346728422643,
            7.006697578441986,
            88.84595569283549
        ],
        [
            "2023-07-31T22:05:31Z",
            4.306343475947582,
            6.9365652399237945,
            88.75709128337814
        ],
        [
            "2023-07-31T22:05:41Z",
            4.382572828179492,
            7.269914926562969,
            88.34751224630794
        ],
        [
            "2023-07-31T22:05:51Z",
            4.224626481198814,
            7.13549716640227,
            88.63987635209904
        ],
        [
            "2023-07-31T22:06:01Z",
            4.254770500139196,
            7.271789582378107,
            88.47343991583163
        ],
        [
            "2023-07-31T22:06:11Z",
            2.816901408553576,
            14.775928296875117,
            82.40717029650908
        ],
        [
            "2023-07-31T22:06:21Z",
            4.120525366817594,
            6.953386556785759,
            88.9260880745978
        ],
        [
            "2023-07-31T22:06:31Z",
            4.202113947002388,
            6.702758442992122,
            89.09512761120595
        ],
        [
            "2023-07-31T22:06:41Z",
            4.226804123767637,
            6.932989690610913,
            88.8402061853214
        ],
        [
            "2023-07-31T22:06:51Z",
            4.335483870845517,
            7.638709677440056,
            88.02580645036251
        ],
        [
            "2023-07-31T22:07:01Z",
            4.227893787191983,
            7.5277133281587965,
            88.24439288554957
        ],
        [
            "2023-07-31T22:07:11Z",
            4.305233307403976,
            7.166795565760567,
            88.52797112638528
        ],
        [
            "2023-07-31T22:07:21Z",
            4.25696594445935,
            6.991744066159677,
            88.75128999088273
        ]
    ]
}
```

---

## List of Devices

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

# List of Devices

Returns the **ID** and **Name** of every device currently configured in DeviceHub. Used by the LE dashboard to render the "Total Devices" tile and the recent-devices list. Call this when you need a lightweight roster of devices without loading their full configuration, registers, or driver state.

This is intentionally a minimal projection. For richer fields (driver, description, registers, tags, status) use `DeviceHub > Devices > List Devices` and add fields to the GraphQL selection set.

## Endpoint

```http
POST {{edgeUrl}}/devicehub/v2
Content-Type: application/json
```

DeviceHub exposes a single GraphQL endpoint. The operation is selected by the query body, not the URL path. The Postman item is preconfigured with `Content-Type: application/json` and the GraphQL body mode.

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

```graphql
query ListDevices {
  ListDevices(input: { IDs: null }) {
    ID
    Name
  }
}
```

### Arguments

| Argument    | GraphQL type | Required | Description                                                                                                  |
|-------------|--------------|----------|--------------------------------------------------------------------------------------------------------------|
| `input.IDs` | `[ID!]`      | No       | Optional list of device IDs to filter by. Pass `null` (or omit) to return every device. Unknown IDs are ignored. |

You can request additional fields on each `Device` (e.g. `Driver`, `Description`, `StoppedState`, `Tags { ... }`) by adding them to the selection set.

## Response

`200 OK` -- `application/json`

| Field                       | Type           | Description                                                  |
|-----------------------------|----------------|--------------------------------------------------------------|
| `data.ListDevices`          | `[Device!]!`   | Array of devices. Empty array if none are configured.        |
| `data.ListDevices[].ID`     | `ID`           | Device UUID. Use this as the Postman variable `{{deviceID}}` in other DeviceHub calls. |
| `data.ListDevices[].Name`   | `String`       | Display name of the device.                                  |

### Example response

```json
{
  "data": {
    "ListDevices": [
      { "ID": "41FBD12E-C6CD-4539-AD50-336D278B207C", "Name": "Rack 2b M258" },
      { "ID": "474E42B0-C7B8-42DE-8DE2-FFED7030A563", "Name": "DTA windows tia" },
      { "ID": "4C4B9CCC-F5E4-4C2E-A4C0-EAF5C32B0D1A", "Name": "CVE demo device" }
    ]
  }
}
```

## Errors

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

```json
{ "errors": [ { "message": "...", "path": ["ListDevices"], "extensions": { "code": "..." } } ] }
```

| `extensions.code`      | Meaning                                                       |
|------------------------|---------------------------------------------------------------|
| `UNAUTHENTICATED`      | Missing or invalid API token.                                 |
| `FORBIDDEN`            | Token lacks read access to DeviceHub.                         |
| `BAD_USER_INPUT`       | Invalid `IDs` value (e.g. wrong type).                        |
| `INTERNAL_SERVER_ERROR`| DeviceHub fault. Retry, then escalate via `System > Support`. |

Non-`200` HTTP responses mean DeviceHub itself is unreachable. See `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 ListDevices {
    ListDevices(input: {IDs: null}) {
        ID
        Name
    }
}

```

### Response

**Status**: 200 OK

```json
{
    "data": {
        "ListDevices": [
            {
                "ID": "41FBD12E-C6CD-4539-AD50-336D278B207C",
                "Name": "Rack 2b M258"
            },
            {
                "ID": "474E42B0-C7B8-42DE-8DE2-FFED7030A563",
                "Name": "DTA windows tia"
            },
            {
                "ID": "4C4B9CCC-F5E4-4C2E-A4C0-EAF5C32B0D1A",
                "Name": "CVE demo device"
            },
            {
                "ID": "4FDB80F5-6110-411D-9132-1AE4FBC1B53F",
                "Name": "Data Logger"
            },
            {
                "ID": "779F42F3-54FC-4A87-B9A6-CD39CFA4A97D",
                "Name": "Simulator2"
            },
            {
                "ID": "BAFD349E-21B6-408A-AE2F-B9C682912571",
                "Name": "Boiler"
            },
            {
                "ID": "CDC283FB-72E2-42DF-A587-4D6299D70C9A",
                "Name": "sim1"
            },
            {
                "ID": "EEF5EE7F-54C7-415A-B1C7-4F9386112DEB",
                "Name": "D14 Boiler Power PAC4200"
            }
        ]
    }
}
```

---

## Number of Tags

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

# Number of Tags

Returns the total count of **registers** (also called **tags**) across every device configured in DeviceHub. Used by the LE dashboard to render the "Total Tags" tile. This is a server-side count, much cheaper than listing tags and counting client-side.

In DeviceHub vocabulary, a **register** is one data point a driver reads or writes -- e.g. one Modbus holding register, one OPC UA node, one MQTT topic.

## Endpoint

```http
POST {{edgeUrl}}/devicehub/v2
Content-Type: application/json
```

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

```graphql
query RegistersCount {
  RegistersCount {
    Count
  }
}
```

No arguments are accepted; the query always returns the system-wide total. To count registers on a single device, use `DeviceHub > Tags > List Tags` with a `DeviceID` filter and count client-side.

## Response

`200 OK` -- `application/json`

| Field                          | Type    | Description                                  |
|--------------------------------|---------|----------------------------------------------|
| `data.RegistersCount.Count`    | `Int`   | Total number of registers across all devices. |

### Example response

```json
{
  "data": {
    "RegistersCount": {
      "Count": 6543
    }
  }
}
```

## Errors

GraphQL endpoints return `200 OK` even on logical errors. Inspect `errors`:

| `extensions.code`      | Meaning                                                       |
|------------------------|---------------------------------------------------------------|
| `UNAUTHENTICATED`      | Missing or invalid API token.                                 |
| `FORBIDDEN`            | Token lacks read access to DeviceHub.                         |
| `INTERNAL_SERVER_ERROR`| DeviceHub fault. Retry, then escalate via `System > Support`. |

> **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 RegistersCount {
    RegistersCount {
        Count
    }
}

```

### Response

**Status**: 200 OK

```json
{
    "data": {
        "RegistersCount": {
            "Count": 6543
        }
    }
}
```

---

## Number of Analytics Processors

**GET** `{{edgeUrl}}/analytics/v2/processors`

# Number of Analytics Processors

Returns the full list of analytics **processors** configured on the device. The dashboard uses the length of this array to render the "Processors" tile.

A **processor** is a single node in an analytics pipeline: a generator, a transform (filter, math, aggregation), a sink, etc. Processors are wired together by their `outputs` field to form a directed graph that runs inside the Analytics service.

To get just a count without the payload, call this and take `length`. For filtered counts (e.g. only active processors), filter the array client-side or use the richer queries under `Analytics > Instances`.

## Endpoint

```http
GET {{edgeUrl}}/analytics/v2/processors
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. An array of processor objects.

| Field             | Type     | Description                                                                |
|-------------------|----------|----------------------------------------------------------------------------|
| `ID`              | string   | Processor UUID.                                                            |
| `name`            | string   | Display name, often `"Flow - [N]"` for generated processors.               |
| `outputs`         | string[] | IDs of downstream processors this one feeds. Used to reconstruct the pipeline DAG. |
| `function`        | string   | Processor kind: `Generator`, `Transform`, `Sink`, etc.                     |
| `active`          | boolean  | Whether the processor is currently running.                                |
| `parameters`      | object   | Function-specific configuration. The keys depend on `function` (e.g. a `Generator` exposes `formula`, `amplitude_multiplier`, `periodicity`, `timerInterval`, ...). |

### Example response

```json
[
  {
    "ID": "1538BC97-423F-43B6-A7E5-DECD93E50E21",
    "name": "Flow - [2537]",
    "outputs": [
      "47946E33-E91A-4159-8B7D-B786B1BDD0F6",
      "D959C143-E26F-48FE-B491-D84C3A35D305"
    ],
    "function": "Generator",
    "active": true,
    "parameters": {
      "amplitude_multiplier": "1",
      "formula": "sin(t)",
      "generatorType": "User Defined",
      "periodicity": "30",
      "strength": "10",
      "timerInterval": "1000"
    }
  }
]
```

## Errors

| HTTP status         | When it happens                                                       |
|---------------------|-----------------------------------------------------------------------|
| `401 Unauthorized`  | Missing or invalid credentials.                                       |
| `403 Forbidden`     | Token lacks read access to Analytics.                                 |
| `502` / `503`       | Analytics service is unreachable. Check `Analytics 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.


### Response

**Status**: 200 OK

```json
[
    {
        "ID": "1538BC97-423F-43B6-A7E5-DECD93E50E21",
        "name": "Flow  - [2537]",
        "outputs": [
            "47946E33-E91A-4159-8B7D-B786B1BDD0F6",
            "D959C143-E26F-48FE-B491-D84C3A35D305",
            "D9AA2CEA-05C2-4B4F-9A91-AF39669E866D"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "sin(t)",
            "generatorType": "User Defined",
            "periodicity": "30",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "1FAB8D4D-C708-4010-BF17-2474DC7B6D46",
        "name": "sensor3",
        "outputs": [],
        "function": "DataHub Subscribe",
        "active": true,
        "parameters": {
            "format": "json",
            "topic": "sensorNov2021Three"
        }
    },
    {
        "ID": "4D0803C4-847F-4E96-9FEB-4B83AF662F16",
        "name": "Generator  - [5412]",
        "outputs": [
            "7B2D501B-E029-40E0-B294-C360B983AEF7"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "sin(t)",
            "generatorType": "User Defined",
            "periodicity": "30",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "E864AF72-1CAD-4451-9AB9-802DB23236F5",
        "name": "Database Output  - [297]",
        "outputs": [],
        "eventInputs": [
            "150BB3E6-548C-4D1A-BE12-2790615E0055"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "variable1",
            "retention_policy": "autogen"
        }
    },
    {
        "ID": "CDC39506-0F43-4C7F-BBF3-A1F27010AB2E",
        "name": "Expression  - [2748]",
        "outputs": [
            "F9414534-124E-4E03-8101-C578F522CC35"
        ],
        "eventInputs": [
            "903EAB72-F865-4BD2-8059-857FF6D4AB88"
        ],
        "function": "Expression",
        "active": true,
        "parameters": {
            "expression": "(Celsius_value * 9/5) + 32",
            "output_field_name": "value",
            "pass_through_value": "false"
        },
        "definitions": {
            "Celsius": "903EAB72-F865-4BD2-8059-857FF6D4AB88"
        }
    },
    {
        "ID": "E157E410-B8E8-4528-B58D-65424301ECD5",
        "name": "Generator  - [195]",
        "outputs": [
            "9D9C48E6-8B98-4F3D-8270-09C0EF0A0000"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "sin(t)",
            "generatorType": "User Defined",
            "periodicity": "30",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "E9F954B9-03CB-4E14-8C43-EED18E5738C7",
        "name": "DataHub Publish  - [8679]",
        "outputs": [],
        "eventInputs": [
            "150BB3E6-548C-4D1A-BE12-2790615E0055"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "output2"
        }
    },
    {
        "ID": "47946E33-E91A-4159-8B7D-B786B1BDD0F6",
        "name": "Database Output  - [4207]",
        "outputs": [],
        "eventInputs": [
            "1538BC97-423F-43B6-A7E5-DECD93E50E21"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "just.name",
            "retention_policy": "autogen"
        }
    },
    {
        "ID": "7B2D501B-E029-40E0-B294-C360B983AEF7",
        "name": "Flow  - [7365]",
        "outputs": [],
        "eventInputs": [
            "4D0803C4-847F-4E96-9FEB-4B83AF662F16"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "variable2"
        }
    },
    {
        "ID": "BC1255DF-D281-4644-B64B-41381B3C68E7",
        "name": "Database Output  - [8402]",
        "outputs": [],
        "eventInputs": [
            "903EAB72-F865-4BD2-8059-857FF6D4AB88"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "sensorNov2021",
            "retention_policy": "autogen"
        }
    },
    {
        "ID": "97EF0827-2A00-44D6-8BB7-D44911FBA693",
        "name": "Generator  - [2504]",
        "outputs": [
            "03F0289E-C249-482F-944E-5B6B431B1D7F"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "sin(t)",
            "generatorType": "User Defined",
            "periodicity": "30",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "DF3EE661-6B18-469C-AE65-CF430C0F4BF8",
        "name": "Flow  - [2537]",
        "outputs": [],
        "eventInputs": [
            "D959C143-E26F-48FE-B491-D84C3A35D305"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "analytics.publish.oGnibcEdy4ZzMTd91oNHw"
        }
    },
    {
        "ID": "E151F5D7-0FC9-4339-8FD8-9A49DD2B50F7",
        "name": "DataHub Subscribe  - [4029]",
        "outputs": [],
        "function": "DataHub Subscribe",
        "active": true,
        "parameters": {
            "format": "json",
            "topic": "images"
        }
    },
    {
        "ID": "F1B26FF6-7B69-4ED0-A6DB-7CCA391711CF",
        "name": "Flow  - [4893]",
        "outputs": [],
        "eventInputs": [
            "150BB3E6-548C-4D1A-BE12-2790615E0055"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "variable5",
            "retention_policy": "autogen"
        }
    },
    {
        "ID": "F9414534-124E-4E03-8101-C578F522CC35",
        "name": "sensorfahrenheit",
        "outputs": [],
        "eventInputs": [
            "CDC39506-0F43-4C7F-BBF3-A1F27010AB2E"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "sensorNovFahrenheit",
            "retention_policy": "autogen"
        }
    },
    {
        "ID": "54197B04-455A-4DF6-A175-5CD2DA0EAFF6",
        "name": "Flow  - [7659]",
        "outputs": [
            "EE72FD8C-64F1-4FFB-961D-D94245CB8C71"
        ],
        "function": "DataHub Subscribe",
        "active": true,
        "parameters": {
            "format": "json",
            "topic": "devicehub.alias.sim1.sine1"
        }
    },
    {
        "ID": "6EE21D13-0D47-4BDA-A8BF-DA541D76338B",
        "name": "Flow  - [2986]",
        "outputs": [],
        "eventInputs": [
            "FE4FF29D-AEB1-4B83-A9F0-E663435D6020"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "variable2",
            "retention_policy": "autogen"
        }
    },
    {
        "ID": "71FC22C0-013E-43EB-94B2-FBF671283ABF",
        "name": "sensor2",
        "outputs": [
            "903EAB72-F865-4BD2-8059-857FF6D4AB88"
        ],
        "function": "DataHub Subscribe",
        "active": true,
        "parameters": {
            "format": "json",
            "topic": "sensorNov2021Two"
        }
    },
    {
        "ID": "9D9C48E6-8B98-4F3D-8270-09C0EF0A0000",
        "name": "Flow  - [333]",
        "outputs": [],
        "eventInputs": [
            "E157E410-B8E8-4528-B58D-65424301ECD5"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "variable3"
        }
    },
    {
        "ID": "D9AA2CEA-05C2-4B4F-9A91-AF39669E866D",
        "name": "DataHub Publish  - [588]",
        "outputs": [],
        "eventInputs": [
            "1538BC97-423F-43B6-A7E5-DECD93E50E21"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "variable1"
        }
    },
    {
        "ID": "903EAB72-F865-4BD2-8059-857FF6D4AB88",
        "name": "Inputs Average  - [921]",
        "outputs": [
            "17CC3610-10EE-49C0-9A1B-63E3D06877D0",
            "BC1255DF-D281-4644-B64B-41381B3C68E7",
            "CDC39506-0F43-4C7F-BBF3-A1F27010AB2E"
        ],
        "valueInputs": [
            "D321BAB2-4298-41E4-AF9F-C3BB45BBBE27",
            "DFDE39D9-7F8D-4BE5-8338-DFCC77DF7EFE",
            "71FC22C0-013E-43EB-94B2-FBF671283ABF"
        ],
        "function": "Inputs Average",
        "active": true,
        "parameters": {
            "field_name": "value",
            "pass_through_value": "false",
            "processing_type": "float"
        }
    },
    {
        "ID": "EE72FD8C-64F1-4FFB-961D-D94245CB8C71",
        "name": "Flow  - [7659]",
        "outputs": [],
        "eventInputs": [
            "54197B04-455A-4DF6-A175-5CD2DA0EAFF6"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "pd",
            "typed": "autogen"
        }
    },
    {
        "ID": "17CC3610-10EE-49C0-9A1B-63E3D06877D0",
        "name": "DataHub Publish  - [2124]",
        "outputs": [],
        "eventInputs": [
            "903EAB72-F865-4BD2-8059-857FF6D4AB88"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "sensorNov2021"
        }
    },
    {
        "ID": "A73A30E7-C308-4D50-889C-2C8E2FC02D8C",
        "name": "Generator  - [5528]",
        "outputs": [
            "B87977B2-B239-48D5-8277-E38C4FA2DF3B"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "sin(t)",
            "generatorType": "User Defined",
            "periodicity": "30",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "CD42F877-640E-41C7-B7C5-6333EE1C148B",
        "name": "Generator  - [2371]",
        "outputs": [
            "C07162D4-574A-48D2-85F1-5CE3E9EA6402"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "sin(t)",
            "generatorType": "User Defined",
            "periodicity": "30",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "D321BAB2-4298-41E4-AF9F-C3BB45BBBE27",
        "name": "sensor4",
        "outputs": [
            "903EAB72-F865-4BD2-8059-857FF6D4AB88"
        ],
        "function": "DataHub Subscribe",
        "active": true,
        "parameters": {
            "format": "json",
            "topic": "sensorNov2021Four"
        }
    },
    {
        "ID": "D959C143-E26F-48FE-B491-D84C3A35D305",
        "name": "Flow  - [2537]",
        "outputs": [
            "DF3EE661-6B18-469C-AE65-CF430C0F4BF8"
        ],
        "eventInputs": [
            "1538BC97-423F-43B6-A7E5-DECD93E50E21"
        ],
        "function": "Expression",
        "active": true,
        "parameters": {
            "expression": "A_value < 100 ? \"hello world! \\n \\u263a\": \"NO\"",
            "output_field_name": "value",
            "pass_through_value": "false"
        },
        "definitions": {
            "A": "1538BC97-423F-43B6-A7E5-DECD93E50E21"
        }
    },
    {
        "ID": "DCD477BC-63D9-48C9-B8B5-5A493DD95B96",
        "name": "DataHub Publish  - [7054]",
        "outputs": [],
        "eventInputs": [
            "150BB3E6-548C-4D1A-BE12-2790615E0055"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "output"
        }
    },
    {
        "ID": "DFDE39D9-7F8D-4BE5-8338-DFCC77DF7EFE",
        "name": "sensor1",
        "outputs": [
            "903EAB72-F865-4BD2-8059-857FF6D4AB88"
        ],
        "function": "DataHub Subscribe",
        "active": true,
        "parameters": {
            "format": "json",
            "topic": "sensorNov2021One"
        }
    },
    {
        "ID": "FE4FF29D-AEB1-4B83-A9F0-E663435D6020",
        "name": "Generator  - [5867]",
        "outputs": [
            "6EE21D13-0D47-4BDA-A8BF-DA541D76338B"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "sin(t)",
            "generatorType": "User Defined",
            "periodicity": "30",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "03F0289E-C249-482F-944E-5B6B431B1D7F",
        "name": "Flow  - [1338]",
        "outputs": [],
        "eventInputs": [
            "97EF0827-2A00-44D6-8BB7-D44911FBA693"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "variable3",
            "retention_policy": "autogen"
        }
    },
    {
        "ID": "150BB3E6-548C-4D1A-BE12-2790615E0055",
        "name": "Generator  - [4357]",
        "outputs": [
            "DCD477BC-63D9-48C9-B8B5-5A493DD95B96",
            "E864AF72-1CAD-4451-9AB9-802DB23236F5",
            "E9F954B9-03CB-4E14-8C43-EED18E5738C7",
            "F1B26FF6-7B69-4ED0-A6DB-7CCA391711CF"
        ],
        "function": "Generator",
        "active": true,
        "parameters": {
            "amplitude_multiplier": "1",
            "formula": "1.1",
            "generatorType": "User Defined",
            "periodicity": "1",
            "strength": "10",
            "timerInterval": "1000"
        }
    },
    {
        "ID": "B87977B2-B239-48D5-8277-E38C4FA2DF3B",
        "name": "Flow  - [6390]",
        "outputs": [],
        "eventInputs": [
            "A73A30E7-C308-4D50-889C-2C8E2FC02D8C"
        ],
        "function": "DataHub Publish",
        "active": true,
        "parameters": {
            "single_topic": "true",
            "topic": "variable4"
        }
    },
    {
        "ID": "C07162D4-574A-48D2-85F1-5CE3E9EA6402",
        "name": "Flow  - [6240]",
        "outputs": [],
        "eventInputs": [
            "CD42F877-640E-41C7-B7C5-6333EE1C148B"
        ],
        "function": "Database Output",
        "active": true,
        "parameters": {
            "database": "tsdata",
            "measurement": "variable4",
            "retention_policy": "autogen"
        }
    }
]
```

---

## Number of Analytics Groups

**GET** `{{edgeUrl}}/analytics/v2/groups`

# Number of Analytics Groups

Returns the names of all analytics **groups** defined on the device. The dashboard uses the length of this array to render the "Groups" tile.

A **group** is a logical bucket that processors are tagged into; the most common use is to render related processors together in the UI and to scope permissions. The default group is `default`; product-specific groups (e.g. `sensorAnalytics`, `pd`) are created automatically by certain LE features.

## Endpoint

```http
GET {{edgeUrl}}/analytics/v2/groups
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. An **array of strings** (not objects); each string is a group name.

### Example response

```json
["pd", "sensorAnalytics", "default"]
```

To count groups, take the length of the array. To get processors in a group, use the `Analytics > Instances > List Processors` endpoint with the group filter.

## Errors

| HTTP status         | When it happens                                                       |
|---------------------|-----------------------------------------------------------------------|
| `401 Unauthorized`  | Missing or invalid credentials.                                       |
| `403 Forbidden`     | Token lacks read access to Analytics.                                 |
| `502` / `503`       | Analytics service is unreachable.                                     |

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


### Response

**Status**: 200 OK

```json
[
    "pd",
    "sensorAnalytics",
    "default"
]
```

---

## Number of Flows

**GET** `{{edgeUrl}}/flows-manager/flows`

# Number of Flows

Returns the full list of **flows** defined in Flows Manager (LE's Node-RED runtime). The dashboard uses the length of this array to render the "Flows" tile.

A **flow** here is the Flows-Manager-level grouping that contains one or more **tabs**, where each tab is a Node-RED flow surface in the UI. Most edge deployments have a single flow with several tabs.

## Endpoint

```http
GET {{edgeUrl}}/flows-manager/flows
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. An array of flow objects.

| Field           | Type     | Description                                                                |
|-----------------|----------|----------------------------------------------------------------------------|
| `id`            | integer  | Flow ID (auto-incremented, starts at 1).                                   |
| `name`          | string   | Flow name (e.g. `flow-1`).                                                 |
| `memory_limit`  | integer  | Soft memory cap in MB. `0` means no explicit limit.                        |
| `secret`        | string   | Encryption key used to encrypt sensitive fields inside the flow JSON. Empty if unset. |
| `tabs`          | object[] | Node-RED tabs inside this flow. Each tab has `id` (NR node ID) and `label` (display name). |

### Example response

```json
[
  {
    "id": 1,
    "name": "flow-1",
    "memory_limit": 0,
    "secret": "",
    "tabs": [
      { "id": "d2c028f7.3edfd",    "label": "Flow 1" },
      { "id": "6a066af5.d68d14",   "label": "Flow 2" },
      { "id": "bf24c84c.f34d28",   "label": "Flow 3" },
      { "id": "166b0a3cbcb7ad33",  "label": "Flow 4" }
    ]
  },
  {
    "id": 2,
    "name": "flow-2",
    "memory_limit": 0,
    "secret": "",
    "tabs": []
  }
]
```

## Errors

| HTTP status         | When it happens                                                       |
|---------------------|-----------------------------------------------------------------------|
| `401 Unauthorized`  | Missing or invalid credentials.                                       |
| `403 Forbidden`     | Token lacks read access to Flows Manager.                             |
| `502` / `503`       | Flows Manager service is unreachable. Check `Flows Manager 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.


### Response

**Status**: 200 OK

```json
[
    {
        "id": 1,
        "name": "flow-1",
        "memory_limit": 0,
        "secret": "",
        "tabs": [
            {
                "id": "d2c028f7.3edfd",
                "label": "Flow 1"
            },
            {
                "id": "6a066af5.d68d14",
                "label": "Flow 2"
            },
            {
                "id": "bf24c84c.f34d28",
                "label": "Flow 3"
            },
            {
                "id": "166b0a3cbcb7ad33",
                "label": "Flow 4"
            }
        ]
    },
    {
        "id": 2,
        "name": "flow-2",
        "memory_limit": 1024,
        "secret": "",
        "tabs": [
            {
                "id": "20c9a135.443d1e",
                "label": "Flow 1"
            }
        ]
    },
    {
        "id": 3,
        "name": "flow-3",
        "memory_limit": 1024,
        "secret": "",
        "tabs": [
            {
                "id": "1f4d06ac43dd7191",
                "label": "Flow 1"
            }
        ]
    }
]
```

---

## Number of Integrations

**GET** `{{edgeUrl}}/cc/instances`

# Number of Integrations

Returns the full list of Integration **instances** configured on the device. The dashboard uses the length of this array to render the "Integrations" tile.

An **instance** is one concrete configured target -- a specific MQTT broker, a specific Kafka cluster, a specific Azure IoT Hub, etc. Each instance is backed by a **provider** (driver template). For the provider catalog, see `Integration > Streaming`.

> **Sensitive data**: the response includes `config` JSON for each instance. For most providers, secret fields (passwords, access keys, tokens) come back masked as `<protected>`, but the full config of plaintext fields is returned. Treat this response as sensitive and avoid logging it verbatim.

## Endpoint

```http
GET {{edgeUrl}}/cc/instances
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. An array of instance objects.

| Field              | Type      | Description                                                                |
|--------------------|-----------|----------------------------------------------------------------------------|
| `instanceId`       | string    | Instance UUID.                                                             |
| `providerId`       | string    | Provider slug (e.g. `generic-mqtt-ssl`, `aws-iot-core`, `kafka`).          |
| `config`           | string    | **JSON-encoded string** holding the provider-specific configuration. Decode before reading. |
| `enabled`          | boolean   | Whether this instance is currently enabled.                                |
| `errorLogging`     | boolean   | Whether to surface errors from this instance in `System > Events`.         |
| `tagSyncEnabled`   | boolean   | Whether tag selection is synced between LE and the upstream system.        |
| `system`           | boolean   | `true` if this is a system-managed (non-user-created) instance.            |
| `online`           | boolean   | Last-known connection state.                                               |
| `status`           | string    | Human-readable status (e.g. `Online`, `Offline`, `Error: ...`).            |

### Example response

```json
[
  {
    "instanceId": "418ed743-f0cc-4e9f-8b91-6329ba88c5fc",
    "providerId": "generic-mqtt-ssl",
    "config": "{\"clientId\":\"XYZ\",\"hostname\":\"mqtt.clarify.io\",\"port\":8883,\"password\":\"<protected>\",\"username\":\"ABC\"}",
    "enabled": true,
    "errorLogging": true,
    "tagSyncEnabled": true,
    "system": false,
    "online": true,
    "status": "Online"
  }
]
```

## Errors

| HTTP status         | When it happens                                                       |
|---------------------|-----------------------------------------------------------------------|
| `401 Unauthorized`  | Missing or invalid credentials.                                       |
| `403 Forbidden`     | Token lacks read access to Integrations (CC).                         |
| `502` / `503`       | Integrations service is unreachable. Check `Integrations 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.


### Response

**Status**: 200 OK

```json
[
    {
        "instanceId": "418ed743-f0cc-4e9f-8b91-6329ba88c5fc",
        "providerId": "generic-mqtt-ssl",
        "config": "{\"clientId\":\"XYZ\",\"hostname\":\"mqtt.clarify.io\",\"name\":\"ClarifyIOssl\",\"password\":\"XYZ=\",\"port\":8883,\"qos\":0,\"throttlingLimit\":0,\"topic\":\"833dd1d4-9d73-4c01-8104-e36b73b62c15\",\"username\":\"ABC\",\"willPayloadType\":\"string\",\"willQoS\":0,\"willRetained\":false,\"workersCount\":100}",
        "enabled": true,
        "errorLogging": true,
        "tagSyncEnabled": true,
        "system": false,
        "online": true,
        "status": "ONLINE",
        "sizeOnDisk": 25600
    },
    {
        "instanceId": "6519965d-c6b2-4dcf-bf21-ff89c8968f32",
        "providerId": "generic-mqtt-ssl",
        "config": "{\"caCert\":\"-----BEGIN CERTIFICATE-----\\abcd\\n-----END CERTIFICATE-----\",\"clientId\":\"2ea9g28plimcks2kma5g8x2me\",\"hostname\":\"internaltest.la2.space\",\"name\":\"default-ssl\",\"password\":\"cklp4for20hd6vfj1vhdle4pi4\",\"port\":8883,\"topic\":\"loop/data/2ea9g28plimcks2kma5g8x2me/43k2fg48g8j99t1s34dp17f3t/json\",\"username\":\"ABC\"}",
        "enabled": false,
        "errorLogging": false,
        "tagSyncEnabled": true,
        "system": true,
        "online": false,
        "status": "DISABLED",
        "sizeOnDisk": 0
    },
    {
        "instanceId": "8ba1721c-2b13-488e-899c-65da6379cb8b",
        "providerId": "gcloud-pubsub",
        "config": "{\"key\":\"\\u003cprotected\\u003e\",\"name\":\"data-rate-test\",\"projectId\":\"iot-server\",\"publishByteThreshold\":0,\"publishCountThreshold\":1000,\"publishDelayThreshold\":0,\"topic\":\"projects/iot-server/topics/v-connector\"}",
        "enabled": false,
        "errorLogging": true,
        "tagSyncEnabled": false,
        "system": false,
        "online": false,
        "status": "DISABLED",
        "sizeOnDisk": 95739
    }
]
```

---

## Number of Cloud Storages

**GET** `{{edgeUrl}}/cloudstorage/jobs`

# Number of Cloud Storages

Returns the full list of **Cloud Storage** jobs configured on the device. The dashboard uses the length of this array to render the "Cloud Storage" tile.

A Cloud Storage **job** synchronizes a local directory on the edge device with an external object store (AWS S3, Azure Blob, etc.) on a schedule. Each job has a source path, destination bucket/container, credentials, and a cron-like trigger.

> **Sensitive data**: credentials are returned but secret components (access keys, secret keys, SAS tokens) come back masked as `<protected>`.

## Endpoint

```http
GET {{edgeUrl}}/cloudstorage/jobs
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. An array of job objects.

| Field           | Type    | Description                                                                    |
|-----------------|---------|--------------------------------------------------------------------------------|
| `id`            | string  | Job UUID.                                                                      |
| `name`          | string  | Display name of the job.                                                       |
| `provider`      | string  | Storage backend (`AWS S3`, `Azure Blob`, `GCS`, ...).                          |
| `status`        | string  | Last-known run state (`disabled`, `idle`, `running`, `error`, ...).            |
| `enabled`       | boolean | Whether the job is enabled on its schedule.                                    |
| `source`        | string  | Local filesystem path that is being synced from.                               |
| `destination`   | string  | Remote bucket/container (and optional prefix) that is being synced to.         |
| `last_run`      | string  | Timestamp of the last run, or `"-"` if it has never run.                       |
| `next_run`      | string  | Timestamp of the next scheduled run, or `"-"`.                                 |
| `mode`          | string  | Sync mode (`copy`, `move`, `mirror`).                                          |
| `time`          | string  | Schedule unit (`minutes`, `hours`, `days`).                                    |
| `count`         | integer | Schedule magnitude. With `time="minutes"` and `count=5`, runs every 5 minutes. |
| `cred_encrypt`  | boolean | Whether the credential blob is stored encrypted at rest.                       |
| `credentials`   | object  | Provider-specific credentials. Secrets are masked as `<protected>`.            |

### Example response

```json
[
  {
    "id": "424b2d92-76dd-11ef-940a-005056b9afd3",
    "name": "aws-s3",
    "provider": "AWS S3",
    "status": "disabled",
    "enabled": false,
    "source": "/ftp-data/",
    "destination": "h-data",
    "last_run": "-",
    "next_run": "-",
    "mode": "copy",
    "time": "minutes",
    "count": 5,
    "cred_encrypt": false,
    "credentials": {
      "aws": {
        "region": "hk",
        "accessKeyID": "<protected>",
        "secretAccessKey": "<protected>"
      }
    }
  }
]
```

## Errors

| HTTP status         | When it happens                                                       |
|---------------------|-----------------------------------------------------------------------|
| `401 Unauthorized`  | Missing or invalid credentials.                                       |
| `403 Forbidden`     | Token lacks read access to Cloud Storage.                             |
| `502` / `503`       | Cloud Storage service is unreachable.                                 |

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


### Response

**Status**: 200 OK

```json
[
    {
        "id": "424b2d92-76dd-11ef-940a-005056b9afd3",
        "name": "aws-s3",
        "provider": "AWS S3",
        "status": "disabled",
        "enabled": false,
        "source": "/ftp-data/",
        "destination": "h-data",
        "last_run": "-",
        "next_run": "-",
        "mode": "copy",
        "time": "minutes",
        "count": 5,
        "cred_encrypt": false,
        "credentials": {
            "aws": {
                "region": "hk",
                "accessKeyID": "<protected>",
                "secretAccessKey": "<protected>"
            }
        }
    }
]
```

---

## Number of Edge Applications

**GET** `{{edgeUrl}}/apps`

# Number of Edge Applications

Returns the full list of **Edge Applications** installed on the device. The dashboard uses the length of this array to render the "Edge Applications" tile.

An Edge Application is a Docker-based workload deployed by Marketplace -- either from the LE Marketplace catalog or as a user-supplied container. Each app may consist of multiple containers (e.g. an application container plus its database sidecar).

## Endpoint

```http
GET {{edgeUrl}}/apps
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. An array of application objects.

| Field                  | Type     | Description                                                                  |
|------------------------|----------|------------------------------------------------------------------------------|
| `id`                   | string   | Application UUID.                                                            |
| `name`                 | string   | Application display name.                                                    |
| `status`               | string   | Overall app state (`Running`, `Stopped`, `Restarting`, `Errored`, ...).      |
| `containersState`      | object[] | One entry per container inside this app. Each has `containerName` and `state` (raw Docker state). |
| `statusChangedAt`      | string   | ISO 8601 timestamp of the last `status` transition.                          |
| `image`                | string   | Docker image reference of the primary container, including tag.              |

### Example response

```json
[
  {
    "id": "ca877b46-1a8c-11ed-8791-94c6911b9c77",
    "name": "MySQL",
    "status": "Running",
    "containersState": [
      { "containerName": "mysql-mysql", "state": "" },
      {}
    ],
    "statusChangedAt": "2023-07-08T15:30:39+00:00",
    "image": "mysql:8.0.23"
  }
]
```

## Errors

| HTTP status         | When it happens                                                       |
|---------------------|-----------------------------------------------------------------------|
| `401 Unauthorized`  | Missing or invalid credentials.                                       |
| `403 Forbidden`     | Token lacks read access to Marketplace.                               |
| `502` / `503`       | Marketplace service is unreachable. Check `Marketplace 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.


### Response

**Status**: 200 OK

```json
[
    {
        "id": "ca877b46-1a8c-11ed-8791-94c6911b9c77",
        "name": "MySQL",
        "status": "Running",
        "containersState": [
            {
                "containerName": "mysql-mysql",
                "state": ""
            },
            {}
        ],
        "statusChangedAt": "2023-07-08T15:30:39+00:00",
        "image": "mysql:8.0.23"
    }
]
```

---

## Active Online Users

**GET** `{{edgeUrl}}/auth/v3/users/active`

# Active Online Users

Returns the users currently authenticated to the LitmusEdge UI (i.e. who hold an unexpired session). The dashboard uses this to render the "Active Users" tile.

Each entry is a snapshot of the user account; full session metadata (last seen, IP, role) is **not** returned by this endpoint. For audit-grade session tracking use `System > Access Control > Users` instead.

## Endpoint

```http
GET {{edgeUrl}}/auth/v3/users/active
```

## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`. OAuth2 bearer tokens are also accepted, see the `How-To: Use OAuth2 Authorization` collection.

## Parameters

None.

## Response

`200 OK` -- `application/json`. An array of user objects.

| Field        | Type   | Description                                                            |
|--------------|--------|------------------------------------------------------------------------|
| `userId`     | string | Internal user identifier (often the username for local accounts).      |
| `username`   | string | Login name used to sign in.                                            |
| `firstName`  | string | First name, as configured on the user account.                         |
| `lastName`   | string | Last name, as configured on the user account.                          |

The array is empty (`[]`) when no users have an active session, including when the caller's own token is a service token rather than a user session.

### Example response

```json
[
  {
    "userId": "admin",
    "username": "admin",
    "firstName": "System",
    "lastName": "Administrator"
  }
]
```

## Errors

| HTTP status         | When it happens                                                       |
|---------------------|-----------------------------------------------------------------------|
| `401 Unauthorized`  | Missing or invalid credentials.                                       |
| `403 Forbidden`     | Token lacks read access to the auth service.                          |
| `502` / `503`       | Auth service is unreachable.                                          |

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


### Response

**Status**: 200 OK

```json
[
    {
        "userId": "admin",
        "username": "admin",
        "firstName": "System",
        "lastName": "Administrator"
    }
]
```

---

