# LitmusEdgeManager 2.31.x API Documentation/Edge Lifecycle Management/Licenses - LE, LEM, LUNS API Docs

## License Summary - Status

**GET** `{{LEM_URL}}/api/v1/device-license-pool/stats?projectId={{project_id}}`

# License Summary -- Status

Returns counts of licenses by state in the project pool: `active` / `used` / `unused` / `expired`.
## Endpoint

```http
GET {{LEM_URL}}/api/v1/device-license-pool/stats?projectId={{project_id}}
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Response

```json
{ "active": 1, "used": 1, "unused": 0, "expired": 0 }
```

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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
{
    "active": 1,
    "used": 1,
    "unused": 0,
    "expired": 0
}
```

---

## Licenses List SKUs

**GET** `{{LEM_URL}}/api/v1/device-license-pool/skus?projectId={{project_id}}`

# Licenses List SKUs

Returns the SKUs allocated to the project's license pool, with count per SKU and the `isCore` flag.
## Endpoint

```http
GET {{LEM_URL}}/api/v1/device-license-pool/skus?projectId={{project_id}}
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Response

`200 OK` -- `application/json`

| Field         | Type    | Description                                          |
|---------------|---------|------------------------------------------------------|
| `licenseSku`  | string  | SKU identifier (e.g. `litmusedge-scale-nl`).         |
| `count`       | integer | Number of license entitlements of this SKU.           |
| `isCore`      | boolean | True for the core LE license SKU.                     |

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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
[
    {
        "licenseSku": "litmusedge-scale-nl",
        "count": 1,
        "isCore": true,
        "core": true
    }
]
```

---

## Used Licenses

**GET** `{{LEM_URL}}/api/v1/device-license-pool/used?projectId={{project_id}}`

# Used Licenses

Returns paginated list of licenses currently used by devices in the project pool, with feature expiry, MAC address, and device friendly name.
## Endpoint

```http
GET {{LEM_URL}}/api/v1/device-license-pool/used?projectId={{project_id}}
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Response

`200 OK` -- `application/json`. Paged. Each `elements[]` entry carries `projectId`, `deviceId`, `deviceName`, `deviceFriendlyName`, `macAddress`, `expiryFeatureDate`, and an array of `licenses[]` records.

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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
{
    "pageNum": 0,
    "pagesCount": 1,
    "size": 1,
    "totalSize": 1,
    "elements": [
        {
            "projectId": "39abjcmqdc6r4gsctj7zjufnv",
            "deviceId": "88mqx2r8dv6fgsc968ybvw43k",
            "deviceName": "litmus-edge-005056b98eb5",
            "deviceFriendlyName": "API Portal (00:50:56:b9:8e:b5)",
            "macAddress": "00:50:56:b9:8e:b5",
            "expiryFeatureDate": 1786233599000,
            "licenses": [
                {
                    "id": "2e4392ee-2d75-4850-994f-13f36c1fdbc7",
                    "companyName": null,
                    "projectId": "39abjcmqdc6r4gsctj7zjufnv",
                    "projectName": null,
                    "deviceId": "88mqx2r8dv6fgsc968ybvw43k",
                    "deviceName": null,
                    "deviceFriendlyName": null,
                    "macAddress": null,
                    "licenseKey": "0000-0000-0000-0000",
                    "licenseSku": "litmusedge-scale-nl",
                    "activationDate": null,
                    "expiryDate": 1786233599000,
                    "isCore": true,
                    "isTrial": false,
                    "status": "OK",
                    "origin": "EDGE",
                    "reservedUntil": null,
                    "votmSensorCount": null,
                    "expiryFeatureDate": 1786233599000,
                    "trial": false,
                    "core": true
                }
            ]
        }
    ]
}
```

---

## Edge License Features

**GET** `{{LEM_URL}}/api/v1/feature`

# Edge License Features

Returns the **LEM-level** feature catalog (server features such as `EdgeEvents`, `DigitalTwin`, `OmaRegistry`). Each carries a type (`STABLE`/`EXPERIMENTAL`) and an `enabled` flag.
## Endpoint

```http
GET {{LEM_URL}}/api/v1/feature
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Response

`200 OK` -- `application/json`. Array of feature objects with `entryID`, `name`, `description`, `type`, `enabled` (1/0), `createdOn`, `updatedOn`.

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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
[
    {
        "entryID": 1,
        "name": "EdgeEvents",
        "description": "Edge events management",
        "type": "EXPERIMENTAL",
        "enabled": 1,
        "createdOn": 1597449600000,
        "updatedOn": null
    },
    {
        "entryID": 2,
        "name": "DigitalTwin",
        "description": "Asset Management",
        "type": "EXPERIMENTAL",
        "enabled": 0,
        "createdOn": 1597449600000,
        "updatedOn": null
    },
    {
        "entryID": 3,
        "name": "OmaRegistry",
        "description": "OMA Registry management",
        "type": "STABLE",
        "enabled": 1,
        "createdOn": 1597449600000,
        "updatedOn": null
    },
    {
        "entryID": 4,
        "name": "RemoteUI",
        "description": "Edge device remote UI",
        "type": "STABLE",
        "enabled": 1,
        "createdOn": 1613779200000,
        "updatedOn": null
    },
    {
        "entryID": 5,
        "name": "ParameterizedTemplates",
        "description": "Edge device parameterized templates management",
        "type": "STABLE",
        "enabled": 1,
        "createdOn": 1615420800000,
        "updatedOn": null
    },
    {
        "entryID": 6,
        "name": "EdgeRemoteNetwork",
        "description": "Edge Remote Networks management",
        "type": "STABLE",
        "enabled": 1,
        "createdOn": 1616716800000,
        "updatedOn": null
    }
]
```

