Downlinks

Downlinks are messages sent from KPN Things to a device. The API provides two main approaches to sending downlinks:

  1. Actuator-style downlinks (recommended for most cases)

    • Use the /downlinks resource.

    • You provide a high-level command, and KPN Things translates it into the correct low-level protocol format using the configured encoder for your device.

    • This approach is safer and easier to use, since KPN Things handles protocol-specific details.

  2. Connection-specific downlinks (advanced usage)

    • Use protocol-specific APIs such as /http/downlinks, /mqtt/downlinks, /sms/downlinks, /lora/downlinks, or /digitalmatter/downlinks.

    • You send downlink payloads in the native format of the underlying connection type.

    • This allows greater flexibility but comes with risks: you may send commands that disrupt device operation (for example, disabling communication). Use these APIs only when actuator-style downlinks do not meet your requirements.

Choosing the Right API

  • Use actuator-style downlinks whenever possible. They are protocol-agnostic, simpler, and safer.

  • Use connection-specific APIs if you need full control over the payload format or protocol-specific features.


Download the /downlinks specification

get
Authorizations
Query parameters
cursorstring · cursorOptional

String that encodes all necessary information to retrieve a page.

limitintegerOptional

Limit the number of results (per page).

Default: 50
sortstringOptional

Sorting fields separated by comma. Default order is Ascending (ASC), minus(-) should be used in front of field name for Descending (DESC) order.

Example: createdAt,-name
qstring · min: 1Optional

Include only downlinks whose tagValue, networkId or message match the search term. The tagValue must match exactly. The networkId and message may match partially. Matching for every query parameter is done case-sensitively.

createdBeforestring · date-timeOptional

Include only downlinks created before the provided date and time. The date-time must be in ISO 8601 format.

createdSincestring · date-timeOptional

Include only downlinks created at or after the provided date and time. The date-time must be in ISO 8601 format.

modifiedBeforestring · date-timeOptional

Include only downlinks modified before the provided date and time. The date-time must be in ISO 8601 format.

modifiedSincestring · date-timeOptional

Include only downlinks modified at or after the provided date and time. The date-time must be in ISO 8601 format.

Responses
200

Page of filtered downlinks. Only downlinks that are accessible to the caller are returned.

application/json
Responseall of

A paginated list of downlinks

and
get
GET /downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

Page of filtered downlinks. Only downlinks that are accessible to the caller are returned.

No content

Create a new downlink

post
Authorizations
Body

A request to create a downlink to be sent to an IoT device.

externalReferencestringOptional

Optional external identifier that can be provided by API caller to reference the downlink with. Must be unique for the client that owns the device.

Example: someExternalReference123
instructionall ofRequired
and
anyOptional

Instruction in SenML format to send to the device. The provided instruction must contain a bn that identifies the device. The SenML instruction will be transformed into a protocol specific downlink using the configured encoder.

Example: [{"bn":"urn:dev:ow:10e2073a01080063:"},{"n":"temperature","u":"Cel","v":23.1},{"n":"heating","u":"/","v":1},{"n":"fan","u":"/","v":0}]
methodone ofRequired
or
or
or
retryLimitintegerOptional

The maximum number of retries that should be performed for the downlink.

Default: 0Example: 3
feedbackTimeoutall ofOptional
string · durationOptional

Duration that supports a subset of ISO 8601, where only days, hours, minutes, and seconds can be specified. Days are treated as exactly 24 hours, thus ignoring daylight savings effects.

