API Examples

The Device Controller can be accessed via an API to allow customers to send data to the devices in an automated way without going through the portal.
The Device Controller API description is available in the API Explorer.

Examples

Create Action Request

An action request can include different fields per protocol. Therefore, an example request body is given for every protocol.

UDP

Creating UDP action request for a device with deviceId 123456789012345678:

curl -X POST "https://api.1nce.com/management-api/v1/integrate/devices/123456789012345678/actions/UDP"

The request body looks like this:

{
  "payload": "Data to send to the device",
  "payloadType": "STRING",
  "port": 3000,
  "requestMode": "SEND_NOW"
}

CoAP

Creating CoAP action request for a device with deviceId 123456789012345678:

curl -X POST "https://api.1nce.com/management-api/v1/integrate/devices/123456789012345678/actions/COAP"

The request body looks like this:

{
  "payload": "Data to send to the device",
  "payloadType": "STRING",
  "port": 3000,
  "path": "/example?param1=query_param_example",
  "requestType": "POST",
  "requestMode": "SEND_NOW"
}

LwM2M

Creating LwM2M action request for a device with deviceId 123456789012345678:

curl -X POST "https://api.1nce.com/management-api/v1/integrate/devices/123456789012345678/actions/LWM2M"

The request body looks like this:

{
  "action": "write",
  "resourceAddress": "/3311/0/5850",
  "data": "Data to send to the device",
  "requestMode": "SEND_WHEN_ACTIVE"
}

Bulk request

Creating LwM2M action request for multiple devices:

curl -X POST "https://api.1nce.com/management-api/v1/integrate/devices/actions/LWM2M"

The request body looks like this:

{
  "action": "write",
  "resourceAddress": "/3311/0/5850",
  "data": "Data to send to the device",
  "requestMode": "SEND_WHEN_ACTIVE",
  "deviceIds": ["123456789012345678", "123456789012345679", "123456789012345680"]
}

Retry Mechanism

When submitting an action request with SEND_WHEN_ACTIVE mode, the user can specify the parameter sendAttempts in
the request body to restrict how many times the device controller can attempt to send the data to the device.

If all attempts fail, then the action request will be permanently marked with the status FAILED.

The sendAttempts parameter is optional and, if unspecified, defaults to 1.

The maximum number of allowed retries is 5.

⚠️ Please note that this functionality is NOT supported by the UDP protocol.

Request Body Properties

These are the properties of a request body. It specifies when and which message will be sent to the device.

PropertyData TypeDescriptionAvailable for protocol. *Optional
payloadSTRINGData to send to the device.UDP, *CoAP
payloadTypeENUMType of the payload. Values: STRING, BASE64.UDP, *CoAP
portINTEGERCommunication port number of a device.UDP, CoAP
requestModeENUMValues: SEND_NOW, SEND_WHEN_ACTIVE (when a device sends a message). Default: SEND_NOW.*UDP, *CoAP, *LwM2M
pathSTRINGAbsolute path to the resource.CoAP
requestTypeENUMMethod used to send message. Values: GET, POST, PUT, DELETE, PATCH.CoAP
actionENUMLwM2M action name. Values: read, write, execute, observe-start, observe-end.LwM2M
resourceAddressSTRINGLwM2M OMA object resource address.LwM2M
dataSTRINGData to send to the device.*LwM2M
sendAttemptsINTEGERThe maximum number of attempts to send data to the device. Default: 1*CoAP, *LWM2M

Note that for LwM2M there's no possibility to provide a data type for the data property. For LwM2M we support 8 data types: TIME, STRING, BOOLEAN, INTEGER, FLOAT, UNSIGNED_INTEGER, OBJLINK and OPAQUE. The data type depends on the addressed resource. Users should provide the data in a stringified format (base64 encoded string for OPAQUE). In case an invalid data type for a resource is used, an Admin Log will be created.

Response

The API will accept the request with a 202 Accepted response code and a response body containing two properties: id (string) and message (string). The id can be used to track the status of the request or cancel the request (see examples below). The message property contains a confirmation message about the request created. Example:

{
  "id": "trxHeBL0d234fsfds",
  "message": "Action read for resource /3/45/22 successfuly scheduled for device 123456789012345678."
}

Get action request(s)

Get action request(s) endpoints are available to track the status of the request and potentially see the response from a device using CoAP/LwM2M. The requestData property return protocol-specific request data provided when the request was created. For LwM2M the responseData can contain the following properties if available: code (response code), payload (data from the device), for Coap there is also additional field - payloadType (payload type). The payloadType is either TEXT when the response content format is printable, or BASE64 if the content format is not printable or not present at all. In case an error occurs, the field errorMessage is present in the responseData.

By specific requestId

Getting request with id trxHeBL0d234fsfds:

curl -X GET "https://api.1nce.com/management-api/v1/integrate/devices/actions/requests/trxHeBL0d234fsfds"

The response could be 200 OK with body:

{
  "id": "trxHeBL0d234fsfds",
  "status": "SUCCEEDED",
  "deviceId": "123456789012345678",
  "ip": "127.0.0.1",
  "protocol": "LWM2M",
  "created": "2024-08-22T11:14:28.157Z",
  "updated": "2024-08-22T11:14:28.157Z",
  "mode": "SEND_WHEN_ACTIVE",
  "resultData": {
    "code": "205",
    "payload": "Data from the device",
    "payloadType": "TEXT"
  },
  "requestData": {
    "action": "write",
    "resourceAddress": "/3311/0/5850",
    "data": "Data to send to the device",
    "iccid": "123456789012345678",
    "imsi1": "456789012345678",
    "traceId": "1-66c71d94-f8f46a5cb7ae4ac4def607f1",
    "deviceId": "123456789012345678",
    "requestId": "trxHeBL0d234fsfds",
    "customerId": "1234567890",
    "requestMode": "SEND_WHEN_ACTIVE",
    "deviceIpAddress": "127.0.0.1"
  },
  "sendAttemptsLeft": 0,
  "sendAttempts": 3
}

For LwM2M resultData could be

{
  "resultData": {
    "code": "205",
    "payload": "Data from the device"
  }
}

For CoAP resultData printable text:

{
  "resultData": {
    "code": "205",
    "payload": "Data from the device",
    "payloadType": "TEXT"
  }
}

For CoAP resultData binary text:

{
  "resultData": {
    "code": "205",
    "payload": "RGF0YSBmcm9tIHRoZSBkZXZpY2U=",
    "payloadType": "BASE64"
  }
}

By using the optional filter query parameters

There are 2 endpoints available that support query parameters and are meant to query action requests by different statuses:

Active action requests are those which have statuses IN_PROGRESS and SCHEDULED

Archived action requests are those which have statuses CANCELLED,FAILED and SUCCEEDED

Getting multiple archived requests with optional filters (query parameters) specified. For example, to get all LwM2M action requests that succeeded for a device with id 123456789012345678::

curl -X GET "https://api.1nce.com/management-api/v1/integrate/devices/actions/requests/archived?protocol=LWM2M&deviceId=123456789012345678&status=SUCCEEDED"

The response could be 200 OK response code with body:

{
  "items": [
    {
      "id": "2l0mG3WulN1SUvlIcHjvKXBeZk0",
      "status": "SUCCEEDED",
      "deviceId": "123456789012345678",
      "ip": "127.0.0.1",
      "protocol": "LWM2M",
      "created": "2024-08-22T11:14:28.157Z",
      "updated": "2024-08-22T11:14:28.157Z",
      "mode": "SEND_WHEN_ACTIVE",
      "resultData": {
        "code": "205",
        "payload": "Data from the device"
      },
      "requestData": {
        "data": "Data to send to the device",
        "iccid": "123456789012345678",
        "imsi1": "456789012345678",
        "action": "write",
        "traceId": "1-66c71d94-f8f46a5cb7ae4ac4def607f1",
        "deviceId": "123456789012345678",
        "requestId": "2l0mG3WulN1SUvlIcHjvKXBeZk0",
        "customerId": "1234567890",
        "requestMode": "SEND_WHEN_ACTIVE",
        "deviceIpAddress": "127.0.0.1",
        "resourceAddress": "/3311/0/5850"
      },
      "sendAttemptsLeft": 0,
      "sendAttempts": 3
    }
  ],
  "page": 1,
  "pageAmount": 1
}

Getting multiple active requests with optional filters (query parameters) specified. For example, to get all UDP action requests that are scheduled for a device with id 123456789012345678::

curl -X GET "https://api.1nce.com/management-api/v1/integrate/devices/actions/requests/active?protocol=UDP&deviceId=123456789012345678&requestMode=SEND_WHEN_ACTIVE"

The response could be 200 OK response code with body:

{
  "items": [
    {
      "id": "2l0kyyq0zGSuc1C78NKe5Pc3Auk",
      "status": "SCHEDULED",
      "deviceId": "123456789012345678",
      "ip": "127.0.0.1",
      "protocol": "UDP",
      "created": "2024-08-22T11:03:59.267Z",
      "updated": "2024-08-22T11:03:59.267Z",
      "mode": "SEND_WHEN_ACTIVE",
      "requestData": {
        "port": 4343,
        "iccid": "123456789012345678",
        "imsi1": "456789012345678",
        "payload": "Hello world",
        "traceId": "1-66c71b1f-64f6213bb0ea04d2f5784494",
        "deviceId": "123456789012345678",
        "requestId": "2l0kyyq0zGSuc1C78NKe5Pc3Auk",
        "customerId": "1234567890",
        "payloadType": "STRING",
        "requestMode": "SEND_WHEN_ACTIVE",
        "deviceIpAddress": "127.0.0.1"
      },
      "sendAttemptsLeft": 1,
      "sendAttempts": 1
    }
  ],
  "page": 1,
  "pageAmount": 1
}

Delete action request(s)

The delete endpoint is used the cancel requests. This means SCHEDULED requests will be updated to the status CANCELLED. The messages will not be sent to the device.

By specific requestId

Delete request with id trxHeBL0d234fsfds:

curl -X DELETE "https://api.1nce.com/management-api/v1/integrate/devices/actions/requests/trxHeBL0d234fsfds"

The response could be 200 OK response code with body:

{
  "id": "trxHeBL0d234fsfds",
  "status": "CANCELLED"
}

By deviceId

Delete all requests for device with id 123456789012345678:

curl -X DELETE "https://api.1nce.com/management-api/v1/integrate/devices/123456789012345678/actions/requests"

The response could be 200 OK response code with body:

[{
  "id": "trxHeBL0d234fsfds",
  "status": "CANCELLED"
}]