APIs Device to Cloud Lorawan Devices Onboard devices
LoRaWAN devices and gateways are represented as node
instances in oneM2M.
You can onboard them by sending a device provisioning request to the Device Management Orchestrator.
Note: OTAA LoRaWAN 1.0 and OTAA 1.1 are supported. ABP is not supported.
Prerequisites
Before onboarding devices or gateways, the following must be in place:
- D2C Tenant prepared - your tenant is registered and the LORIOT IPE AE exists in DMO (see Get started ).
- LORIOT Account configured in D2C - a LORIOT Account FlexContainer exists in DMO with a valid LORIOT server URL and access token. See the account configuration guide in this section.
- LORIOT Application FlexContainer (for devices) or Network FlexContainer (for gateways) created in DMO under your account. See the application/network configuration guide in this section.
Onboard a LoRaWAN Device
Send a provisioning request with d2c-devicetype:loriot-device and the required loriot- labels.
Device parameters are passed as lbl entries:
d2c-prefixed labels are consumed by the D2C adapter (routing, destination, propagate flag).loriot-prefixed labels are forwarded as-is to the LORIOT network server API. Use the same field names as in the LORIOT device creation API , prefixed withloriot-.
- Request
- Response
POST {{API_URL}}/device-provisioning/request HTTP/2
Accept: application/json
Content-Type: application/json;ty=28
X-M2M-Origin: CmyApplication
X-M2M-RI: 123
Authorization: Bearer {{ACCESS_TOKEN}}
{
"dtiot:noPRt": {
"cnd": "com.telekom.iot.orchestrator.nodeProvisioningRequest",
"rn": "myLoriotProvisioningRequest001",
"opern": 1,
"reqLt": [
{
"ni": "urn:dev:deveui:647FDA000000490C",
"noRNe": "647FDA000000490C",
"profe": "LORIOT-LoRaWAN",
"lbl": [
"d2c-devicetype:loriot-device",
"d2c-loriot-destination:myLoriotAccount/myLoriotApplication",
"loriot-deveui:647FDA000000490C",
"loriot-appeui:647FDA8010000100",
"loriot-appkey:6BC0C4B4F96D97583E42455DCF83D98E",
"loriot-title:myDeviceName",
"loriot-description:MyDeviceDescription"
],
"ndvi": {
"rn": "device-info",
"mgd": 1007,
"man": "myManufacturer",
"dty": "myDeviceType",
"mod": "myModel",
"dlb": "d2c:1.0",
"dc": "a comment"
}
}
]
}
}
HTTP/2 201 Created
date: Fri, 22 May 2026 08:55:26 GMT
content-type: application/json; charset=utf-8
request-context: appId=cid-v1:
x-service-responder: device-management-orchestrator
x-m2m-ri: 123
x-m2m-rvi: 4
x-m2m-ot: 2026-05-22T08:55:26.304Z
x-m2m-rsc: 2001
x-azure-ref: 20260522T085526Z-157794674c588bv2hC1FRAqubc0000000yng00000000nr1d
x-cache: CONFIG_NOCACHE
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
expires: 0
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 0
referrer-policy: no-referrer
x-tardis-traceid: e02c1daad6529714d14a233132313436
vary: Origin
x-kong-upstream-latency: 138
x-kong-proxy-latency: 2
x-kong-request-id: c124506370a5fa4ad225a547eea42631
strict-transport-security: max-age=31536000; includeSubDomains
content-length: 994
x-http2-stream-id: 3
{
"dtiot:noPRt": {
"cnd": "com.telekom.iot.orchestrator.nodeProvisioningRequest",
"rn": "myLoriotProvisioningRequest001",
"opern": 1,
"reqLt": [
{
"ni": "urn:dev:deveui:647FDA000000490C",
"noRNe": "647FDA000000490C",
"profe": "LORIOT-LoRaWAN",
"lbl": [
"d2c-devicetype:loriot-device",
"d2c-loriot-destination:myLoriotAccount/myLoriotApplication",
"loriot-deveui:647FDA000000490C",
"loriot-appeui:647FDA8010000100",
"loriot-appkey:6BC0C4B4F96D97583E42455DCF83D98E",
"loriot-title:myDeviceName",
"loriot-description:myDeviceDescription"
],
"ndvi": {
"rn": "device-info",
"mgd": 1007,
"man": "myManufacturer",
"dty": "myDeviceType",
"mod": "myModel",
"dlb": "d2c:1.0",
"dc": "a comment"
}
}
],
"ty": 28,
"cr": "CmyApplication",
"st": 0,
"ri": "67...2a",
"pi": "671...3f",
"ct": "20260505T091747,984000",
"lt": "20260505T091747,984000"
}
}
Device label reference
The loriot- labels map directly to the fields of the LORIOT device creation API
. Any field supported by LORIOT can be passed as a loriot- label.
| Label | Example | Description |
|---|---|---|
d2c-devicetype | loriot-device | Must be loriot-device |
d2c-loriot-destination | myLoriotAccount/myLoriotApplication | Resource name path: {accountRn}/{applicationRn} |
d2c-propagate | false | false → skip LORIOT call (device not created in LORIOT). Default: true |
loriot-deveui | 647FDA000000490C | Device EUI (8 bytes hex) |
loriot-appeui | 647FDA8010000100 | Application EUI / JoinEUI (8 bytes hex) |
loriot-appkey | 6BC0C4B4F96D97583E42455DCF83D98E | Application key (16 bytes hex) |
loriot-title | myDeviceName | Human-readable device name in LORIOT |
loriot-description | myDeviceDescription | Free-text description |
loriot-deviceTemplateId | null | LORIOT device template reference |
Label encoding rule:
Colons:in label values must be replaced with-(e.g.loriot-MAC:00-08-00-4A-C7-46).
Onboard a LoRaWAN Gateway
Send a provisioning request with d2c-devicetype:loriot-gateway and the required loriot- labels.
- Request
- Response
POST {{API_URL}}/device-provisioning/request HTTP/2
Accept: application/json
Content-Type: application/json;ty=28
X-M2M-Origin: CmyApplication
X-M2M-RI: 123
Authorization: Bearer {{ACCESS_TOKEN}}
{
"dtiot:noPRt": {
"cnd": "com.telekom.iot.orchestrator.nodeProvisioningRequest",
"rn": "myLoriotProvisioningRequest002",
"opern": 1,
"reqLt": [
{
"ni": "urn:dev:gweui:0080000000017B1B",
"noRNe": "0080000000017B1B",
"profe": "LORIOT-LoRaWAN",
"lbl": [
"d2c-devicetype:loriot-gateway",
"d2c-loriot-destination:myLoriotAccount/myLoriotNetwork",
"loriot-MAC:00-08-00-4A-C7-46",
"loriot-base:pktfwd",
"loriot-bus:UDP",
"loriot-card:",
"loriot-concentrator:pktfwd",
"loriot-model:semtech",
"loriot-location.lat:49.86552435916023",
"loriot-location.lon:8.624739290340981",
"loriot-customEUI:0080000000017B1B"
],
"ndvi": {
"rn": "device-info",
"mgd": 1007,
"man": "Semtech",
"dty": "LoRaWAN Gateway",
"mod": "SX1301",
"dc": "outdoor gateway"
}
}
]
}
}
HTTP/2 201 Created
date: Fri, 22 May 2026 08:55:26 GMT
content-type: application/json; charset=utf-8
request-context: appId=cid-v1:
x-service-responder: device-management-orchestrator
x-m2m-ri: 123
x-m2m-rvi: 4
x-m2m-ot: 2026-05-22T08:55:26.304Z
x-m2m-rsc: 2001
x-azure-ref: 20260522T085526Z-157794674c588bv2hC1FRAqubc0000000yng00000000nr1d
x-cache: CONFIG_NOCACHE
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
expires: 0
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 0
referrer-policy: no-referrer
x-tardis-traceid: e02c1daad6529714d14a233132313436
vary: Origin
x-kong-upstream-latency: 138
x-kong-proxy-latency: 2
x-kong-request-id: c124506370a5fa4ad225a547eea42631
strict-transport-security: max-age=31536000; includeSubDomains
content-length: 994
x-http2-stream-id: 3
{
"dtiot:noPRt": {
"cnd": "com.telekom.iot.orchestrator.nodeProvisioningRequest",
"rn": "myLoriotProvisioningRequest002",
"opern": 1,
"reqLt": [
{
"ni": "urn:dev:gweui:0080000000017B1B",
"noRNe": "0080000000017B1B",
"profe": "LORIOT-LoRaWAN",
"lbl": [
"d2c-devicetype:loriot-gateway",
"d2c-loriot-destination:myLoriotAccount/myLoriotNetwork",
"loriot-MAC:00-08-00-4A-C7-46",
"loriot-base:pktfwd",
"loriot-bus:UDP",
"loriot-card:",
"loriot-concentrator:pktfwd",
"loriot-model:semtech",
"loriot-location.lat:49.86552435916023",
"loriot-location.lon:8.624739290340981",
"loriot-customEUI:0080000000017B1B"
],
"ndvi": {
"rn": "device-info",
"mgd": 1007,
"man": "Semtech",
"dty": "LoRaWAN Gateway",
"mod": "SX1301",
"dc": "outdoor gateway"
}
}
],
"ty": 28,
"cr": "CmyApplication",
"st": 0,
"ri": "67...2b",
"pi": "671...3f",
"ct": "20260505T091747,984000",
"lt": "20260505T091747,984000"
}
}
Gateway label reference
The loriot- labels map directly to the fields of the LORIOT gateway creation API
. Any field supported by LORIOT can be passed as a loriot- label.
| Label | Mandatory | Example | Description |
|---|---|---|---|
d2c-devicetype | yes | loriot-gateway | Must be loriot-gateway |
d2c-loriot-destination | yes | myLoriotAccount/myLoriotNetwork | Resource name path: {accountRn}/{networkRn} |
d2c-propagate | no | false | false → skip LORIOT call (gateway not created in LORIOT). Default: true |
loriot-MAC | yes | 00-08-00-4A-C7-46 | Gateway MAC address (6 bytes, dashes instead of colons) |
loriot-location.lat | yes | 49.86552435916023 | Latitude (dot as decimal separator) |
loriot-location.lon | yes | 8.624739290340981 | Longitude (dot as decimal separator) |
loriot-base | no | pktfwd | Packet forwarder type |
loriot-bus | no | UDP | Bus type |
loriot-card | no | | Hardware card identifier |
loriot-concentrator | no | pktfwd | Concentrator type |
loriot-model | no | semtech | Gateway hardware model |
loriot-customEUI | no | 0080000000017B1B | Custom EUI override (8 bytes hex) |
Label encoding rule:
Colons:in label values must be replaced with-(e.g.loriot-MAC:00-08-00-4A-C7-46).
Delete a LoRaWAN Device or Gateway
A device or gateway can be deleted by deleting its node
. The system will clean up all related objects and, depending on the d2c-propagate label, also remove the device or gateway from the LORIOT network server.
Propagation behaviour
When deleting a device or gateway, the system checks the d2c-propagate label that was set during onboarding:
d2c-propagate value | Behaviour |
|---|---|
true (default) | The device/gateway is deleted from both DMO and the LORIOT network server. |
false | The device/gateway is deleted from DMO only. It is not removed from the LORIOT network server. |
Tip: If the device or gateway was already removed from LORIOT (e.g. manually), the deletion is treated as idempotent — no error is returned.
Delete a device
- Request
- Response
DELETE {{API_URL}}/myLoriot-Device01 HTTP/2
Accept: application/json
Content-Type: application/json
X-M2M-Origin: CmyApplication
X-M2M-RI: 123
Authorization: Bearer {{ACCESS_TOKEN}}
HTTP/1.1 200 OK
Date: Thu, 21 Nov 2025 09:44:23 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 0
Connection: close
Strict-Transport-Security: max-age=31536000; includeSubDomains
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block
Referrer-Policy: no-referrer
vary: Origin
Delete a gateway
- Request
- Response
DELETE {{API_URL}}/myLoriot-Gateway01 HTTP/2
Accept: application/json
Content-Type: application/json
X-M2M-Origin: CmyApplication
X-M2M-RI: 123
Authorization: Bearer {{ACCESS_TOKEN}}
HTTP/1.1 200 OK
Date: Thu, 21 Nov 2025 09:44:23 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 0
Connection: close
Strict-Transport-Security: max-age=31536000; includeSubDomains
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block
Referrer-Policy: no-referrer
vary: Origin
Device provisioning response
The system processes your request asynchronously. The result is available in the /device-provisioning/response container:
- Request
- Response
GET {{API_URL}}/device-provisioning/response/{{responseToRequest-67...56}} HTTP/2
Accept: application/json
Content-Type: application/json
X-M2M-Origin: CmyApplication
X-M2M-RI: 123
Authorization: Bearer {{ACCESS_TOKEN}}
HTTP/1.1 200 OK
date: Fri, 22 May 2026 08:55:26 GMT
content-type: application/json; charset=utf-8
request-context: appId=cid-v1:
x-service-responder: device-management-orchestrator
x-m2m-ri: 123
x-m2m-rvi: 4
x-m2m-ot: 2026-05-22T08:55:26.304Z
x-m2m-rsc: 2001
x-azure-ref: 20260522T085526Z-157794674c588bv2hC1FRAqubc0000000yng00000000nr1d
x-cache: CONFIG_NOCACHE
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
expires: 0
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 0
referrer-policy: no-referrer
x-tardis-traceid: e02c1daad6529714d14a233132313436
vary: Origin
x-kong-upstream-latency: 138
x-kong-proxy-latency: 2
x-kong-request-id: c124506370a5fa4ad225a547eea42631
strict-transport-security: max-age=31536000; includeSubDomains
content-length: 994
x-http2-stream-id: 3
{
"dtiot:prRRe": {
"cnd": "com.telekom.iot.orchestrator.provisioningRequestResponse",
"rn": "responseToRequest-67...56",
"geEMe": "Total to be provisioned: 1; Successfully processed: 1; Errors: 0",
"reqRD": "67...56",
"resSs": 1,
"ty": 28,
"cr": "CmyApplication",
"ri": "67...ba7",
"pi": "67...f32",
"ct": "20260505T091748,000000",
"lt": "20260505T091748,000000"
}
}
Parameters:
resourceName: use the prefixresponseToRequest-followed by theri(resource ID) from the provisioning request response (e.g.responseToRequest-67...2a).responseStatus:1= success,2= error (seegeneralErrorMessage/individualErrorMessages).
Error cases
| Status Code | Condition | Error Message |
|---|---|---|
| 400 | nodeResourceName is missing | nodeResourceName is missing |
| 400 | Unknown d2c-devicetype label value | Unknown device type: ... |
| 400 | d2c-devicetype label is missing | missing d2c-devicetype label |
| 422 | d2c-loriot-destination label missing | Missing destination configuration: d2c-loriot-destination label not found |
| 422 | d2c-loriot-destination format invalid (device) | Invalid destination format: expected format is accountResourceName/applicationResourceName |
| 422 | d2c-loriot-destination format invalid (gateway) | Invalid destination format: expected format is accountResourceName/networkResourceName |
| 422 | Network/application not configured | Network not configured in adapter for resource: {resourceName} |
| 422 | Account credentials not configured | Account not configured in adapter for resource: {resourceName} |
| 422 | LORIOT rejects the device | Device registration failed: LORIOT returned HTTP {statusCode} |
| 422 | LORIOT rejects the gateway | Gateway registration failed: LORIOT returned HTTP {statusCode} |
Next step
Start sending and receiving IoT data from your LoRaWAN device.