Pattern: ^P(?:(\d+D)(T(?:(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)?)|T(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)$
and
anyOptional

The duration after which feedback is expected for the downlink. Must be at least 10 minutes.

Example: PT25H
dryRunbooleanOptional

Indicates if this is a dry run.

Default: false
Responses
201

Downlink has been successfully created.

application/json
post
POST /downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Content-Type: application/json
Accept: */*
201

Downlink has been successfully created.

No content

get
Authorizations
Path parameters
downlinkIdstringRequired

Downlink identifier

Responses
200

Downlink has been successfully fetched.

application/json
get
GET /downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

Downlink has been successfully fetched.

No content

delete
Authorizations
Path parameters
downlinkIdstringRequired

Downlink identifier

Query parameters
forcedbooleanOptional

Whether to force the cancellation of the downlink or not.

Default: false
Responses
202

Downlink cancellation has been accepted and scheduled for further downstream processing.

No content

delete
DELETE /downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*

No content


Download the /http/downlinks specification

get
Authorizations
Query parameters
cursorstring · cursorOptional

String that encodes all necessary information to retrieve a page.

limitintegerOptional

Limit the number of results (per page).

Default: 50
sortstringOptional

Sorting fields separated by comma. Default order is Ascending (ASC), minus(-) should be used in front of field name for Descending (DESC) order.

Example: createdAt,-name
deviceIdstring · uuidOptional

Include only downlinks for the device with the provided deviceId. The deviceId must match exactly.

createdBeforestring · date-timeOptional

Include only HTTP downlinks created before the provided date and time. The date-time must be in ISO 8601 format.

createdSincestring · date-timeOptional

Include only HTTP downlinks created at or after the provided date and time. The date-time must be in ISO 8601 format.

modifiedBeforestring · date-timeOptional

Include only HTTP downlinks modified before the provided date and time. The date-time must be in ISO 8601 format.

modifiedSincestring · date-timeOptional

Include only HTTP downlinks modified at or after the provided date and time. The date-time must be in ISO 8601 format.

statusstring · enumOptional

Include only HTTP downlinks whose status matches the provided status. The status must match exactly.

Possible values:
Responses
200

Page of filtered HTTP downlinks. Only downlinks that are accessible to the caller are returned.

application/json
Responseall of

A paginated list of HTTP downlinks.

and
get
GET /http/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

Page of filtered HTTP downlinks. Only downlinks that are accessible to the caller are returned.

No content

Create a new HTTP downlink

post
Authorizations
Body

A downlink that is sent to an HTTP device.

idstring · uuidRead-onlyOptional

Unique identifier for the downlink.

Example: 12345678-1234-1234-1234-123456789012
messageone ofRequired

The message of the HTTP downlink.

or
statusstringRead-onlyOptional

The status of the downlink. Known values include: PENDING, EXECUTING and DONE

deviceIdstringRequired

The device identifier which this downlink is targeting.

Example: 1dca2857-da8c-4e47-991f-f7d13a563e45
createdAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was created in the system.

Example: 2025-01-02T12:04:32.982Z
modifiedAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was last modified in the system.

Example: 2025-01-02T12:04:32.982Z
feedbackTimeoutall ofRequired
string · durationOptional

Duration that supports a subset of ISO 8601, where only days, hours, minutes, and seconds can be specified. Days are treated as exactly 24 hours, thus ignoring daylight savings effects.

Pattern: ^P(?:(\d+D)(T(?:(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)?)|T(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)$
and
anyOptional

The duration after which feedback is expected for the downlink. Must be at least 10 minutes.

Example: PT25H
dryRunbooleanOptional

Indicates if this is a dry run.

Default: false
lastFailureReasonstringRead-onlyOptional

The failure reason of the HTTP downlink. Known values include: CANCELLED, TIMEOUT and EVICTED

Responses
201

HTTP downlink has been successfully created.

application/json
post
POST /http/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Content-Type: application/json
Accept: */*
201

HTTP downlink has been successfully created.

No content

get
Authorizations
Path parameters
downlinkIdstring · uuidRequired

The ID of the HTTP downlink to retrieve.

Responses
200

The requested HTTP downlink.

application/json
get
GET /http/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

The requested HTTP downlink.

No content

delete
Authorizations
Path parameters
downlinkIdstring · uuidRequired

HTTP downlink identifier.

Query parameters
forcedbooleanOptional

Whether to force the cancellation of the HTTP downlink or not.

Default: false
Responses
202

HTTP downlink cancellation has been accepted and scheduled for further downstream processing.

No content

delete
DELETE /http/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*

No content


Download the /lora/downlinks specification

get
Authorizations
Query parameters
cursorstring · cursorOptional

String that encodes all necessary information to retrieve a page.

limitintegerOptional

Limit the number of results (per page).

Default: 50
sortstringOptional

Sorting fields separated by comma. Default order is Ascending (ASC), minus(-) should be used in front of field name for Descending (DESC) order.

Example: createdAt,-name
deviceIdstring · uuidOptional

Include only downlinks for the device with the provided deviceId. The deviceId must match exactly.

createdBeforestring · date-timeOptional

Include only LoRa downlinks created before the provided date and time. The date-time must be in ISO 8601 format.

createdSincestring · date-timeOptional

Include only LoRa downlinks at or after the provided date and time. The date-time must be in ISO 8601 format.

modifiedBeforestring · date-timeOptional

Include only LoRa downlinks modified before the provided date and time. The date-time must be in ISO 8601 format.

modifiedSincestring · date-timeOptional

Include only LoRa downlinks modified at of after the provided date and time. The date-time must be in ISO 8601 format.

statusstring · enumOptional

Include only LoRa downlinks whose status matches the provided status. The status must match exactly.

Possible values:
Responses
200

Page of filtered LoRa downlinks. Only downlinks that are accessible to the caller are returned.

application/json
Responseall of

A paginated list of LoRa downlinks.

and
get
GET /lora/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

Page of filtered LoRa downlinks. Only downlinks that are accessible to the caller are returned.

No content

Create a new LoRa downlink

post
Authorizations
Body

A downlink that is sent to a LoRa IoT device.

idstring · uuidRead-onlyOptional

Unique identifier for the downlink.

Example: 12345678-1234-1234-1234-123456789012
statusstringRead-onlyOptional

The status of the LoRa downlink. Known values include: PENDING, EXECUTING and DONE

retryLimitintegerOptional

The maximum number of retries that should be performed for the downlink.

Default: 0Example: 3
retryCountintegerOptional

The number of retries that have been performed for the downlink.

Example: 0
deviceIdstringRequired

The device identifier which this downlink is targeting.

Example: 014388b0-5244-4ced-9fbf-1088c1c0d328
createdAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was created in the system.

Example: 2025-04-01T00:00:00.000Z
modifiedAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was last modified in the system.

Example: 2025-05-01T00:00:00.000Z
feedbackTimeoutall ofRequired
string · durationOptional

Duration that supports a subset of ISO 8601, where only days, hours, minutes, and seconds can be specified. Days are treated as exactly 24 hours, thus ignoring daylight savings effects.

Pattern: ^P(?:(\d+D)(T(?:(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)?)|T(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)$
and
anyOptional

The duration after which feedback is expected for the downlink. Must be at least 10 minutes.

Example: PT25H
dryRunbooleanOptional

Indicates if this is a dry run.

Default: false
lastFailureReasonstringRead-onlyOptional

The failure reason of the LoRa downlink. Known values include: CANCELLED, FEEDBACK_TIMEOUT, NOT_ACKNOWLEDGED_BY_DEVICE, FAILED_TO_TRANSMIT_TO_DEVICE, FAILED_TO_ENQUEUE_FOR_TRANSMISSION and EVICTED

Responses
201

LoRa downlink has been successfully created.

application/json
post
POST /lora/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Content-Type: application/json
Accept: */*
201

LoRa downlink has been successfully created.

No content

get
Authorizations
Path parameters
downlinkIdstring · uuidRequired

LoRa downlink identifier.

Responses
200

The LoRa downlink.

application/json
get
GET /lora/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

The LoRa downlink.

No content

delete
Authorizations
Path parameters
downlinkIdstring · uuidRequired

LoRa downlink identifier.

Query parameters
forcedbooleanOptional

Whether to force the cancellation of the LoRa downlink or not.

Default: false
Responses
202

LoRa downlink cancellation has been accepted and scheduled for further downstream processing.

No content

delete
DELETE /lora/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*

No content

Download the /sms/downlinks specification

get
Authorizations
Query parameters
cursorstring · cursorOptional

String that encodes all necessary information to retrieve a page.

limitintegerOptional

Limit the number of results (per page).

Default: 50
sortstringOptional

Sorting fields separated by comma. Default order is Ascending (ASC), minus(-) should be used in front of field name for Descending (DESC) order.

Example: createdAt,-name
deviceIdstring · uuidOptional

Include only downlinks for the device with the provided deviceId. The deviceId must match exactly.

createdBeforestring · date-timeOptional

Include only SMS downlinks created before the provided date and time. The date-time must be in ISO 8601 format.

createdSincestring · date-timeOptional

Include only SMS downlinks at or after the provided date and time. The date-time must be in ISO 8601 format.

modifiedBeforestring · date-timeOptional

Include only SMS downlinks modified before the provided date and time. The date-time must be in ISO 8601 format.

modifiedSincestring · date-timeOptional

Include only SMS downlinks modified at of after the provided date and time. The date-time must be in ISO 8601 format.

statusstringRead-onlyOptional

The status of the downlink. Known values include: PENDING, EXECUTING and DONE

Responses
200

Page of filtered SMS downlinks. Only downlinks that are accessible to the caller are returned.

application/json
Responseall of

A paginated list of SMS downlinks.

and
get
GET /sms/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

Page of filtered SMS downlinks. Only downlinks that are accessible to the caller are returned.

No content

Create a new SMS downlink

post
Authorizations
Body

A downlink that is sent to a mobile device.

idstring · uuidRead-onlyOptional

Unique identifier for the downlink.

Example: 12345678-1234-1234-1234-123456789012
iccIdstringRead-onlyOptional

The ICCID of the SIM card in the mobile device.

Example: 8901234567890123456
statusstringRead-onlyOptional

The status of the downlink. Known values include: PENDING, EXECUTING and DONE

deviceIdstringRequired

The device identifier which this downlink is targeting.

Example: 4fa05eed-4db6-4fe5-8cb1-744893286db1
createdAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was created in the system.

Example: 2025-01-02T12:04:32.982Z
modifiedAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was last modified in the system.

Example: 2025-01-02T12:04:32.982Z
retryLimitintegerOptional

The maximum number of retries that should be performed for the downlink.

Default: 0Example: 3
retryCountintegerRead-onlyOptional

The number of retries that have been performed for the downlink.

Example: 0
feedbackTimeoutall ofRequired
string · durationOptional

Duration that supports a subset of ISO 8601, where only days, hours, minutes, and seconds can be specified. Days are treated as exactly 24 hours, thus ignoring daylight savings effects.

Pattern: ^P(?:(\d+D)(T(?:(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)?)|T(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)$
and
anyOptional

The duration after which feedback is expected for the downlink. Must be at least 10 minutes.

Example: PT25H
dryRunbooleanOptional

Indicates if this is a dry run.

Default: false
lastFailureReasonstringRead-onlyOptional

The failure reason of the SMS downlink. Known values include: CANCELLED, FAILURE_TO_TRANSMIT_TO_DEVICE, FAILURE_TO_ENQUEUE_FOR_TRANSMISSION, FEEDBACK_TIMEOUT and EVICTED

Responses
201

SMS downlink has been successfully created.

application/json
post
POST /sms/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Content-Type: application/json
Accept: */*
201

SMS downlink has been successfully created.

No content

get
Authorizations
Path parameters
downlinkIdstring · uuidRequired

SMS downlink identifier.

Responses
200

The SMS downlink.

application/json
get
GET /sms/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

The SMS downlink.

No content

delete
Authorizations
Path parameters
downlinkIdstring · uuidRequired

SMS downlink identifier.

Query parameters
forcedbooleanOptional

Whether to force the cancellation of the SMS downlink or not.

Default: false
Responses
202

SMS downlink cancellation has been accepted and scheduled for further downstream processing.

No content

delete
DELETE /sms/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*

No content


Download the /mqtt/downlinks specification

get
Authorizations
Query parameters
cursorstring · cursorOptional

String that encodes all necessary information to retrieve a page.

limitintegerOptional

Limit the number of results (per page).

Default: 50
sortstringOptional

Sorting fields separated by comma. Default order is Ascending (ASC), minus(-) should be used in front of field name for Descending (DESC) order.

Example: createdAt,-name
deviceIdstring · uuidOptional

Include only downlinks for the device with the provided deviceId. The deviceId must match exactly.

createdBeforestring · date-timeOptional

Include only MQTT downlinks created before the provided date and time. The date-time must be in ISO 8601 format.

createdSincestring · date-timeOptional

Include only MQTT downlinks created at or after the provided date and time. The date-time must be in ISO 8601 format.

modifiedBeforestring · date-timeOptional

Include only MQTT downlinks modified before the provided date and time. The date-time must be in ISO 8601 format.

modifiedSincestring · date-timeOptional

Include only MQTT downlinks modified at or after the provided date and time. The date-time must be in ISO 8601 format.

statusstringRead-onlyOptional

The status of the downlink. Known values include: PENDING, EXECUTING and DONE

Responses
200

Page of filtered MQTT downlinks. Only downlinks that are accessible to the caller are returned.

application/json
Responseall of

A paginated list of MQTT downlinks.

and
get
GET /mqtt/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

Page of filtered MQTT downlinks. Only downlinks that are accessible to the caller are returned.

No content

Create a new MQTT downlink

post
Authorizations
Body

A downlink that is sent to an MQTT device.

idstring · uuidRead-onlyOptional

Unique identifier for the downlink.

Example: 12345678-1234-1234-1234-123456789012
statusstringRead-onlyOptional

The status of the downlink. Known values include: PENDING, EXECUTING and DONE

deviceIdstring · uuidRequired

The device identifier which this downlink is targeting.

Example: 7f97ccf0-2ae1-4e1f-bd3e-d901f31d801b
createdAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was created in the system.

Example: 2025-01-01T11:22:33.456Z
modifiedAtstring · date-timeRead-onlyOptional

The timestamp when the downlink was last modified in the system.

Example: 2025-01-01T11:22:33.456Z
feedbackTimeoutall ofRequired
string · durationOptional

Duration that supports a subset of ISO 8601, where only days, hours, minutes, and seconds can be specified. Days are treated as exactly 24 hours, thus ignoring daylight savings effects.

Pattern: ^P(?:(\d+D)(T(?:(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)?)|T(\d+H)?(\d+M)?(\d+(\.\d{1,9})?S)?)$
and
anyOptional

The duration after which feedback is expected for the downlink. Must be at least 10 minutes.

Example: PT25H
dryRunbooleanOptional

Whether or not this is a 'test' downlink that should not be delivered. If true the system will prevent actual delivery of the downlink to the MQTT account and pretend instead that successful delivery has occurred. This mode may be used to test your configuration within KPN Things without requiring a fully functional MQTT device.

Default: false
lastFailureReasonstringRead-onlyOptional

The failure reason of the MQTT downlink. Known values include: CANCELLED, FEEDBACK_TIMEOUT, FAILED_TO_TRANSMIT_TO_DEVICE

Responses
201

MQTT downlink has been successfully created.

application/json
post
POST /mqtt/downlinks HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Content-Type: application/json
Accept: */*
201

MQTT downlink has been successfully created.

No content

get
Authorizations
Path parameters
downlinkIdstring · uuidRequired

MQTT downlink identifier.

Responses
200

The created MQTT downlink.

application/json
get
GET /mqtt/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*
200

The created MQTT downlink.

No content

delete
Authorizations
Path parameters
downlinkIdstring · uuidRequired

MQTT downlink identifier.

Query parameters
forcedbooleanOptional

Whether to force the cancellation of the MQTT downlink or not.

Default: false
Responses
202

MQTT downlink cancellation has been accepted and scheduled for further downstream processing.

No content

delete
DELETE /mqtt/downlinks/{downlinkId} HTTP/1.1
Host: api.kpnthings.com
Authorization: Bearer JWT
Accept: */*

No content

Last updated

Was this helpful?