---

## License Features

**GET** `{{LEM_URL}}/api/v1/licenses2/features`

# License Features

Returns the **LEM license's** allowed features with expiry. Different from `Edge License Features` -- this is what the LEM license itself unlocks (`core`, `catalog`, ...), not the feature catalog.
## Endpoint

```http
GET {{LEM_URL}}/api/v1/licenses2/features
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Response

`200 OK` -- `application/json`. Each entry: `name`, `desc`, `expires`, `expiresTimestamp`, `count` (`-1` unmetered), `limited`, `enabled`.

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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
[
    {
        "name": "core",
        "desc": "core",
        "expires": "2025-09-02T00:00:00Z",
        "expiresTimestamp": 1756771200000,
        "count": -1,
        "limited": false,
        "enabled": true
    },
    {
        "name": "catalog",
        "desc": "catalog",
        "expires": "2025-09-02T00:00:00Z",
        "expiresTimestamp": 1756771200000,
        "count": -1,
        "limited": false,
        "enabled": true
    }
]
```

---

## Upload License CSV

**POST** `{{LEM_URL}}/api/v1/device-license-pool/csv?projectId={{project_id}}`

# Upload License CSV

Bulk-imports licenses into the project pool from a CSV file. Multipart form-data; one file in the `file` part.
## Endpoint

```http
POST {{LEM_URL}}/api/v1/device-license-pool/csv?projectId={{project_id}}
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Request body

Multipart `form-data` with a single `file` part containing the CSV.

## Response

`200 OK` -- `application/json`

```json
{ "code": "S", "message": null, "messageDetails": null }
```

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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.


### Request Body

### Response

**Status**: 200 OK

```json
{
    "code": "S",
    "message": null,
    "messageDetails": null
}
```

---

## Generate Report to CSV

**POST** `{{LEM_URL}}/api/v1/device-license-pool/all/csv?projectId={{project_id}}`

# Generate Report to CSV

Generates a license-usage report for the specified devices and returns it as a CSV string. Pass `deviceIds: []` to include every device in the project.
## Endpoint

```http
POST {{LEM_URL}}/api/v1/device-license-pool/all/csv?projectId={{project_id}}
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Request body

```json
{ "deviceIds": ["{{edge_device_id}}"] }
```

## Response

`200 OK` -- `text/csv`. Columns: `Project ID`, `Device ID`, `Device name`, `Device friendly name`, `Device MAC address`, `License key`, `SKU`, `Activation date`, `Expiry date`, `Feature Expiry Date`, `Is core`, `Is trial`, `Status`.

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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.


### Request Body

```json
{
    "deviceIds": [
        "{{edge_device_id}}"
    ]
}
```

### Response

**Status**: 200 OK

```plain
"Project ID","Device ID","Device name","Device friendly name","Device MAC address","License key","SKU","Activation date","Expiry date","Feature Expiry Date","Is core","Is trial","Status"
"39abjcmqdc6r4gsctj7zjufnv","88mqx2r8dv6fgsc968ybvw43k","litmus-edge-005056b98eb5","API Portal (00:50:56:b9:8e:b5)","00:50:56:b9:8e:b5","0000-0000-0000-0000","litmusedge-scale-nl",,"2026-08-08T23:59:59","2026-08-08T23:59:59","true","false","OK"

```

---

## Generate Report to Email

**POST** `{{LEM_URL}}/api/v1/device-license-pool/all/csv/email?projectId={{project_id}}`

# Generate Report to Email

Same report as `Generate Report to CSV` but **emails** it to the specified addresses instead of returning it.
## Endpoint

```http
POST {{LEM_URL}}/api/v1/device-license-pool/all/csv/email?projectId={{project_id}}
```
## Authentication

HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Request body

```json
{
  "deviceIds": ["{{edge_device_id}}"],
  "emails": ["parth.shah@litmus.io"]
}
```

## Errors

| HTTP status         | When it happens                                                                |
|---------------------|--------------------------------------------------------------------------------|
| `400 Bad Request`   | Missing or malformed query/body parameter.                                     |
| `401 Unauthorized`  | Missing or invalid credentials.                                                |
| `403 Forbidden`     | Token lacks permission for this operation.                                     |
| `404 Not Found`     | Target entity does not exist.                                                  |
| `5xx`               | Service is unreachable, restarting, or internally errored. Inspect 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.


### Request Body

```json
{
    "deviceIds": [
        "{{edge_device_id}}"
    ],
    "emails": [
        "parth.shah@litmus.io"
    ]
}
```

---

