openapi: 3.0.0
info:
title: Device Management API
x-logo:
url: 'https://kontakt.io/wp-content/themes/kontakt/dist/img/site-header/logo.svg'
backgroundColor: '#FFFFFF'
version: '10'
description: |
This Kontakt.io API provides direct access to all Kio Cloud Device Management resources. It allows integrating device administration functionality into 3rd-party applications without the need to build all underlying logic from the ground up.
## Authentication
All requests must include a **JWT Bearer token** in the `Authorization` header, obtained via the [OAuth2 Client Credentials flow](https://developer.kontakt.io/docs/entity-management-integration-api/0255c5646ab01-authentication-o-auth2-client-credentials-flow).
> **Deprecated:** The `Api-Key` header is still accepted for backward compatibility but is deprecated and will be removed. Do not use it for new integrations.
Each API call requires the `Accept` header with the API version. **By default, set to the current stable version:** `application/vnd.com.kontakt+json;version=10`
contact:
name: Support
url: 'https://support.kontakt.io'
email: support@kontakt.io
termsOfService: 'https://kontakt.io/legal-documents/terms-of-sale-and-service/'
externalDocs:
url: 'https://developer.kontakt.io'
servers:
- url: 'https://dm-api.cloud.us.kontakt.io'
description: Kio Cloud US region
- url: 'https://dm-api.cloud.uk.kontakt.io'
description: Kio Cloud UK region
security:
- bearer_token: []
- api_key: []
tags:
- name: Account
description: User account management
- name: Command
description: 'Commands are a special type of Configs used for initiating some management tasks, e.g. entering bootloader mode'
- name: Config
description: Pending configs represent new values for beacon settings that should be applied to actual devices via e.g. Kontakt.io Administration Apps. Creating a new config does not automatically change anything on a real beacon.
- name: Device
description: 'The Device resource represents Kontakt.io devices assigned to a particular Kontakt.io Panel account, as well as devices shared with that account from different accounts.'
- name: Device tags
description: The device tags
- name: Device (3rd party)
description: |
NOTE: this set of endpoints has been superseded by External Devices functionality.
These endpoints provide a way to integrate 3rd party Bluetooth-enabled scanning devices into Kontakt.io platform. As of Summer 2018, Kontakt.io is working with manufacturers of enterprise-level networking devices, like Cassia, Ruckus and Meraki, to seamlessly incorporate data collected by their routers and/or WiFi access points into Kontakt.io Data Streams, and to improve Infrastructure Management capabilities.
Users wanting to take advantage of this feature, first need to provide proper authentication and integrate Kontakt.io Panel account with a 3rd party vendor. Only after that, devices from that vendor can be added into Kontakt.io platform.
At any given moment a Company can have **only one** integration per 3rd party Vendor, i.e. you can have **one** Cassia *and* **one** Meraki integration, but you can't have e.g. two Meraki integrations.
- name: Device (Portal Beam)
description: |
These endpoints are designed to assist with storing metadata associated with Portal Beams
- name: External Device
description: 'External Device feature is a method of adding arbitrary external devices to the system. Such devices have MAC, unique id, and other virtual attributes, but they cannot be managed (configured).'
- name: Device Federation
description: Device Federation feature is a method of addding devices to the account by synchronization with an account in different Device Management (source).
- name: Eddystone
description: Helper resources for working with Eddystone beacons
- name: Firmware
description: Firmware resources
- name: Firmware Upgrade
description: Firmware upgrade resources
- name: GDPR
description: General Data Protection Regulation compliance resources
- name: Manager
description: 'Managers represent user accounts that can manage Kontakt.io Devices. Everyone can freely create an account on [Kontakt.io Web Panel](https://panel.kontakt.io) and then use it to work with this API.'
- name: Namespaces
description: List of Eddystone UID Namespaces used on beacons belonging to a Manager
- name: Order
description: 'An Order represents all devices that have been purchased in Kontakt.io Web Store in a single transaction. Before these devices can be used with Kontakt.io platform, they need to be added to Kontakt.io Manager Account.'
- name: Provisioning
description: Device provisioning for connectivity setup
- name: Proximities
description: List of iBeacon Proximity UUIDs used on beacons belonging to a Manager
- name: Venue
description: |
NOTE: this functionality is deprecated.
Venues help with organising beacons into groups. They may represent physical locations, but not necessarily.
Currently in the Kontakt.io Web Panel Venues are called *Locations*, but in order to provide backward compatibility, API still uses the original name.
- name: Sharing
description: Endpoints related to sharing devices with other users or moving devices between accounts
- name: Internal
description: Internal management endpoints with elevated access.
- name: LoRaWAN
description: Endpoints for provisioning LoRa gateways in ChirpStack (OTAA activation).
paths:
/command/encrypt:
get:
tags:
- Command
summary: Create Encrypted Commands
description: Returns a list of Base64-encoded configs with encrypted commands for each of devices specified in a request
parameters:
- $ref: '#/components/parameters/UniqueIdList'
- name: command
in: query
required: true
description: |
A Command that should be encrypted in configs for each of devices specified in a request
* `RESET` - Reboots the device
* `NONCONNECTABLE` - Connectable BLE packets will be non-connectable until a next reboot
* `SLEEP` - Device enters a sleep mode (stops broadcasting all packets)
* `BLINK_10S` - Primary LED blinks for 10 seconds or LED blinks with the primary colour for 10 seconds
* `BLINK_30S` - Primary LED blinks for 30 seconds or LED blinks with the primary colour for 30 seconds
* `BLINK2_10S` - Secondary LED blinks for 10 seconds or LED blinks with the secondary colour for 10 seconds
* `BLINK2_30S` - Secondary LED blinks for 30 seconds or LED blinks with the secondary colour for 30 seconds
Please keep in mind that not all devices can support all of these commands. Refer to device specification to learn more.
schema:
type: string
enum:
- RESET
- NONCONNECTBLE
- SLEEP
- BLINK_10S
- BLINK_30S
- BLINK2_10S
- BLINK2_30S
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
commands:
type: array
items:
$ref: '#/components/schemas/EncryptedConfig'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
/config:
get:
tags:
- Config
summary: Get Configs
description: |-
Returns all pending configurations for the specified Devices or device type.
If no query parameters are provided, this endpoint returns all pending configurations that can be applied to Devices that the user has access to.
parameters:
- name: uniqueId
in: query
description: List of Unique IDs of Devices which pending configurations should be returned
required: false
schema:
type: array
items:
type: string
- name: deviceType
in: query
description: Device type. Only pending configurations for devices of this type will be returned
required: false
schema:
type: string
enum:
- BEACON
- GATEWAY
default: BEACON
- $ref: '#/components/parameters/QueryMaxResult'
- $ref: '#/components/parameters/QueryType'
- $ref: '#/components/parameters/accept'
- $ref: '#/components/parameters/QueryStartIndex'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
configs:
type: array
items:
oneOf:
- $ref: '#/components/schemas/PendingBeaconConfig'
- $ref: '#/components/schemas/PendingGatewayConfig'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
security:
- bearer_token: []
- api_key: []
/config/create:
post:
tags:
- Config
summary: Create a Config
description: |-
Create or update a *pending configuration* for one or more devices.
Please be aware that doing this alone *will not make any changes on actual, physical beacons*, unless these beacons are in range of a Kontakt.io gateway (Portal Light).
Otherwise, this config has to be encrypted, downloaded, and then applied to a device via a Bluetooth connection. Applying the config over a Bluetooth connection is usually done from the Kio Setup Manager app or a 3rd-party custom app that implements one of Kontakt.io mobile SDKs.
**Not all device models accept all configuration parameters available.** Please check first if device is capable of accepting given configuration parameter.
Except for `uniqueId` and `deviceType` which are mandatory you only need to provide configuration parameters you wish to change.
requestBody:
content:
application/x-www-form-urlencoded:
schema:
oneOf:
- $ref: '#/components/schemas/NewBeaconConfig'
- $ref: '#/components/schemas/NewGatewayConfig'
required:
- uniqueId
- deviceType
responses:
'201':
description: |-
Created. The request was processed by the server. This does not mean the device has received or applied the config yet — devices pull pending configs asynchronously.
The response body is an array of pending-config records and shows exactly what was created. How to read it:
- If the response array does not contain a requested `uniqueId`, the config was not created for that device. The device was unknown to the server, or your API key does not have access to it.
- For `deviceType=BEACON`, keys in `customConfiguration` that the device model does not accept are silently dropped.
- For `deviceType=GATEWAY`, unknown `applications.system.*` keys cause the request to be rejected with HTTP 422 (no `201` is returned in that case).
To check what is pending on the server side later, call `GET /config?uniqueId=...`.
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: array
items:
oneOf:
- $ref: '#/components/schemas/PendingBeaconConfig'
- $ref: '#/components/schemas/PendingGatewayConfig'
examples:
full-success:
summary: Full success — every uniqueId and field persisted
value:
- uniqueId: AAAA
model: SMART_BADGE_3_MINI
created: '2026-05-04T12:00:00.000Z'
updated: '2026-05-04T12:00:00.000Z'
txPower: 6
no-devices-resolved:
summary: 201 with empty array — no submitted uniqueId was visible to the caller
value: []
custom-pid-stripped:
summary: 201 with a customConfiguration PID silently dropped (unsupported by device)
value:
- uniqueId: AAAA
model: SMART_BADGE_3_MINI
created: '2026-05-04T12:00:00.000Z'
updated: '2026-05-04T12:00:00.000Z'
customConfiguration: {}
'401':
description: Unauthorized — the request did not present valid authentication.
'403':
description: Forbidden — the caller authenticated but lacks the `CONFIG_CREATE` permission. Note that missing per-device access does not produce 403; it produces a 201 with the affected `uniqueId`s filtered out of the response array (see the 201 response description).
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'409':
description: 'Conflict — a config-level rule was violated. Examples include a concurrent create for the same `uniqueId` (duplicate key), the resulting configuration exceeding the device''s storage budget, or violating power-saving / lock constraints.'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: 'Unprocessable Entity — a hard validation error. Examples include invalid types or ranges, malformed `customConfiguration` PIDs (non-hex value, dotted name, value longer than 32 characters), interval below the chip''s minimum, invalid enum values, or `deviceType` mismatch.'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
parameters:
- $ref: '#/components/parameters/accept'
security:
- bearer_token: []
- api_key: []
/config/encrypt:
get:
tags:
- Config
summary: Encrypt a Config
description: |-
Returns a list of Base64-encoded configs with encrypted pending configurations for each Device or Device types specified in a request. This payload can be sent directly via Bluetooth to a device to change its settings.
If no query parameters are provided, this endpoint returns encrypted versions of all pending configurations.
parameters:
- name: uniqueId
in: query
description: List of Unique IDs with existing pending configurations
required: false
schema:
type: array
items:
type: string
- name: clientType
in: query
required: false
schema:
type: string
enum:
- MANAGER
- GATEWAY
default: MANAGER
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
configs:
type: array
items:
$ref: '#/components/schemas/EncryptedConfig'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
security:
- bearer_token: []
- api_key: []
/config/delete:
post:
tags:
- Config
summary: Delete a Config
description: Deletes pending configurations as specified by devices' unique IDs.
parameters:
- $ref: '#/components/parameters/UniqueIdList'
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
properties:
message:
type: string
description: Success message
example: Delete successful.
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
/config/export:
post:
tags:
- Config
summary: Export Configs
description: |
#### Note: this endpoint requires a user to have permission to call POST /config/create endpoint.
Writes pending configurations merged with the current state of devices into a CSV file. The link to this file
will be returned in the response.
Merging algorithm works as follows - for any given device's parameter:
* if it's a virtual parameter OR a physical one but no pending config exists which aims to change its value - the current value of this parameter is used.
* if it's a physical parameter with a pending config changing its value - the value from that pending config is used.
List of parameters contained in the resulting CSV file:
| Parameter | Comment |
|-----------|---------|
|uniqueId| |
|mac| |
|alias| |
|tags| |
|currentLocation.campusId| |
|currentLocation.campusName| |
|currentLocation.buildingId| |
|currentLocation.buildingName| |
|currentLocation.floorId| |
|currentLocation.floorName| |
|currentLocation.roomId| |
|currentLocation.roomName| |
|packets| |
|profiles| |
|proximity| |
|major| |
|minor| |
|namespace| |
|instanceId| |
|lightSensorSamplingInterval| |
|url| |
|txPower| |
|shuffled| |
|interval| |
|name| |
|rssi0m| |
|rssi1m| |
|powerSaving.mode| See the `powerSaving.mode` field in the `Get Devices` endpoint response for possible values and descriptions. `OFF` = empty list in API response (default configuration); empty = not applicable to the device. |
|powerSaving.moveSuspendTimeout| |
|powerSaving.lightSensorHysteresis| |
|powerSaving.lightSensorThreshold| |
|powerSaving.rtc.MON| |
|powerSaving.rtc.TUE| |
|powerSaving.rtc.WED| |
|powerSaving.rtc.THU| |
|powerSaving.rtc.FRI| |
|powerSaving.rtc.SAT| |
|powerSaving.rtc.SUN| |
|eidRotationPeriodExponent| |
|wifiSsid| |
|wifiUserName| |
|wifiProtocol| |
|wifiPassword| |
|ibeaconUUID| |
|rssi_threshold| |
|filtration_mask| |
|fallbackSsid| |
|fallbackPass| |
|fallbackServer| |
|apiHost| |
|dataHost| |
|otaUrl| |
|proxyURL| |
|proxyPort| |
|eapType| |
|bleScanChannel| |
|accelerometer.features| |
|accelerometer.sensitivity| |
|accelerometer.preset| |
|accelerometer.move.threshold| |
|accelerometer.move.duration| |
|accelerometer.doubleTap.threshold| |
|accelerometer.doubleTap.timeLimit| |
|accelerometer.doubleTap.timeLatency| |
|accelerometer.doubleTap.timeWindow| |
|accelerometer.move.detectionFlags| |
|accelerometer.move.detectionFlagsJunction| |
|accelerometer.doubleTap.detectionFlags| |
|accelerometer.highPass.mode| |
|accelerometer.highPass.cutoffFrequency| |
|accelerometer.highPass.moveDetection| |
|accelerometer.highPass.doubleTapDetection| |
|accelerometer.highPass.accelerometerData| |
|accelerometer.highPass.reference| |
|batteryLevel| |
|lastSeen| |
|deployment.status| |
|secureProximity| |
|vendor| |
|firmware| |
|product| |
|productCode| |
|secureNamespace| |
|orderId| |
|category| |
|roomNumber| |
|temperatureOffset| |
|telemetryInterval| |
|telemetryFields| See the `telemetryFields` field in the `Get Devices` endpoint response for possible values and descriptions. `OFF` = empty list in API response (default configuration); empty = not applicable to the device. |
|eidIdentityKey| |
|kontaktFrameInterval| |
|locationFrameChannel| |
|locationFrameInterval| |
|buttonFeatures| See the `buttonFeatures` field in the `Get Devices` endpoint response for possible values and descriptions. `OFF` = empty list in API response (default configuration); empty = not applicable to the device. |
|multiClickCount| Number of clicks required for multi-click detection (1–10). |
|panicDuration| |
|bleScan.duration| |
|bleScan.models| |
|bleScan.force| |
|bleScan.interval| |
|bleScan.size| Maximum number of scanned items reported per scan (0–255). Requires nrf52 firmware >= 2.5.88. |
|occupancy.sleepInterval| |
|occupancy.minInterval| |
|occupancy.footfallLine| |
|occupancy.calibration| |
|occupancy.model| |
|irBlinkInterval| |
|irReceiver.wakeUpInterval| |
|irReceiver.maxListenInterval| |
|irReceiver.disableOnNoMotion| |
|irTransmitter.intensity| |
|irTransmitter.dutyCycle| |
|irTransmitter.protoV2| |
|irDetectionParams| |
parameters:
- $ref: '#/components/parameters/UniqueIdList'
- name: deviceType
in: query
description: 'Device type filter. If specified, only exports the devices with the type(s) specified. If not, all devices will be exported.'
schema:
type: array
items:
type: string
example:
- BEACON
- GATEWAY
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
description: 'Contains the link to exported file, plus the list of uniqueIds in it.'
properties:
url:
type: string
description: URL to download the exported file from.
example: 'https://dm-api.cloud.us.kontakt.io/config/bdf5b73a-df5a-466d-89ba-f0c4b6a2148c/csv'
uniqueIds:
description: |
Specifies the devices included in the exported file. It could differ from
the requested list due to insufficient permissions.
type: array
items:
$ref: '#/components/schemas/UniqueId'
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
/config/import:
post:
tags:
- Config
summary: Import Configs
description: |
#### Note: this endpoint requires a user to have permission to call POST /config/create endpoint.
Imports a CSV file with configuration parameters, virtual or physical, and applies them to the devices
as pointed in that file.
Virtual parameters are modified instantly upon successful response, whereas for physical parameters a pending
configuration is created.
This endpoint can take in a file generated by the POST /config/export without any modifications or modified as needed,
but also any valid CSV file.
#### Note: All rows will be processed even if one of them contains errors - this is to aid in fixing errors in CSV files and resubmitting it.However **if one of the rows contains errors, the proper rows won't take effect**.
#### The proper course of action when an error is returned for one or more of the rows is fixing errors in the file and submitting it again.
## File format
Below is a comma-separated text file rendered as a table:
| uniqueId | parameter 1 | ... | parameter N |
|------------|-------------|-----|-------------|
| 11P10AvW | 1 | ... | abctexttext |
| 11S13AhY | 42 | ... | textvalue |
| .......... | ... | ... | ... |
| uniqueId N | | ... | abd |
In other words, each row is a *uniqueId* of a device followed by configuration properties we want to change in it.
Lack of value in a cell means no change to that value, with some exceptions:
* alias: lack of value resets it to an empty string
* tags: lack of value resets it to an empty list
| Supported parameters |
|----------------------|
|deployment.status|
|alias|
|tags|
|url|
|namespace|
|instanceId|
|name|
|password|
|proximity|
|major|
|minor|
|txPower|
|interval|
|shuffled|
|lightSensorSamplingInterval|
|eidRotationPeriodExponent|
|profiles|
|packets|
|rssi0m|
|rssi1m|
|powerSaving.mode|
|powerSaving.moveSuspendTimeout|
|powerSaving.lightSensorHysteresis|
|powerSaving.lightSensorThreshold|
|powerSaving.rtc.MON|
|powerSaving.rtc.TUE|
|powerSaving.rtc.WED|
|powerSaving.rtc.THU|
|powerSaving.rtc.FRI|
|powerSaving.rtc.SAT|
|powerSaving.rtc.SUN|
|accelerometer.features|
|accelerometer.sensitivity|
|accelerometer.preset|
|accelerometer.move.threshold|
|accelerometer.move.duration|
|accelerometer.move.detectionFlags|
|accelerometer.move.detectionFlagsJunction|
|accelerometer.doubleTap.threshold|
|accelerometer.doubleTap.timeLimit|
|accelerometer.doubleTap.timeLatency|
|accelerometer.doubleTap.timeWindow|
|accelerometer.doubleTap.detectionFlags|
|accelerometer.highPass.mode|
|accelerometer.highPass.cutoffFrequency|
|accelerometer.highPass.moveDetection|
|accelerometer.highPass.doubleTapDetection|
|accelerometer.highPass.accelerometerData|
|accelerometer.highPass.reference|
|occupancy.sleepInterval|
|occupancy.minInterval|
|occupancy.model|
|occupancy.footfallLine|
|occupancy.calibration|
|irReceiver.wakeUpInterval|
|irReceiver.maxListenInterval|
|irReceiver.disableOnNoMotio|
|irTransmitter.intensity|
|irTransmitter.dutyCycle|
|irTransmitter.protoV2|
|irDetectionParams|
|irBlinkInterval|
|roomNumber|
|temperatureOffset|
|telemetryInterval|
|telemetryFields|
|eidIdentityKey|
|kontaktFrameInterval|
|locationFrameChannel|
|locationFrameInterval|
|buttonFeatures|
|multiClickCount|
|panicDuration|
|bleScan.duration|
|bleScan.models|
|bleScan.force|
|bleScan.interval|
|bleScan.size|
|wifiSsid|
|wifiUserName|
|wifiProtocol|
|wifiPassword|
|ibeaconUUID|
|rssi_threshold|
|filtration_mask|
|apiHost|
|dataHost|
|otaUrl|
|proxyURL|
|proxyPort|
|eapType|
|bleScanChannel|
| Ignored parameters (due to them being read-only) |
|----------------------|
|mac|
|orderId|
|batteryLevel|
|lastSeen|
|category|
|firmware|
|product|
|productCode|
|secureProximity|
|vendor|
|secureNamespace|
|fallbackSsid|
|fallbackPass|
|fallbackServer|
parameters:
- $ref: '#/components/parameters/accept'
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'a CSV file, structure as described in this endpoint''s documentation.'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: array
description: Response with statuses per uniqueId
items:
type: object
properties:
message:
type: string
description: 'Empty if imported successfully, contains an error message otherwise'
example: IBeacon UUID field is not a proper UUID
status:
type: string
description: |
ERROR means this row contained an error and needs to be fixed.
ROLLED_BACK means this row is okay, but other rows contained errors so the changes won't take effect.
enum:
- SUCCESS
- ERROR
- ROLLED_BACK
uniqueId:
$ref: '#/components/schemas/UniqueId'
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
/config/readall:
get:
tags:
- Config
summary: Read raw device configuration
description: Reads device configuration and returns its state in a raw form (secure response). It can be used as an input for the `POST /device/sync` endpoint to synchronize device state with the cloud.
parameters:
- $ref: '#/components/parameters/UniqueIdList'
responses:
'200':
description: Device configuration returned
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
configs:
type: array
items:
$ref: '#/components/schemas/EncryptedConfig'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
'/config/{fileName}/csv':
get:
tags:
- Config
summary: Download CSV file with exported devices
description: Downloads CSV file with exported devices that has been generated by the `POST /config/export` endpoint
parameters:
- name: fileName
in: path
description: Identifier of a file to be downloaded. The value is generated dynamically and available in the response of the `POST /config/export` endpoint
example: a0f49b9e-b2e7-4a5f-a94a-047014eb3958
schema:
type: string
required: true
responses:
'200':
description: CSV file with devices configuration
content:
text/csv:
schema:
type: object
'401':
description: Unauthorized
'404':
description: CSV file with provided name doesn't exist
security:
- bearer_token: []
- api_key: []
/device:
get:
tags:
- Device
summary: Get Devices
description: |
Returns all devices user has access to. **Some fields are applicable only to devices with specific capabilities.** Please check if you device supports given field before use.
Results can be filtered using the query parameters specified below.
This endpoint can also be used to decrypt shuffled devices, for example Eddystone EID packets can be resolved by providing their content in the `eid` parameter.
Returns 200 with empty `devices` list when no devices found.
parameters:
- name: uniqueId
in: query
description: Unique IDs of devices that should be returned in a response. Comma separated.
required: false
schema:
type: array
items:
type: string
example: 11P10AvW
style: form
explode: false
- $ref: '#/components/parameters/QueryDeviceType'
- name: managerId
in: query
description: Returns only devices belonging to Managers with specified IDs
required: false
schema:
type: array
items:
type: string
- name: bid
in: query
description: 'Returns only beacons configured to broadcast iBeacon packets with specified identifiers. Each beacon should be represented as a colon-separated tuple of Proximity UUID, Major and Minor, e.g. `3C4BDEE8-D6FA-4A33-9AB7-B327D9200D4D:433:16621` (ProximityUUID:Major:Minor).'
required: false
schema:
type: array
items:
type: string
- name: euid
in: query
description: 'Returns only beacons configured to broadcast Eddystone UID packets with specified identifiers. Each beacon should be represented as colon-separated tuple of Namespace and Instance ID, e.g. `8c0a2a6b2d754d9ba600:736366476b70` (Namespace:InstanceID).'
required: false
schema:
type: array
items:
type: string
- name: eid
in: query
description: 'Returns only beacons that correspond with provided Eddystone EID packets, in the same order as packets were specified in the query.'
required: false
schema:
type: array
items:
type: string
- name: access
in: query
description: Limits the response body only to devices with specified access level.
required: false
schema:
$ref: '#/components/schemas/DeviceDataRole'
- $ref: '#/components/parameters/QueryMaxResult'
- $ref: '#/components/parameters/QueryType'
- $ref: '#/components/parameters/accept'
- schema:
type: string
in: query
name: q
description: Filter query. Please refer to Filtering article.
- $ref: '#/components/parameters/QueryStartIndex'
- schema:
type: string
in: query
name: mac
description: MACs of devices that should be returned in a response. Colon format. Comma separated. Case insensitive.
style: form
- $ref: '#/components/parameters/QueryDeviceSelector'
- $ref: '#/components/parameters/QueryDeviceOrderBy'
- schema:
type: string
enum:
- ASC
- DESC
in: query
name: order
description: Order direction.
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
devices:
type: array
items:
$ref: '#/components/schemas/Device'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
required:
- devices
- searchMeta
security:
- bearer_token: []
- api_key: []
x-stoplight:
id: m7476n9utnmat
parameters: []
/device/decrypt:
post:
tags:
- Device
summary: Decrypt READALL secure response from device
description: |
Accepts a list of secure responses to READALL requests from devices, decrypts them and returns
the information returned in those as virtual devices composed of values that the READALL responses contain.
parameters:
- $ref: '#/components/parameters/UniqueIdList'
- $ref: '#/components/parameters/accept'
- name: response
in: query
description: 'Devices'' secure responses to READALL requests, listed in the same order as uniqueIds'
required: true
schema:
type: array
items:
type: string
example:
- AAEhIgAAAAAA9THOrhkTEZIV37l03NdmMcNhblVNE2CK4RFPlo8y
- AAEhwgAAAAAAGYJ+8PWSkE8iz7cY98/8AVZPbC3rihOGamh03Okn0UhMe364uAfGslh6xSN8dvs9kbXAqR//sQ5BSyqssrLVn1Hwon00no33h3d+gOotOYmaxTA4xCvagxSkt4XZiRKVk2S8A6LIAKxNdjV/V9LGPZAFFClhRURdVumi0jQmGxE4jPj2qx+/TL1fKlPyutOxbdcAX4xi46IAwTY2apOBTSbxoPBrfKzAhSVr57+Rkm6NcNl5YkjgVcp/u9vmLg==
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
devices:
type: array
items:
$ref: '#/components/schemas/Device'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
required:
- devices
- searchMeta
security:
- bearer_token: []
- api_key: []
/device/update:
post:
tags:
- Device
summary: Update a Device
description: |
This endpoint allows you to perform one of two operations, depending on request's body schema:
* sending **Secure Response** that has been read from a device after successful application of a new configuration
* editing **virtual attributes** of a device
The response status code depends on which operation is performed:
* **Virtual attributes update**: always returns `200` with a success message.
* **Secure Response**: returns `200` with pending secure configurations if any exist, or `204` with no body if there are no pending configurations to return.
requestBody:
content:
application/x-www-form-urlencoded:
schema:
oneOf:
- $ref: '#/components/schemas/UpdateDeviceVirtualAttributesRequest'
- $ref: '#/components/schemas/UpdateDeviceSecureResponseRequest'
responses:
'200':
description: |
OK. Returned in two cases:
* **Virtual attributes update** — body contains a success message.
* **Secure Response with pending configs** — body contains the pending secure configurations for the updated devices.
content:
application/vnd.com.kontakt+json; version=10:
schema:
oneOf:
- type: object
title: Update success message
description: Returned when updating virtual attributes.
properties:
message:
type: string
description: Success message.
example: Update successful.
required:
- message
- type: object
title: Pending secure configurations
description: Returned when sending a Secure Response and there are pending configurations.
properties:
configs:
type: array
items:
type: object
properties:
uniqueId:
type: string
description: Unique ID of the device.
config:
type: string
description: Base64-encoded secure configuration profile to be applied to the device.
searchMeta:
$ref: '#/components/schemas/SearchMeta'
required:
- configs
- searchMeta
'204':
description: |
No Content. Returned when sending a Secure Response and there are no pending
secure configurations to return for the updated devices.
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: Device not found or insufficient access
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity - validation errors
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
parameters:
- $ref: '#/components/parameters/accept'
security:
- bearer_token: []
- api_key: []
'/device/unassigned/{managerId}':
get:
deprecated: true
tags:
- Device
summary: Get unassigned Devices
description: Returns a list of Devices belonging to a specified Manager and that Manager's Subordinate Accounts that haven't been assigned to any Venue (Location)
parameters:
- name: managerId
in: path
description: 'Manager ID This can be either an ID of a Manager that provides the API Key, or and ID of one of that Manager''s Subordinate Manager.'
required: true
schema:
type: string
- $ref: '#/components/parameters/QueryDeviceType'
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
devices:
type: array
items:
$ref: '#/components/schemas/Device'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
operationId: ''
security:
- bearer_token: []
- api_key: []
'/device/{uniqueId}/access':
post:
tags:
- Device
summary: Grant access to the device
description: Grants user(s) access to the device with provided uniqueId. Access level is defined as Role.
parameters:
- name: uniqueId
in: path
description: The uniqueId of a device that the access should be given for
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceAccessGrantRequest'
responses:
'204':
description: Access granted
'404':
description: 'Not Found, e.g. manager doesn''t exist'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
get:
tags:
- Device
summary: Return managers with access to the device
description: Provides a list of users that have access to the device
parameters:
- name: uniqueId
in: path
description: The uniqueId of a device
required: true
schema:
type: string
responses:
'200':
description: List of managers returned successfully
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/DeviceAccessResponse'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'/device/{uniqueId}/access/{email}':
delete:
tags:
- Device
summary: Revokes access to a device
description: Revokes access to a device
parameters:
- name: uniqueId
in: path
description: The uniqueId of a device
required: true
schema:
type: string
- name: email
in: path
description: The email address of a user that access should be revoked
required: true
example: manager@example.com
schema:
type: string
responses:
'204':
description: Access revoked successfully
'404':
description: 'Not Found, e.g. manager doesn''t exist'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
/bulk/device-access:
post:
tags:
- Device
summary: Bulk operation to grant or revoke access to devices
description: Grants user(s) access to devices based on provided BQL. Access level is defined as Role.
requestBody:
content:
application/json:
schema:
properties:
q:
type: string
description: BQL query that specifies devices applicable for granting/revoking access
example: (federation.federated==false)
grantAccess:
type: object
$ref: '#/components/schemas/DeviceAccessGrantRequest'
revokeAccess:
type: object
$ref: '#/components/schemas/DeviceAccessRevokeRequest'
responses:
'200':
description: Access request processed successfully
'404':
description: Object not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
get:
tags:
- Device
summary: Returns status and details for device access bulk process started by the authorized user
description: Returns details about the device access bulk process triggered with the endpoint `POST /bulk/device-access`.
operationId: getBulkDeviceAccessStatusForAuthorizedManager
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceAccessBulkJobResponse'
'/bulk/device-access/{jobKey}':
get:
tags:
- Device
summary: Returns status and details for provided device access bulk process
description: Returns details about the specified device access bulk process triggered with the endpoint `POST /bulk/device-access`.
operationId: getBulkDeviceAccessStatus
parameters:
- $ref: '#/components/parameters/BulkDeviceAccessJobKeyPathParam'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceAccessBulkJobResponse'
/device/sync:
post:
tags:
- Device
summary: Synchronize device
description: Synchronize device in API with its actual state using read-all command response.
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
uniqueId:
type: array
description: List of Unique IDs of Devices
items:
type: string
response:
type: array
description: List of Base64-encoded Secure responses from Kontakt.io devices to read-all requests. A position on this list corresponds to a position of a Unique ID in the `uniqueId` list.
items:
type: string
format: byte
updated:
description: List of Unix epoch timestamps (seconds) that represent a time and date when a Kontakt.io Device was updated. Mostly used for time synchronization in secure shuffling. A position on this list corresponds to a position of a Unique ID in the `uniqueId` list.
type: array
items:
type: integer
required:
- uniqueId
- response
- updated
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
properties:
message:
type: string
description: Success message
example: Update successful
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
parameters:
- $ref: '#/components/parameters/accept'
security:
- bearer_token: []
- api_key: []
/device/sync/token:
post:
tags:
- Device
summary: Synchronize device token
description: Update Secure profile token in API.
requestBody:
content:
application/x-www-form-urlencoded:
schema:
properties:
uniqueId:
type: array
description: List of Unique IDs of Devices
items:
type: string
currentToken:
description: Unix epoch timestamp for token. Defaults to now() if omitted.
type: integer
required:
- uniqueId
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
properties:
message:
type: string
description: Success message
example: Update successful
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
parameters:
- $ref: '#/components/parameters/accept'
security:
- bearer_token: []
- api_key: []
/device/vendor/meraki/create:
post:
tags:
- Device (3rd party)
summary: Add a Meraki Integration
description: |
This endpoint allows to associate your Meraki controller with Kontakt.io platform, enabling to use Meraki devices as external data sources for Data Streams
requestBody:
content:
application/x-www-form-urlencoded:
schema:
properties:
apiKey:
type: string
description: API Key used for authentication on Meraki's cloud
secret:
type: string
description: Secret used for authentication on Meraki's backend
validator:
type: string
description: Verification token ensuring Meraki's cloud that the endpoint is correct
required:
- apiKey
- secret
- validator
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
properties:
apiKey:
type: string
description: API Key used for authentication on Meraki's cloud
example: skhefgjhdfgv347fsfdv
secret:
type: string
description: Secret used for authentication on Meraki's backend
example: SuperSecretString
validator:
type: string
description: Verification token ensuring Meraki's cloud that the endpoint is correct
example: lekur8934hiu2ghebv0tbshef
'204':
description: No Content
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
parameters:
- $ref: '#/components/parameters/accept'
/device/vendor/meraki/update:
post:
tags:
- Device (3rd party)
summary: Update a Meraki Integration
description: |
This endpoint allows to update an already existing integration with a Meraki platform
requestBody:
content:
application/x-www-form-urlencoded:
schema:
properties:
apiKey:
type: string
description: API Key used for authentication on Meraki's cloud
secret:
type: string
description: Secret used for authentication on Meraki's backend
validator:
type: string
description: Verification token ensuring Meraki's cloud that the endpoint is correct
required:
- apiKey
- secret
- validator
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
properties:
message:
type: string
description: Success message
example: Update successful
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
parameters:
- $ref: '#/components/parameters/accept'
/device/vendor/meraki/delete:
post:
tags:
- Device (3rd party)
summary: Delete a Meraki Integration
description: |
This endpoint allows to remove a Meraki integration
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
properties:
message:
type: string
description: Delete message
example: Delete successful
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
parameters:
- $ref: '#/components/parameters/accept'
/device/delete:
post:
tags:
- External Device
summary: Delete an external device
description: This endpoint allows you to delete an external device. This operation is irreversible.
requestBody:
content:
application/x-www-form-urlencoded:
schema:
properties:
uniqueId:
description: List of external device Unique IDs to delete.
type: array
items:
$ref: '#/components/schemas/UniqueId'
required:
- uniqueId
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: object
properties:
message:
type: string
description: Success message.
example: Delete successful
required:
- message
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity - validation errors
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
parameters:
- $ref: '#/components/parameters/accept'
security:
- bearer_token: []
- api_key: []
/device/external:
post:
tags:
- External Device
summary: Create a single external device
description: |
External device represents device that exists outside the Kio Cloud platform. It can be imported to the Kio Cloud platform so the platform is aware of that device.
This process is synchronous, meaning the device is ready to use as soon as the API response from this endpoint is received.
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/NewExternalDevice'
required: true
responses:
'200':
description: New external device created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Device'
'422':
description: 'Unable to process the request, e.g. invalid request body'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
/device/external/import:
post:
tags:
- External Device
summary: Import external devices
description: |
External device represents device that exists outside the Kio Cloud platform. It can be imported to the Kio Cloud platform so the platform is aware of that device.
This process is A-synchronous, so you should poll for status via `GET /device/external/import/{jobKey}` with `jobKey` taken from response.
To import devices the CSV file needs to be provided with the following columns.
| Value name | Description | CSV header | Required | Example |
|---------------|----------------|----------------|--------------|--------------|
| Unique Id | Free text value used to identify the device. If not provided, it is generated automatically. | uniqueId | No | A12dBB |
| MAC address | MAC address that uniquely identifies the device. Needs to be provided in format XX:XX:XX:XX:XX:XX. MAC address is always converted to uppercase for consistency. | mac | Yes | 08:00:04:02:00:00 |
| Product name | Name of the product in a human-readable way | product | Yes | External device |
| Product code | Code of the product that identifies its type | productCode | No | external_device |
| Tags | List of labels that can be used to group devices | tags | No | external,bulb,white |
| Notes | User defined description | alias | No | White bulb |
| Deployment status | Status of a device representing its point in the lifecycle. Allowed values are TO_BE_DEPLOYED, DEPLOYED, END_OF_LIFE | deployment.status | Yes | TO_BE_DEPLOYED |
| Device category | Category that the device belongs to. Allowed values are TAG, INFRASTRUCTURE | category | Yes | TAG |
requestBody:
content:
application/octet-stream:
schema:
type: string
description: CSV file with a list of devices to be imported.
format: binary
responses:
'200':
description: Import completed with success
content:
application/json:
schema:
$ref: '#/components/schemas/ExternalDeviceImportResponse'
get:
tags:
- External Device
summary: Get status of the import process
description: Returns status of external devices import process started by the `POST /device/external/import` call
responses:
'200':
description: Import completed with success
content:
application/json:
schema:
$ref: '#/components/schemas/ExternalDeviceImportResponse'
'/device/external/import/{jobKey}':
delete:
tags:
- External Device
summary: Resets status of external devices import process started by the `POST /device/external/import` call
parameters:
- name: jobKey
in: path
description: The job id to be reset
required: true
schema:
type: string
responses:
'200':
description: Import process canceled
content:
application/json:
schema:
$ref: '#/components/schemas/ExternalDeviceImportJobResetResponse'
/tags:
get:
tags:
- Device tags
summary: Get device tags
description: Returns list of tags of all devices the user has access to
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
properties:
tags:
type: array
description: List of tags
example:
- beacon
- hospital
- important
items:
type: string
description: Tag value
/portalbeam/image:
post:
tags:
- Device (Portal Beam)
summary: Store or erase Portal Beam calibration image
description: |-
If an empty string is sent, the calibration image associated with this Portal Beam is erased.
The value sent to API is validated according to schema below before it's accepted.
requestBody:
content:
application/x-www-form-urlencoded:
schema:
properties:
uniqueId:
type: string
description: Unique ID of the Portal Beam.
image:
allOf:
- $ref: '#/components/schemas/OccupancyImage'
required:
- uniqueId
- image
responses:
'204':
description: No Content
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
get:
tags:
- Device (Portal Beam)
summary: List images for one or more Portal Beams
description: Fetches all image data associated with a list of Portal Beams.
parameters:
- name: uniqueId
in: query
description: List of Unique IDs of Portal Beams.
required: true
schema:
type: array
items:
type: string
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: array
description: Images per uniqueId
items:
type: object
properties:
uniqueId:
type: string
image:
allOf:
- $ref: '#/components/schemas/OccupancyImage'
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
/portalbeam/stitching:
post:
tags:
- Device (Portal Beam)
summary: Create or update stitching between two devices
description: |-
Creates or updates a stitching definition between two devices.
The relationship is treated as undirected (order does not matter).
requestBody:
required: true
content:
application/vnd.com.kontakt+json; version=10:
schema:
$ref: '#/components/schemas/StitchingPair'
responses:
'204':
description: Stitching accepted (created or updated)
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
get:
tags:
- Device (Portal Beam)
summary: Get stitching by uniqueIds
parameters:
- name: uniqueIds
in: query
required: true
schema:
type: array
items:
type: string
responses:
'200':
description: Stitching config
content:
application/vnd.com.kontakt+json; version=10:
schema:
type: array
items:
$ref: '#/components/schemas/StitchingConfig'
'401':
description: Unauthorized
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- bearer_token: []
- api_key: []
delete:
tags:
- Device (Portal Beam)
summary: Delete stitching between two selected beams
description: |-
Deletes stitching between two devices identified by their uniqueIds.
The pair is treated as undirected: (A,B) is the same as (B,A).
parameters:
- name: firstUniqueId
in: query
required: true
schema:
type: string
description: Unique ID of one device in the stitched pair.
- name: secondUniqueId
in: query
required: true
schema:
type: string
description: Unique ID of the other device in the stitched pair.
responses:
'204':
description: Stitching pair deleted (or did not exist)
'400':
description: 'Invalid request (e.g., identical IDs)'
security:
- bearer_token: []
- api_key: []
/eddystone:
post:
tags:
- Eddystone
summary: Decrypt Eddystone Encrypted Telemetry packet
description: |
Decrypts Eddystone Telemetry data from an Eddystone Encrypted Telemetry frame. This information can be extracted by specifying one of the two sets of information in the request's parameters:
* Beacon's Unique ID (`uniqueId`) and its Eddystone Encrypted Telemetry frame (`frame`)
* Eddystone Ephemeral ID (`eid`) and corresponding Eddystone Encrypted Telemetry frame (`frame`)
requestBody:
content:
application/x-www-form-urlencoded:
schema:
properties:
uniqueId:
description: Unique ID. Should be used only if `eid` is not specified.
type: string
eid:
description: Eddystone Ephemeral ID. Should be used only if `uniqueId` is not specified.
type: string
frame:
description: Base64-encoded Eddystone Encrypted Telemetry frame payload
type: string
format: byte
required:
- frame
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
$ref: '#/components/schemas/EddystoneDecrypted'
security:
- bearer_token: []
- api_key: []
parameters:
- $ref: '#/components/parameters/accept'
/firmware:
get:
tags:
- Firmware
summary: Get Firmwares
description: Returns firmware for specified devices.
parameters:
- name: uniqueId
in: query
description: List of Unique IDs of device for which Firmwares should be returned.
required: true
schema:
type: array
items:
type: string
- name: type
in: query
description: 'Filtering parameter that allows to return only scheduled or not scheduled Firmwares. If not specified, both types will be returned.'
required: false
schema:
type: string
enum:
- ALL
- SCHEDULED
- NONSCHEDULED
default: ALL
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
firmwares:
description: List of Firmwares
type: array
items:
$ref: '#/components/schemas/Firmware'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
security:
- bearer_token: []
- api_key: []
'/firmware/{firmwareVersion}':
get:
tags:
- Firmware
summary: Get a Firmware
description: Returns a single Firmware version.
parameters:
- name: firmwareVersion
in: path
description: Firmware version
required: true
schema:
type: string
- name: deviceType
in: query
description: Device type
required: true
schema:
type: string
enum:
- BEACON
- GATEWAY
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
$ref: '#/components/schemas/FirmwareCore'
security:
- bearer_token: []
- api_key: []
deprecated: true
'/firmware/{firmwareVersion}/file':
get:
tags:
- Firmware
summary: Get a Firmware file
description: Redirects to a specific Firmware file
parameters:
- name: firmwareVersion
in: path
description: Firmware version
required: true
schema:
type: string
- name: deviceType
in: query
description: Device type
required: true
schema:
type: string
enum:
- BEACON
- GATEWAY
- $ref: '#/components/parameters/accept'
responses:
'303':
description: See Other
security:
- bearer_token: []
- api_key: []
deprecated: true
/manager:
get:
tags:
- Manager
summary: Get all Managers
description: Returns a list Managers. It includes the Manager that has made this API request and all Subordinate Managers for that Manager.
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
managers:
type: array
items:
allOf:
- type: object
x-sl-internally-excluded: true
x-sl-error-message: You do not have permission to view this reference
- type: object
properties:
company:
$ref: '#/components/schemas/Company'
searchMeta:
$ref: '#/components/schemas/SearchMeta'
'401':
description: Unauthorized
security:
- bearer_token: []
- api_key: []
parameters:
- $ref: '#/components/parameters/accept'
/namespaces:
get:
tags:
- Eddystone
summary: Get Namespaces
description: Returns a list of Eddystone UID Namespaces broadcasted by beacons assigned to the current Manager and their Subordinate Managers.
parameters:
- name: namespace
in: query
description: List of Eddystone UID Namespaces (non-Secure). Response will contain only Namespaces from this list.
required: false
schema:
type: array
items:
type: string
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
namespaces:
type: array
items:
type: object
properties:
namespace:
type: string
description: Eddystone UID Namespace set by a Manager of a beacon.
secureNamespace:
type: string
description: Secure Eddystone UID Namespace advertised by a beacon. Same as `proximity` if a beacon is not shuffled.
shuffled:
type: boolean
description: Flag indicating whether `secureNamespace` is a shuffled Eddystone UID Namespace.
shared:
type: boolean
description: Flag indicating whether `namespace` comes from a shared beacon.
searchMeta:
$ref: '#/components/schemas/SearchMeta'
security:
- bearer_token: []
- api_key: []
/order:
get:
tags:
- Order
summary: Check Order IDs
description: Returns a list of all **unassigned** devices (specifically their Unique IDs) for the Order IDs provided in the request parameter.
parameters:
- name: orderId
in: query
description: List of Order IDs to be checked
required: true
schema:
type: array
items:
type: string
description: Order ID
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: array
description: List of Unique IDs of devices that are associated with provided Order IDs
items:
type: string
description: Unique ID
security:
- bearer_token: []
- api_key: []
/order/claim:
post:
tags:
- Order
summary: Claim an order
description: |-
Assigns one or more order's devices to this account. An order has to exist in DCC and NOT be claimed elsewhere for this to work.
Devices from the order that already exist in API will be skipped. Devices that didn't exist in API prior to claiming will be created from scratch.
This operation is idempotent: claiming an order on the same account more than once has no effect.
parameters:
- name: orderId
in: query
description: List of Order IDs that should be claimed on this account
required: true
schema:
type: array
items:
type: string
description: Order ID
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
$ref: '#/components/schemas/OrderManagementResponse'
security:
- bearer_token: []
- api_key: []
get:
tags:
- Order
summary: Get order status
description: |
After claiming/releasing the order in DCC, all subsequent device fetch/cleanup jobs in API
are performed asynchronously. This endpoint allows to track the progress of those operations.
parameters:
- name: orderId
in: query
description: List of Order IDs for which the order job progress will be displayed.
required: true
schema:
type: array
items:
type: string
description: Order ID
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
orders:
type: object
description: Per-order job progress
properties:
each orderId from request:
type: object
description: Job progress for this order ID
properties:
runningJobs:
type: array
items:
type: string
description: 'Currently running jobs. ImportOrderFromDccJob imports and persists devices from DCC after order claiming, DeleteOrderDevicesJob deletes order devices after releasing.'
lastImportJob:
type: object
description: Detailed information about each step that was performed on the last import job to date.
lastDeleteJob:
type: object
description: Detailed information about each step that was performed on the last delete job to date.
security:
- bearer_token: []
- api_key: []
/proximities:
get:
tags:
- Proximities
summary: Get Proximity UUIDs
description: Returns a list of iBeacon Proximity UUIDs broadcasted by beacons assigned to the current Manager and their Subordinate Managers.
parameters:
- name: proximity
in: query
description: List of iBeacon Proximity UUIDs (non-Secure). Response will contain only Proximity UUIDs from this list.
required: false
schema:
type: array
items:
type: string
format: uuid
- $ref: '#/components/parameters/accept'
responses:
'200':
description: OK
content:
application/vnd.com.kontakt+json;version=10:
schema:
type: object
properties:
proximities:
type: array
items:
type: object
properties:
proximity:
type: string
format: uuid
description: iBeacon Proximity UUID set by a Manager of a beacon.
secureProximity:
type: string
format: uuid
description: Secure iBeacon Proximity UUID advertised by a beacon. Same as `proximity` if a beacon is not shuffled.
shuffled:
type: boolean
description: Flag indicating whether `secureProximity` is a shuffled iBeacon Proximity UUID.
shared:
type: boolean
description: Flag indicating whether `proximity` comes from a shared beacon.
searchMeta:
$ref: '#/components/schemas/SearchMeta'
security:
- bearer_token: []
- api_key: []
components:
parameters:
JobKeyPathParam:
name: jobKey
in: path
required: true
schema:
type: string
example: schedule-firmware-upgrade_b4dfa2ed-4ac9-4b36-b662-be6be3925193_c3568e92-ad5d-4301-8420-08eefb77a1ce
BulkDeviceAccessJobKeyPathParam:
name: jobKey
in: path
required: true
description: Name of the job
schema:
type: string
example: grant-device-access_b4dfa2ed-4ac9-4b36-b662-be6be3925193
QueryDeviceType:
name: deviceType
in: query
description: Limits the response only to devices with a given type
required: false
schema:
$ref: '#/components/schemas/DeviceType'
QueryCurrentLocationCampusIdFilter:
name: currentLocation.campusId
in: query
description: Filter by Campus IDs. Only devices from the specified campuses will be counted.
required: false
schema:
type: array
items:
type: number
description: Individual campus ID
QueryCurrentLocationBuildingIdFilter:
name: currentLocation.buildingId
in: query
description: Filter by Building IDs. Only devices from the specified buildings will be counted.
required: false
schema:
type: array
items:
type: number
description: Individual building ID
QueryCurrentLocationFloorIdFilter:
name: currentLocation.floorId
in: query
description: Filter by Floor IDs. Only devices from the specified floors will be counted.
required: false
schema:
type: array
items:
type: number
description: Individual floor ID
Query:
in: query
name: q
required: false
description: Filtering query
schema:
type: string
QueryType:
in: query
name: queryType
required: false
description: |
`COUNTED` returns a number of all items (not just on the current page) in the `searchMeta` object.
schema:
type: string
enum:
- NORMAL
- COUNTED
- SEARCH_META
default: NORMAL
QueryMaxResult:
in: query
name: maxResult
required: false
description: Maximum number of results
schema:
type: integer
default: 50
minimum: 0
maximum: 500
QueryStartIndex:
in: query
name: startIndex
required: false
description: Starting row index for pagination. Start index should be equal to `pageNumber * maxResult`.
schema:
type: integer
default: 0
minimum: 0
QueryDeviceOrderBy:
in: query
name: orderBy
required: false
description: |-
Order results by selected field. In case the resulting order is non-unique, entries with duplicate values are sorted by device id.
**Applicable fields:**
- alias
- batteryLevel
- created
- deployment.status
- deviceType
- id
- instanceId
- interval
- lastErrorTimestamp
- lastSeen
- major
- manager.lastName
- minor
- model
- name
- namespace
- orderId
- pendingConfig
- product
- profiles
- proximity
- role
- scheduledVersion
- txPower
- uniqueId
- updated
- vendor
schema:
type: string
QueryDeviceSelector:
in: query
name: selector
required: false
style: form
description: |-
Limit returned response to the specified fields. Comma separated. Handy in reducing payload sizes.
`uniqueId` and `queriedBy` fields will always be included in the response.
**Applicable fields:**
- accelerometer
- access
- alias
- batteryLevel
- bleScanSettings
- category
- currentLocation
- deployedLat
- deployedLng
- deployment.status
- deviceType
- displaySettings
- firmware
- futureId
- id
- instanceId
- interval
- irReceiverSettings
- irTransmitterSettings
- lastErrorTimestamp
- lastSeen
- lat
- lng
- localAlertingSettings
- lowBatterySettings
- mac
- major
- managerId
- metadata
- minor
- model
- name
- namespace
- occupancySettings
- orderId
- ownerId
- packets
- pendingConfig
- powerSaving
- product
- productCode
- profiles
- proximity
- role
- rssi0m
- rssi1m
- scheduledVersion
- secureNamespace
- secureProximity
- sensorSettings
- shares
- shuffled
- status
- tags
- telemetryFields
- txPower
- url
- vendor
schema:
type: string
example: 'uniqueId,product,deployment.status'
DeviceTypeList:
name: deviceType
in: query
description: 'Device types, listed in the same order as the uniqueIds they correspond to.'
schema:
type: array
items:
type: string
example:
- BEACON
- GATEWAY
UniqueIdList:
name: uniqueId
in: query
description: List of devices' unique ids
required: true
schema:
type: array
items:
type: string
example:
- 11P10AvW
- 11S13AhY
UniqueId:
name: uniqueId
in: query
description: Device's unique ID
example: 11P10AvW
required: true
schema:
type: string
UniqueIdPath:
name: uniqueId
in: path
description: 'Device''s unique ID, provided in path (URL)'
example: 11P10AvW
required: true
schema:
type: string
accept:
name: Accept
in: header
required: true
schema:
type: string
default: application/vnd.com.kontakt+json;version=10
description: Accept header is required.
FederationIdPath:
name: federationId
in: path
description: 'Device federation''s unique identifier, provided in path (URL)'
required: true
schema:
type: string
format: uuid
example: a0f49b9e-b2e7-4a5f-a94a-047014eb3958
securitySchemes:
bearer_token:
type: http
scheme: bearer
bearerFormat: JWT
description: |-
Provide a JWT in the `Authorization: Bearer ` header. This is the standard authentication method for all API requests.
Obtain a token via the OAuth2 Client Credentials flow from the Kontakt.io Keycloak identity provider.
api_key:
type: apiKey
name: Api-Key
in: header
description: |-
**Deprecated — do not use for new integrations.** This method exists solely for backward compatibility and will be removed in a future release. Use JWT Bearer token authentication instead.
If you still need an API Key: sign in to **Kio Cloud** > select **Users** > select **Security** > copy your **Server API Key**.
management_api_key:
name: Api-Key
type: apiKey
in: header
description: Special management API Key with additional privileges used by authorized users.
schemas:
LoraProvisionRequest:
title: LoRa Provision Request
type: object
properties:
devEui:
type: string
description: 'Device EUI (EUI64 hex string, 16 characters). IMPORTANT! We assume that the EUI64 can be mapped to the device MAC address in the following way. For base station the FFFE is placed after first 6 characters in the MAC address. For gateway the FFFF is placed after first 6 characters in the MAC address.'
example: AABBCCFFFF001122
appEui:
type: string
description: AppEUI for OTAA activation (EUI64 hex string). Renamed to JoinEUI in LoRaWAN 1.1.
example: '0000000000000001'
appKey:
type: string
description: Application key (128-bit hex string). Maps to LoRaWAN 1.0.x nwk_key.
example: 00112233445566778899AABBCCDDEEFF
required:
- devEui
- appEui
- appKey
LoraProvisionStatusResponse:
title: LoRa Provision Status Response
type: object
properties:
devEui:
type: string
description: Device EUI
example: AABBCCDDEE001122
defaultPassword:
type: string
description: Factory default password for initial connection
example: changeme
newPassword:
type: string
description: Device's current password from DM catalog
example: abcd
status:
type: string
description: Provisioning status
enum:
- PROVISIONED
- NOT_PROVISIONED
UniqueId:
description: Unique identifier of a device.
type: string
example: 11P10AvW
CreatedDate:
description: Informs when the object has been created.
type: string
format: date-time
example: '2023‐09‐18T15:33:00Z'
UpdatedDate:
description: Informs when the object has been updated.
type: string
format: date-time
example: '2023‐09‐18T15:33:00Z'
MacAddress:
description: Mac address of a device.
type: string
example: '00:FA:B6:04:1F:97'
FirmwareVersion:
description: Firmware version
type: string
example: 2.8.8
FirmwareUrl:
description: Firmware url to be used by PL to download firmware binary
type: string
FirmwareBinaryChecksum:
description: Firmware binary checksum
type: string
example: fc633ab3
SecureConfigString:
type: string
format: byte
description: Base64-encoded data with a new Config/Command for a Device with an Unique ID specified in the `uniqueId` field.
TemperatureMonitorProbeCertificate:
title: Temperature Monitor Probe Certificates
type: object
properties:
expirationDate:
type: string
format: date-time
description: Expiration date of the probe certificates
url:
type: string
description: URL to download probe certificate
TemperatureMonitorProbe:
title: Temperature Monitor Probe
type: object
properties:
uniqueId:
$ref: '#/components/schemas/UniqueId'
cert:
$ref: '#/components/schemas/TemperatureMonitorProbeCertificate'
TemperatureMonitorProbes:
title: Temperature Monitor Probes
type: object
properties:
probes:
type: array
items:
$ref: '#/components/schemas/TemperatureMonitorProbe'
DeviceCommandResponse:
type: object
title: Device Command Response
description: 'Unified response for all device commands (alarm, get_monitor_state, read_all).'
properties:
id:
type: string
format: uuid
description: Unique identifier of the command
created:
type: string
format: date-time
description: Timestamp when the command was created
expirationDate:
type: string
format: date-time
nullable: true
description: The time at which command is marked as expired and not processed anymore
state:
type: string
enum:
- NEW
- PENDING
- APPLIED
- FAILED
description: Current state of the command
applyingBy:
type: object
nullable: true
properties:
cloud:
type: string
enum:
- CISCO
- KONTAKT
error:
type: object
nullable: true
description: |
Structured failure reason. Populated when state is FAILED. The `type` field is a stable
error code (e.g. `ExternalServiceError`, `RejectedByDevice`, `NoGatewayAvailable`,
`JobTimedOut`, `RejectedByGatewayRequestService`, `Unknown`) that mirrors the failure
vocabulary surfaced on the `dm-device-command-changed` Kafka topic so clients can
correlate REST and Kafka failures.
properties:
type:
type: string
description: Stable error code identifying the failure category.
message:
type: string
description: 'Human-readable explanation, safe to log.'
command:
type: object
properties:
type:
type: string
enum:
- alarm
- get_monitor_state
- read_all
body:
type: object
nullable: false
description: Request parameters echoed back. Empty object for commands with no request body.
deviceResponse:
type: object
nullable: true
description: Device response payload. Populated when state is APPLIED.
additionalProperties: true
AlarmCommandBody:
type: object
title: Alarm Command Body
description: Request payload for creating an alarm command (commandName=alarm)
additionalProperties: false
required:
- sensor
- type
- action
- counter
properties:
sensor:
type: string
enum:
- TEMPERATURE_0
- TEMPERATURE_1
- TEMPERATURE_2
- HUMIDITY_0
description: The sensor that triggered the alert
type:
type: string
enum:
- MEASUREMENT_OUT_OF_BOUNDS
- SENSOR_ERROR
- HARDWARE_ERROR
description: The type of alert
action:
type: string
enum:
- ACKNOWLEDGED
- RESOLVED
description: The action to perform on the alert
counter:
type: integer
description: Alert counter — matches the device's alarm sequence for the acknowledged/resolved alert.
EmptyCommandBody:
type: object
title: Empty Command Body
description: |
Empty body for body-less commands (e.g. `get_monitor_state`, `read_all`).
`additionalProperties: false` keeps callers from passing junk that the wire
contract would silently swallow.
additionalProperties: false
ApiError:
type: object
title: API Error
properties:
id:
type: string
description: Internal API error code
example: API_ERROR_1693477316246
status:
type: number
description: HTTP response status code
example: 422
cause:
type: string
description: General cause of the error
example: ValidationError
message:
type: string
description: Error message with an explanation of the problem
example: Invalid value for field name
details:
type: array
description: Optional details
nullable: true
items:
type: object
properties:
field:
type: string
example: name
error:
type: string
description: Error name
example: INVALID_VALUE
message:
type: string
description: Error message
example: Invalid value for field name
Company:
type: object
properties:
id:
type: string
format: UUID
name:
type: string
uniqueId:
type: string
countryCode:
type: string
nullable: true
ConfigBle:
type: object
description: General BLE advertising settings.
properties:
name:
description: Bluetooth name.
maxLength: 15
type: string
profiles:
type: array
description: List of beacon profiles Device should broadcast.
deprecated: true
nullable: true
items:
type: string
enum:
- IBEACON
- EDDYSTONE
packets:
description: Beacon advertising packets that should be broadcasted by a device.
type: array
nullable: true
items:
type: string
enum:
- IBEACON
- EDDYSTONE_UID
- EDDYSTONE_URL
- EDDYSTONE_EID
- EDDYSTONE_TLM
- EDDYSTONE_ETLM
- KONTAKT
- KONTAKT_TLM
- KONTAKT_LOCATION
- BUTTON_IBEACON
- QUUPPA
customConfiguration:
type: string
description: |
Custom configuration parameters for special use-cases. If the solution prepared for you by Kontakt.io takes advantage of these properties, please get in touch with our Support Team for a proper documentation.
**Note (POST /config/create):** PIDs not on the target device's accepted list are silently filtered out before the pending-config record is persisted. The server returns `201` regardless. To detect a dropped PID, compare the `customConfiguration` keys you sent with the keys echoed back in the response for the same `uniqueId`.
nullable: true
shuffled:
type: boolean
description: Flag indicating whether a beacons should turn the Kontakt.io Secure Shuffling on (`true`) or of (`false`).
nullable: true
txPower:
type: integer
minimum: 0
maximum: 7
description: 'Bluetooth transmission power level. Possible values are integers from 0 to 7 (nRF51-based devices), 1 to 7 (nRF52-based devices), and 1 or 6 (Card Tag CT16-2).'
nullable: true
interval:
type: integer
minimum: 100
maximum: 10240
description: Advertising interval in milliseconds for iBeacon and Eddystone packets.
nullable: true
kontaktFrameInterval:
type: integer
minimum: 20
maximum: 10240
description: Advertising interval in milliseconds for Kontakt.io Secure Profile packet (Kontakt Packet).
nullable: true
telemetryInterval:
type: integer
nullable: true
minimum: 20
maximum: 10240
description: Advertising interval in milliseconds for Kontakt.io Telemetry packet.
locationFrameInterval:
type: integer
nullable: true
minimum: 100
maximum: 10240
description: Advertising interval in milliseconds for Kontakt.io Location packet.
telemetryFields:
type: array
description: |
Bitmask-based configuration of fields included in the Kontakt.io Telemetry packet.
Each value enables a specific telemetry field. Available fields depend on device hardware capabilities.
| Value | Description |
|-------|-------------|
| AIR_PRESSURE | Air pressure in Pa, as a float32 number |
| AIR_QUALITY | Air-Quality-Index (AQI) in units 0-254, 255 meaning invalid |
| BATTERY | Battery percentage, from 0% to 100%, with 255 meaning externally-powered |
| BLE_CHANNEL | BLE channel on which it is advertising: 0 - 40 |
| BLE_SCAN_RESULT | BLE scan results |
| BUTTON_CLICK | Seconds since the last button click, saturating at 0xFFFF |
| BUTTON_DOUBLE_CLICK | Seconds since the last double click, saturating at 0xFFFF |
| DOUBLE_TAP_EVENT | Seconds since the last double tap, saturating at 0xFFFF |
| GAS_SENSOR | Gas sensor reading |
| GPIO | GPIO state as a telemetry, not implemented |
| HUMIDITY | Relative humidity percentage 0-100, 255 meaning invalid |
| IDENTIFIED_BUTTON_CLICK | Click 8-bit counter, and seconds since the last button click, saturating at 0xFFFF |
| INOUT_COUNTER | In/out people counter |
| IR_STATS | IR scan statistics |
| LIGHT_LEVEL | Light level as a percentage: 0 - dark, 100 - sunny environment, 255 - invalid |
| LIGHT_LEVEL_LUX | Light level in lux, as an uint16 |
| LOGGING_ENABLED | Show if logging is enabled and if data is available for download |
| MOVEMENT_EVENT | Movement 8-bit counter, and seconds since the last movement click, saturating at 0xFFFF |
| MOVEMENT_THRESHOLD_EVENT | Seconds since the last movement, saturating at 0xFFFF |
| OCCUPANCY | Number of people measured by the detector: 0 - 254, 255 - invalid |
| PEOPLE_DETECTION | People detection |
| PIR_DETECTION | Seconds since the last PIR movement, saturating at 0xFFFF |
| PROXIMITY_REPORT | Proximity report |
| ROOM_NUMBER | Room number, either measured, or configured. Uint16 |
| RSSI_SCAN | RSSI scan results |
| SOAP_DISPENSER | Soap dispenser event |
| TAP_EVENT | Seconds since the last tap, saturating at 0xFFFF |
| TEMPERATURE | Temperature as signed 8-bit integer, from -128 to 127C |
| TEMPERATURE_16_BITS | Temperature as an FP8.8 signed fixed-point number |
| TWO_BUTTON_INFO | 2x click 8-bit counters, and seconds since the any button click, saturating at 0xFFFF |
| UTC_TIME | Unix timestamp, UTC time from 1970 in seconds |
| RAW_ACCELEROMETER | Sensitivity: 1/1000 of a g; X, Y, Z values in units of the sensitivity |
nullable: true
items:
type: string
enum:
- AIR_PRESSURE
- AIR_QUALITY
- BATTERY
- BLE_CHANNEL
- BLE_SCAN_RESULT
- BUTTON_CLICK
- BUTTON_DOUBLE_CLICK
- DOUBLE_TAP_EVENT
- GAS_SENSOR
- GPIO
- HUMIDITY
- IDENTIFIED_BUTTON_CLICK
- INOUT_COUNTER
- IR_STATS
- LIGHT_LEVEL
- LIGHT_LEVEL_LUX
- LOGGING_ENABLED
- MOVEMENT_EVENT
- MOVEMENT_THRESHOLD_EVENT
- OCCUPANCY
- PEOPLE_DETECTION
- PIR_DETECTION
- PROXIMITY_REPORT
- ROOM_NUMBER
- RSSI_SCAN
- SOAP_DISPENSER
- TAP_EVENT
- TEMPERATURE
- TEMPERATURE_16_BITS
- TWO_BUTTON_INFO
- UTC_TIME
- RAW_ACCELEROMETER
locationFrameChannel:
type: integer
nullable: true
description: BLE broadcasting channel used for Kontakt.io Location packet broadcasts. 0 means randomized channel broadcasting.
enum:
- 0
- 37
- 38
- 39
ConfigIBeacon:
type: object
description: iBeacon settings.
properties:
proximity:
type: string
format: UUID
description: iBeacon Proximity UUID.
nullable: true
major:
type: integer
format: uint16
minimum: 0
maximum: 65535
description: iBeacon Major.
nullable: true
minor:
type: integer
format: uint16
minimum: 0
maximum: 65535
description: iBeacon Minor.
nullable: true
rssi1m:
type: array
description: List of new Calibrated RSSI@1m values (iBeacon) for each TX power level the Device can use.
nullable: true
items:
type: integer
example:
- -115
- -84
- -81
- -77
- -72
- -69
- -65
- -59
ConfigEddystone:
type: object
description: Eddystone settings.
properties:
namespace:
type: string
description: Eddystone UID Namespace.
nullable: true
maxLength: 20
minLength: 20
instanceId:
type: string
description: Eddystone UID Instance ID.
nullable: true
maxLength: 12
minLength: 12
url:
type: string
description: Eddystone URL address. Hex-encoded according to Eddystone specification.
nullable: true
decodedUrl:
type: string
description: Eddystone URL address. Alias for `url` but in decoded format. `decodedUrl` takes precedence.
nullable: true
rssi0m:
type: array
description: List of new Calibrated RSSI@0m values (Eddystone) for each TX power level the Device can use.
deprecated: true
nullable: true
items:
type: integer
ConfigButton:
type: object
description: Button settings.
properties:
buttonFeatures:
type: array
description: |
Bitmask-based hardware button configuration. Each value in the list enables a specific flag.
An empty list `[]` corresponds to a mask of `0b000` (all flags unset) which is the default:
click and long-press are enabled, triple-click is disabled.
Send an empty list to restore defaults.
Note: `CLICK_OFF` and `LONG_PRESS_OFF` are inverted flags — setting them **disables** a behavior
that is on by default. `TRIPLE_CLICK` is a normal flag — setting it **enables** a behavior
that is off by default.
| Value | Description |
|-------|-------------|
| CLICK_OFF | Disable single-click detection. On by default — set this flag to turn it off |
| LONG_PRESS_OFF | Disable long-press detection. On by default — set this flag to turn it off |
| TRIPLE_CLICK | Require a triple-click to trigger a panic event instead of a single click. Off by default |
| MULTI_CLICK | Enable multi-click detection. Mutually exclusive with TRIPLE_CLICK. Off by default |
items:
type: string
enum:
- CLICK_OFF
- LONG_PRESS_OFF
- TRIPLE_CLICK
- MULTI_CLICK
multiClickCount:
type: integer
description: |
Number of clicks required for multi-click detection (1–10). Only applicable when MULTI_CLICK is set in buttonFeatures.
minimum: 1
maximum: 10
panicDuration:
type: integer
minimum: 0
maximum: 65535
description: Number of second the `BUTTON_IBEACON` packet should be broadcast after a button press.
ConfigEid:
type: object
description: Eddystone-EID settings.
properties:
eidIdentityKey:
description: Eddystone-EID Identity Key.
type: string
nullable: true
eidRotationPeriodExponent:
description: Eddystone-EID rotation period exponent.
type: integer
nullable: true
minimum: 0
maximum: 15
EditableGatewayConfig:
description: Gateway (e.g. Portal Light) settings that can be changed via API
type: object
properties:
applications:
type: object
properties:
system:
type: object
properties:
wifiSsid:
type: string
description: Name of the WiFi network a gateway should connect to
minLength: 2
maxLength: 32
wifiProtocol:
type: string
description: WiFi authentication protocol that a gateway should use
enum:
- WPA_PSK
- WPA_EAP
- OPEN
wifiUserName:
type: string
description: 'When `wifiProtocol` is set to `WPA_EAP` this parameter represents PEAP MSCHAPv2 username. If `WPA_PSK` is used, this value will be ignored by a gateway.'
maxLength: 256
wifiPassword:
type: string
description: 'When `wifiProtocol` is set to `WPA_EAP` this parameter represents PEAP MSCHAPv2 password. If `WPA_PSK` is used, this value will be ignored by a gateway.'
maxLength: 63
apiHost:
type: string
description: DM API host URL.
format: uri
minLength: 1
apiKey:
type: string
description: API key for DM API (alphanumeric)
minLength: 1
dataHost:
type: string
description: Data host URL
format: uri
dataApiKey:
type: string
description: API key for Data host (alphanumeric)
otaUrl:
type: string
description: OTA update URL
format: uri
maxLength: 64
proxyURL:
type: string
description: Proxy URL for the gateway to connect to. Empty value disables proxying.
minLength: 0
maxLength: 64
default: ''
proxyPort:
type: integer
description: Proxy port for the gateway to connect to
minimum: 0
maximum: 65535
default: 80
eapType:
type: string
description: Extensible Authentication Protocol (EAP) for network access
enum:
- DEFAULT
- TLS
- TTLS
- PEAP
default: DEFAULT
ibeaconUUID:
type: string
format: uuid
description: |-
iBeacon UUID to broadcast.
Broadcasting the iBeacon is disabled by default. To enable, the ibeaconUUID need to be set.
minLength: 36
maxLength: 36
default: 00000000-0000-0000-0000-000000000000
ibeacon_major:
type: integer
description: Major to use when broadcasting iBeacon frames.
default: 0
ibeacon_minor:
type: integer
description: Minor to use when broadcasting iBeacon frames.
default: 0
roomID:
type: integer
description: Room ID used in location frame
default: 0
tx_power:
type: integer
description: Tx power used by the gateway (allowed values are defined in documentation)
filtration_mask:
type: integer
description: |-
Filtration mask is the second stage of frame filtration implemented in Portal light. Each bit in that mask defines whether to process a specific type of frames or omit them.
Bit order is as follows: Mac filtration, Eddystone,iBeacon, Kontakt.
The default value is 0b1111 (15 decimal), meaning that Kontakt frames, iBeacon, Eddystone and devices with Kontakt MAC will be sent to the cloud. It is possible to set this mask to process only selected types of frames/devices.
default: 15
rssi_threshold:
type: integer
description: Rssi threshold filtration is the first stage of frame filtration implemented in Portal light. It means that if rssi filtration is on and set to desired value then all scans with lower rssi will be rejected.
default: -127
bleAdvChannel:
type: integer
description: |-
BLE advertising channel.
All channels advertising (0) is set as a default. Possibility to advertise only on one of three channels was added for Location Engine needs: 37, 38, 39
Other values such as 10,35 etc… will be treated as 0 - it means all channels advertising.
enum:
- 0
- 37
- 38
- 39
bleScanChannel:
type: integer
description: |-
BLE scanning channel.
All channels scanning (0) is set as a default. Possibility to scan only on one of three channels was added for Location Engine needs: 37, 38, 39
Other values such as 10,35 etc… will be treated as 0 - it means all channels scanning.
enum:
- 0
- 37
- 38
- 39
dm_poll_interval_s:
type: integer
description: DM poll interval in seconds.
defaultNTP:
type: string
description: Default NTP server URL.
format: uri
minLength: 1
secondNTP:
type: string
description: Secondary NTP server URL.
format: uri
minLength: 1
apiCACertificate:
type: string
description: API CA certificate.
minLength: 1
wpa2Certificate:
type: string
description: |-
Enterprise WiFi. Base64-encoded P12 certificate.
Keystore in p12/pfx format (with certificate and private key)
wpa2CertificatePassword:
type: string
description: |-
Enterprise WiFi. Certificate password.
Password to the keystore
wpa2PrivateKeyAlias:
type: string
description: |-
Enterprise WiFi. Alias for private key.
Private key alias specified by --name param in openssl utility
default: '1'
wpa2CACertificate:
type: string
description: |-
Enterprise WiFi. For deployment and client-specific requirement there was a need to add CA certificates to validate the server.
Sent as a string in .pem format with header -----BEGIN CERTIFICATE----- and footer ----END CERTIFICATE-----
beacon_packets_mask:
type: integer
description: Beacon packets mask.
led_intensity:
type: integer
description: LED brightness can be adjusted from 0% (completely off) to 100% - maximum brightness.
minimum: 0
maximum: 100
default: 10
blink_interval_s:
type: integer
description: Blink interval in seconds.
minimum: 0
maximum: 3600
ir_duty_cycle:
type: integer
description: IR duty cycle (0-100%).
minimum: 0
maximum: 100
ir_intensity:
type: integer
description: IR intensity (0-100%).
minimum: 0
maximum: 100
device_name:
type: string
description: Device name.
minLength: 1
adv_int:
type: integer
description: Advertising interval. Must be between 160 and 16384.
minimum: 160
maximum: 16384
debug_features_mask:
type: integer
description: Debug features mask.
bound_device:
type: string
description: |-
Bound device must be a lowercase MAC address.
Only both bound_device and bound_device_password can be set to a non-blank string at the same time or both be set to blank.
bound_device_password:
type: string
description: Bound device password. Must be provided together with bound_device.
relay_mode:
type: integer
description: Relay mode.
mqtt_auth:
type: string
description: MQTT authentication credentials.
ir_config_mask:
type: integer
description: IR configuration mask.
minimum: 0
maximum: 255
data_interval_ms:
type: integer
description: 'Target interval between scans uploads, in ms. 0 means as fast as possible.'
minimum: 0
maximum: 65535
default: 2000
BeaconConfig:
description: Full beacon-type configuration.
allOf:
- $ref: '#/components/schemas/ConfigBle'
- $ref: '#/components/schemas/ConfigIBeacon'
- $ref: '#/components/schemas/ConfigEddystone'
- $ref: '#/components/schemas/ConfigButton'
- $ref: '#/components/schemas/ConfigEid'
- type: object
properties:
powerSaving:
$ref: '#/components/schemas/PowerSavingSettings'
accelerometer:
$ref: '#/components/schemas/AccelerometerSettings'
occupancy:
$ref: '#/components/schemas/OccupancyPhysicalSettings'
irReceiver:
$ref: '#/components/schemas/IrReceiverSettings'
irTransmitter:
$ref: '#/components/schemas/IrTransmitterSettings'
bleScan:
$ref: '#/components/schemas/BleScanSettings'
fingerprinting:
type: object
description: 'Alias for bleScan, same fields. Deprecated.'
deprecated: true
irRoomNumber:
type: integer
minimum: 0
maximum: 4095
default: 65535
description: 'Static room number to broadcast over BLE, and transmit over IR. Up to 12 bits. Default 0xFFFF (disabled)'
irBlinkInterval:
type: integer
minimum: 0
maximum: 999
default: 2
description: 'Time between IR transmissions, encoded as u16. 0 - disabled, 1 - 10 seconds, 11 - 999 milliseconds'
irSlotDuration:
type: integer
minimum: 0
maximum: 65535
default: 0
description: 'Time between IR slots in the same transmission window, in ms. Available for IR room emitters and IR receivers.'
irSlotCount:
type: integer
minimum: 0
maximum: 8
default: 0
description: 'IR slot count. 0 - disabled, 1-4: 2 bits for slots, 5-8: 3 bits for slots. No other values allowed'
irDetectionParams:
type: string
pattern: '^[0-9A-Fa-f]{20}$'
description: Opaque 10-byte struct for IR detection tuning.
example: '01020301000001145403'
pirEnabled:
type: boolean
description: Turn PIR sensor on/off.
airQualityInterval:
type: integer
description: Interval at which the air quality is measured. Unit is seconds. 0 to disable air quality probing.
enum:
- 0
- 3
- 300
lightSensorSamplingInterval:
type: integer
minimum: 0
maximum: 1800000
description: Interval at which the ambient light level is measured. Unit is milliseconds (i.e. 1800000 = 30 minutes).
temperatureOffset:
type: integer
description: Calibration parameter for devices equipped with dedicated thermometer and broadcasting temperature values in `KONTAKT_TLM` packet. This offset does not affect values reported in Eddystone Telemetry packets.
displaySettings:
$ref: '#/components/schemas/DisplaySettings'
lowBatterySettings:
$ref: '#/components/schemas/LowBatterySettings'
sensorSettings:
$ref: '#/components/schemas/SensorSettings'
localAlertingSettings:
$ref: '#/components/schemas/LocalAlertingSettings'
buzzerSnoozing:
$ref: '#/components/schemas/BuzzerSnoozing'
dispenser:
$ref: '#/components/schemas/Dispenser'
timeSync:
type: boolean
description: Synchronizes the device's internal clock
systemTime:
type: string
format: date-time
description: Device system time in ISO 8601 format (UTC). Maps to PID h_system_time (0xA004). Available on nrf52 devices with firmware >= 1.20.
example: '2024-03-30T12:00:00Z'
NewGatewayConfig:
allOf:
- $ref: '#/components/schemas/EditableGatewayConfig'
- type: object
properties:
uniqueId:
description: List of Gateway Unique IDs for which configs should be created.
type: array
items:
$ref: '#/components/schemas/UniqueId'
deviceType:
description: Type of a device that a configuration should be created for.
type: string
enum:
- GATEWAY
- $ref: '#/components/schemas/ConfigLocksRequest'
title: New Gateway Config
NewBeaconConfig:
allOf:
- $ref: '#/components/schemas/BeaconConfig'
- type: object
properties:
uniqueId:
description: List of Beacon Unique IDs for which configs should be created.
type: array
items:
$ref: '#/components/schemas/UniqueId'
deviceType:
description: Type of a device that a configuration should be created for.
type: string
enum:
- BEACON
- $ref: '#/components/schemas/ConfigLocksRequest'
title: New Beacon Config
PendingGatewayConfig:
description: Pending Gateway (e.g. Portal Light) Configuration.
x-stoplight:
id: 5bcdyhznq27sa
allOf:
- $ref: '#/components/schemas/EditableGatewayConfig'
- type: object
properties:
created:
$ref: '#/components/schemas/CreatedDate'
updated:
$ref: '#/components/schemas/UpdatedDate'
uniqueId:
$ref: '#/components/schemas/UniqueId'
- $ref: '#/components/schemas/ConfigLocksResponse'
PendingBeaconConfig:
description: Pending Beacon Configuration.
x-stoplight:
id: gnufpxhymraym
allOf:
- $ref: '#/components/schemas/BeaconConfig'
- type: object
properties:
created:
$ref: '#/components/schemas/CreatedDate'
updated:
$ref: '#/components/schemas/UpdatedDate'
uniqueId:
$ref: '#/components/schemas/UniqueId'
model:
$ref: '#/components/schemas/DeviceModel'
- $ref: '#/components/schemas/ConfigLocksResponse'
EncryptedConfig:
title: Encrypted Config/Command
x-stoplight:
id: yvjpgdrc5gygd
type: object
properties:
uniqueId:
type: string
description: Unique ID of the device that can consume this Encrypted Config/Command.
config:
type: string
format: byte
description: Base64-encoded data with a new Config/Command for a Device with an Unique ID specified in the `uniqueId` field.
UpdateDeviceSecureResponseRequest:
title: Device Update via Secure Response
x-stoplight:
id: z42p6ny4h5b5y
properties:
uniqueId:
description: List of Unique IDs of Devices that should be updated
type: array
items:
type: string
response:
description: List of Base64-encoded Secure Responses from Kontakt.io devices that were configured. A position on this list corresponds to a position of a Unique ID in the `uniqueId` list.
type: array
items:
type: string
format: byte
updated:
description: List of Unix epoch timestamps (seconds) that represent a time and date when a Kontakt.io Device were updated. Mostly used for time synchronization in secure shuffling. A position on this list corresponds to a position of a Unique ID in the `uniqueId` list.
type: array
items:
type: integer
required:
- uniqueId
- response
- updated
UpdateDeviceVirtualAttributesRequest:
description: Device Update Virtual Attributes
x-stoplight:
id: i59cs9vye4tsv
allOf:
- type: object
description: Device selector.
properties:
uniqueId:
description: List of Unique IDs of Devices that should be updated.
type: array
items:
type: string
deviceType:
$ref: '#/components/schemas/DeviceType'
required:
- uniqueId
- deviceType
- $ref: '#/components/schemas/DeviceEditableVirtualAttributes'
- type: object
description: Other updatable virtual properties.
properties:
exclusions:
$ref: '#/components/schemas/OccupancyExclusionZones'
inclusions:
$ref: '#/components/schemas/OccupancyInclusionZones'
deployment.status:
$ref: '#/components/schemas/DeploymentStatus'
deployment.deploymentDate:
type: string
format: date-time
description: Timestamp of when the device was deployed (ISO 8601 format). Defaults to the current time if not provided when updating deployment info.
example: '2026-04-10T12:00:00Z'
deployment.installerEmail:
type: string
description: Email address of the person who deployed the device.
example: john.doe@example.com
deployment.installerName:
type: string
description: First and last name of the person who deployed the device.
example: John Doe
desiredConfig:
type: object
x-sl-internally-excluded: true
x-sl-error-message: You do not have permission to view this reference
protocol:
type: string
description: |
Selects the communication protocol used by the gateway to exchange data with the
Kontakt.io platform. This is the recommended way to configure protocol-related
settings on a gateway; the platform automatically derives the corresponding
`desiredConfig.apiHost`, `desiredConfig.dataHost`, and `desiredConfig.mqttAuth`
values. Applicable to gateway devices only.
enum:
- MQTT
- HTTP
title: Update Device Virtual Attributes
EddystoneDecrypted:
title: Decrypted Eddystone-TLM packet
type: object
properties:
advertisementCount:
type: integer
description: Number of Bluetooth advertising packets broadcasted since the last reboot of a beacon
batteryVoltage:
type: number
description: Battery voltage
raw:
type: string
format: byte
description: Base64-encoded Eddystone Encrypted Telemetry frame
temperature:
type: number
description: 'Temperature of a beacon (**not** an ambient temperature, although it might be similar) in °C'
uptime:
type: integer
description: Number of seconds since the last reboot of a beacon
FirmwareUpgradeScheduleJobResetResponse:
type: object
description: The status of the schedule job before and after it has been deleted
properties:
before:
$ref: '#/components/schemas/FirmwareUpgradeScheduleResponse'
after:
$ref: '#/components/schemas/FirmwareUpgradeScheduleResponse'
FirmwareUpgradeScheduleResponse:
type: object
properties:
jobKey:
type: string
description: Identifier of the job
status:
type: string
description: Job status
enum:
- IN_PROGRESS
- COMPLETED
- NOT_FOUND
- FAILED
result:
type: object
properties:
devicesRequested:
type: number
description: Number of devices requested for firmware upgrade
upgradeScheduled:
type: number
description: Number of devices that the firmware upgrade has been successfully applied to
nothingToUpgrade:
type: number
description: Number of devices that the firmware upgrade is already up to date
devicesInaccessible:
type: number
description: 'Number of devices that the firmware upgrade can''t be applied to, eg. devices from another account'
JobStatus:
type: string
description: Job status.
enum:
- IN_PROGRESS
- COMPLETED
- NOT_FOUND
- FAILED
ExternalDeviceImportResponse:
type: object
properties:
jobKey:
type: string
description: Id of the job.
status:
$ref: '#/components/schemas/JobStatus'
result:
$ref: '#/components/schemas/ExternalDeviceImportResult'
required:
- jobKey
- status
ExternalDeviceImportResult:
type: object
x-examples:
Example 1:
status: FAILURE
fileUrl: 'http://api.kontakt.io/storage/file?path=external-device-import/945ac1be-a543-4dde-8e2c-2d489d4f0dac.csv'
errors:
deploymentStatus: Deployment status is required
category: Category is required
productName: Product name is required
mac: MAC address is required
properties:
status:
$ref: '#/components/schemas/ExternalDeviceImportStatus'
fileUrl:
type: string
description: URL pointing to the CSV file with the import result
errors:
type: object
description: List of errors related to the import process
additionalProperties:
type: string
description: Error description
description: Detailed result details of finished external devices import.
ExternalDeviceImportStatus:
type: string
description: Status of the external device import process
enum:
- SUCCESS
- FAILURE
- PARTIAL
ExternalDeviceImportJobResetResponse:
type: object
description: sdf
properties:
before:
$ref: '#/components/schemas/ExternalDeviceImportResult'
after:
$ref: '#/components/schemas/ExternalDeviceImportResult'
TimeRanges:
type: array
items:
properties:
from:
type: number
minimum: 0
maximum: 23
description: Starting hour for the firmware upgrade
to:
type: number
minimum: 1
maximum: 24
description: Ending hour for the firmware upgrade
FirmwareUpgradeSettingsDto:
type: object
properties:
enabled:
type: boolean
description: Determines whether Firmware Upgrade feature should be enabled for the company
timezone:
type: string
description: Specifies the timezone for the specified schedule
example: Europe/Warsaw
schedule:
type: object
description: Schedule for the firmware upgrade
properties:
monday:
type: object
properties:
ranges:
$ref: '#/components/schemas/TimeRanges'
tuesday:
type: object
properties:
ranges:
$ref: '#/components/schemas/TimeRanges'
wednesday:
type: object
properties:
ranges:
$ref: '#/components/schemas/TimeRanges'
thursday:
type: object
properties:
ranges:
$ref: '#/components/schemas/TimeRanges'
friday:
type: object
properties:
ranges:
$ref: '#/components/schemas/TimeRanges'
saturday:
type: object
properties:
ranges:
$ref: '#/components/schemas/TimeRanges'
sunday:
type: object
properties:
ranges:
$ref: '#/components/schemas/TimeRanges'
rssiThreshold:
type: integer
format: int32
description: Rssi threshold below which firmware upgrade will not be applied
FirmwareUpgradeScheduleRequest:
type: object
properties:
q:
type: string
description: BQL query that specifies devices applicable for firmware upgrade
example: (uniqueId==1234567)
when:
type: string
description: |-
Specifies the time-window when the firmware upgrade is executed
* NOW - apply firmware upgrade in the near future
* IN_UPGRADE_WINDOW - apply firmware upgrade in time-window
enum:
- NOW
- IN_UPGRADE_WINDOW
NewExternalDevice:
type: object
properties:
uniqueId:
type: string
description: Unique ID of the new external device
mac:
type: string
description: MAC address of the new external device
example: 'AA:BB:12:34:18:38'
bleMac:
type: string
description: BLE MAC address of the new external device
example: 'AA:BB:12:34:18:39'
wifiMac:
type: string
description: Wi-Fi MAC address of the new external device
example: 'AA:BB:12:34:18:3A'
eddystoneMac:
type: string
description: Eddystone MAC address of the new external device
example: 'AA:BB:12:34:18:3B'
iBeaconMac:
type: string
description: iBeacon MAC address of the new external device
example: 'AA:BB:12:34:18:3C'
productName:
type: string
description: Product name of the new external device
example: Somy AB-44
productCode:
type: string
description: Product code of the new external device
example: KNKT_product_code
alias:
type: string
description: 'Alternative description for the Device, stored only on Kontakt.io backend - it''s not possible to read this value via Bluetooth directly from the Device itself. In Device Management App represented as a Notes.'
nullable: true
tags:
description: Comma-separated list of maximum 20 user-defined labels (no longer than 32 characters).
type: array
maxItems: 20
uniqueItems: true
items:
type: string
maxLength: 32
deploymentStatus:
$ref: '#/components/schemas/DeploymentStatus'
category:
$ref: '#/components/schemas/DeviceCategory'
Firmware:
type: object
properties:
id:
type: string
format: UUID
description: Firmware id.
name:
type: string
description: Firmware name
description:
type: string
description: Optional Firmware description
nullable: true
deviceType:
type: string
description: Type of a device that the Firmware applies to
enum:
- BEACON
- GATEWAY
uniqueId:
type: array
description: List of Unique IDs of beacons that this Firmware can be applied to
items:
type: string
validVersions:
description: List of Firmware versions from which it's possible to update to the returned Firmware
type: string
scheduled:
type: boolean
description: Flag indicating whether an optional firmware should be made available for upgrading beacons (`true`) or not (`false`)
important:
type: boolean
description: Flag indicating whether this Firmware should be considered important (`true`) or just a minor update (`false`)
optional:
type: boolean
description: Flag indicating whether this Firmware is optional (`true`) or not ('false')
url:
type: string
format: URL
description: Link to a binary file with the Firmware
fileExtension:
type: string
description: Extension of the Firmware file
crc32:
type: string
description: Checksum
FirmwareCore:
title: Firmware (Core Parameters)
properties:
id:
type: string
format: UUID
description: Firmware identificator
name:
type: string
description: Firmware name
description:
type: string
description: Optional Firmware description
nullable: true
deviceType:
type: string
description: Type of a device that the Firmware applies to
enum:
- BEACON
- GATEWAY
validVersions:
description: List of Firmware versions from which it's possible to update to the returned Firmware
type: string
important:
type: boolean
description: Flag indicating whether this Firmware should be considered important (`true`) or just a minor update (`false`)
url:
type: string
format: URL
description: Link to a binary file with the Firmware
Polygon:
type: object
properties:
id:
type: string
format: uuid
polygon:
type: array
items:
type: object
properties:
x:
type: integer
'y':
type: integer
OccupancyPhysicalSettings:
type: object
x-stoplight:
id: ri25ewp162tv9
description: Occupancy settings. Only applicable to devices with occupancy capability.
properties:
sleepInterval:
type: integer
minimum: 0
maximum: 65535
default: 0
description: Occupancy sampling interval in seconds when in power-saving mode (outside of working hours).
minInterval:
type: integer
minimum: 0
maximum: 65535
default: 60
description: Min sampling interval in seconds. 0 means disabled.
calibration:
type: integer
minimum: -128
maximum: 127
default: 0
description: 'Common threshold delta (all occupancy modes). Allows to fine-tune the sensitivity relative to the newest default. For example, use -5 to lower the threshold by 5 units from the default (allow more detections), or conversely setting it to 5 adds 5 to that threshold, reducing false positives. In other words, this is a linear value, not a percentage.'
sensitivity:
type: integer
minimum: 0
maximum: 100
deprecated: true
description: 'Deprecated! Please use the calibration parameter instead. Percentage of sensitivity. 0-100, 0 for very strict, 100 accept everything'
model:
type: integer
description: |-
Detection model.
0 - static occupancy.
2 - traffic footfall.
footfallLine:
type: string
default: 28502800
description: 'Threshold line for footfall detection. [x0, y0, x1, y1] pixel coordinates for the line. Hex encoded.'
footfallSensitivity:
type: integer
minimum: 0
maximum: 100
default: 40
deprecated: true
description: 'Deprecated! Please use the calibration parameter instead. Sensitivity for accepting footfall tracks. 0-100, 0 for very strict, 100 accept everything'
OccupancyAllSettings:
description: Occupancy settings. Only applicable to devices with occupancy capability.
allOf:
- $ref: '#/components/schemas/OccupancyPhysicalSettings'
- type: object
properties:
inclusions:
$ref: '#/components/schemas/OccupancyInclusionZones'
exclusions:
$ref: '#/components/schemas/OccupancyExclusionZones'
stitching:
type: object
description: Stitching configuration (no images in device responses).
properties:
intersections:
type: array
items:
$ref: '#/components/schemas/StitchingPairMinimal'
OccupancyExclusionZones:
description: 'Exclusion zones. Areas excluded from occupancy counting like windows, heaters, etc. Applicable only in static room occupancy. **It''s a virtual attribute.**'
type: array
items:
$ref: '#/components/schemas/Polygon'
OccupancyInclusionZones:
description: Inclusion zones. Areas included in occupancy counting. Applicable only in seat occupancy. Zone ids must match seat ids from Smart Location system. **It's a virtual attribute.**
type: array
items:
$ref: '#/components/schemas/Polygon'
OccupancyImage:
type: object
x-stoplight:
id: blcpt1fqfd6zh
description: Occupancy image taken from occupancy-capable device.
properties:
captured:
type: string
format: date-time
description: 'Timestamp when image was captured. If present in POST request, will be accounted for, otherwise defaults to now()'
raw:
type: string
format: byte
description: Raw Base64-encoded bytes received from device.
content:
type: string
format: byte
description: Base64-encoded PNG image.
calibration:
type: string
format: byte
description: Base64-encoded calibration mask received from device.
recognitionBoxes:
type: array
description: Objects recognized as humans by occupancy model on the device.
items:
allOf:
- $ref: '#/components/schemas/Polygon'
StitchingConfig:
type: object
required:
- uniqueId
- intersections
properties:
uniqueId:
type: string
description: Unique identifier of a beam/device.
intersections:
type: array
items:
$ref: '#/components/schemas/StitchingPair'
StitchingPair:
type: object
required:
- firstDevice
- secondDevice
properties:
firstDevice:
$ref: '#/components/schemas/StitchedDevice'
secondDevice:
$ref: '#/components/schemas/StitchedDevice'
StitchedDevice:
type: object
required:
- uniqueId
- image
- pose
properties:
uniqueId:
type: string
description: Unique identifier of a beam/device.
image:
$ref: '#/components/schemas/StitchingImage'
pose:
$ref: '#/components/schemas/StitchingPose'
StitchingImage:
type: object
required:
- captured
- original
- corrected
properties:
captured:
type: string
format: date-time
example: '2026-01-09T12:09:30.726Z'
original:
type: string
format: byte
description: Base64-encoded image bytes (no data URL prefix).
example: iVBORw0KGgoAAAANSUhEUgAAAAUA...
corrected:
type: string
format: byte
description: Base64-encoded image bytes (no data URL prefix).
example: iVBORw0KGgoAAAANSUhEUgAAAAUA...
StitchingPose:
type: object
required:
- pivotLocal
- pivotWorld
- rotationDeg
properties:
pivotLocal:
$ref: '#/components/schemas/StitchingPivotLocal'
pivotWorld:
$ref: '#/components/schemas/StitchingPivotWorld'
rotationDeg:
type: number
format: decimal
description: Clockwise rotation in degrees around pivot point.
example: 25
StitchingPivotLocal:
description: Pivot (rotation point) of the image in the device image's local coordinates.
type: object
required:
- x
- 'y'
properties:
x:
description: 'X coordinate in local coordinates, between 0 and 1. Where 0 is leftmost and 1 is rightmost.'
type: number
format: decimal
minimum: 0
maximum: 1
example: 0.5
'y':
description: 'Y coordinate in local coordinates, between 0 and 1. Where 0 is top and 1 is bottom.'
type: number
format: decimal
minimum: 0
maximum: 1
example: 0.5
StitchingPivotWorld:
description: |-
Pivot (rotation point) of the image in the world coordinates that are shared between stitched devices.
Origin is top left corner.
type: object
required:
- x
- 'y'
properties:
x:
description: X coordinate in world coordinates.
type: integer
example: 420
'y':
description: Y coordinate in world coordinates.
type: integer
example: 160
StitchingPairMinimal:
type: object
required:
- otherDeviceUniqueId
- pose
properties:
otherDeviceUniqueId:
type: string
description: Unique ID of the other device in the stitched pair.
pose:
$ref: '#/components/schemas/StitchingPose'
SearchMeta:
type: object
title: Search Metadata
description: 'Additional information, pagination and metadata about an API response'
externalDocs:
description: Pagination model description
url: /backend/management/pagination/
properties:
filter:
type: string
description: Filter query used in the API call
startIndex:
type: integer
description: Start index for the results array
maxResult:
type: integer
description: Maximum numbers of results in a single response
prevResults:
type: string
description: URL for the previous page of results
format: URL
count:
type: integer
nullable: true
description: Number of results. Not `null` only when the `queryType` is set to `COUNTED` or `SEARCH_META`.
orderBy:
type: string
enum:
- CREATED
nextResults:
type: string
format: URL
description: URL for the next page of results
queryType:
description: 'Query type. `COUNTED` - returns a number of results in the `count` field. `SEARCH_META` - returns only the `searchMeta` object, but with a number of results in the `count` field.'
type: string
enum:
- NORMAL
- COUNTED
- SEARCH_META
default: NORMAL
order:
type: string
description: Sorting order - `ASC`ending (default) or `DESC`ending
enum:
- ASC
- DESC
default: ASC
DeviceEditableVirtualAttributes:
type: object
description: Set of read-write editable virtual attributes.
properties:
alias:
type: string
description: 'Alternative description for the Device, stored only on Kontakt.io backend - it''s not possible to read this value via Bluetooth directly from the Device itself. In Device Management App represented as a Notes.'
nullable: true
tags:
description: Comma-separated list of maximum 20 user-defined labels (no longer than 32 characters).
type: array
maxItems: 20
uniqueItems: true
items:
type: string
maxLength: 32
metadata:
type: object
description: |-
Object containing arbitrary key-value pairs that can be defined by a Device's Manager.
Danger: may be overwritten by other API clients.
nullable: true
lat:
type: number
format: float
deprecated: true
nullable: true
lng:
type: number
format: float
deprecated: true
nullable: true
deployedlat:
type: number
format: float
deprecated: true
nullable: true
deployedlng:
type: number
format: float
deprecated: true
nullable: true
DeviceMacs:
type: object
description: Collection of MAC addresses associated with the device.
properties:
mainMac:
type: string
description: Primary MAC address used to identify the device.
example: 'AA:BB:CC:DD:EE:FF'
bleMac:
type: string
nullable: true
description: Bluetooth Low Energy interface MAC address.
example: 'AA:BB:CC:DD:EE:01'
wifiMac:
type: string
nullable: true
description: Wi-Fi interface MAC address.
example: 'AA:BB:CC:DD:EE:02'
eddystoneMac:
type: string
nullable: true
description: MAC address used for Eddystone advertising.
example: 'AA:BB:CC:DD:EE:03'
ibeaconMac:
type: string
nullable: true
description: MAC address used for iBeacon advertising.
example: 'AA:BB:CC:DD:EE:04'
Device:
type: object
allOf:
- type: object
properties:
id:
type: string
format: UUID
description: Device object ID used internally in Kontakt.io API.
uniqueId:
type: string
description: Unique ID of the device.
deviceType:
$ref: '#/components/schemas/DeviceType'
category:
$ref: '#/components/schemas/DeviceCategory'
model:
description: Kontakt.io internal model name of the device. Multiple products may have the same model name. Managed 3rd party devices will all have `PARTNER_DEVICE`. For differentiating specific products please use `productCode`. Product display name can be found in `product`.
allOf:
- $ref: '#/components/schemas/DeviceModel'
product:
type: string
description: Official display name of the product. May be changed by Kontakt.io.
productCode:
type: string
x-stoplight:
id: rb6av1sof48ve
description: Unique identifier of the product. Immutable.
macs:
$ref: '#/components/schemas/DeviceMacs'
specification:
type: string
deprecated: true
managerId:
type: string
format: UUID
description: ID of the Device's assigned manager.
ownerId:
type: string
format: UUID
description: 'ID of the Device''s actual owner. If a Device was assigned to its current Manager by a Supervisor or shared with the Manager, this property will indicate a Manager that is an actual owner of this particular Device.'
shortCompanyId:
type: string
description: Short identifier of the company that the device belongs to.
access:
$ref: '#/components/schemas/DeviceDataRole'
venue:
type: object
deprecated: true
shares:
description: List of Share objects describing how and with whom the Device has been shared
type: array
items:
type: object
properties:
managerMail:
type: string
format: email
description: Email address of a Manager that received access to this Device
access:
$ref: '#/components/schemas/DeviceDataRole'
expirationDate:
type: integer
description: 'Unix epoch timestamp indicating when a share will be revoked. If a Device was shared indefinitely, this value will be `null`.'
nullable: true
firmware:
type: string
description: Version of the firmware on the device.
orderId:
type: string
description: Associated Order ID this device belongs to.
batteryLevel:
type: integer
format: int32
nullable: true
deprecated: true
description: Battery level percentage. Deprecated; use status.batteryLevel. Returns -1 when device is externally powered.
lastSeen:
type: integer
format: int64
nullable: true
deprecated: true
description: Unix epoch timestamp (seconds) of the last online moment. Deprecated; use status.lastOnlineTimestamp.
status:
type: object
nullable: true
description: Device status details.
properties:
online:
type: boolean
nullable: true
description: Whether the device is currently online.
offlineReason:
type: string
nullable: true
description: Reason reported when the device is offline.
externalPower:
type: boolean
nullable: true
description: Whether the device is externally powered.
batteryLevel:
type: integer
format: int32
nullable: true
description: Battery level percentage.
batteryLevelTimestamp:
type: string
format: date-time
nullable: true
description: Timestamp of the last battery level update (ISO 8601 format).
example: '2025-12-29T13:45:17.079Z'
firstOnlineTimestamp:
type: string
format: date-time
nullable: true
description: First time the device was seen online (ISO 8601 format).
example: '2025-12-29T13:45:17.079Z'
lastOnlineTimestamp:
type: string
format: date-time
nullable: true
description: 'Most recent online timestamp (ISO 8601 format). If online, current time truncated to minutes.'
example: '2026-01-06T09:44Z'
federation:
type: object
description: Information about device's federation.
required:
- federated
properties:
id:
type: string
description: ID of related DeviceFederation. `null` if not federated.
example: 500ff1ed-0000-4000-9003-000200400001
source:
type: string
description: Cloud ID of Source Device Management. `null` if not federated.
example: prod-im-api
federated:
type: boolean
description: Whether the device is federated or not.
lastSync:
type: string
format: date-time
description: Last synchronization of the device with Source Device Management. `null` if not federated (ISO 8601 format).
example: '1985-04-12T23:20:50.246+0000'
deployment:
$ref: '#/components/schemas/DeploymentInfo'
pendingConfig:
oneOf:
- $ref: '#/components/schemas/PendingBeaconConfig'
- $ref: '#/components/schemas/PendingGatewayConfig'
firmwareInfo:
$ref: '#/components/schemas/FirmwareInfo'
currentLocation:
$ref: '#/components/schemas/LocationInfo'
displaySettings:
$ref: '#/components/schemas/DisplaySettings'
lowBatterySettings:
$ref: '#/components/schemas/LowBatterySettings'
sensorSettings:
$ref: '#/components/schemas/SensorSettings'
localAlertingSettings:
$ref: '#/components/schemas/LocalAlertingSettings'
buzzerSnoozing:
$ref: '#/components/schemas/BuzzerSnoozing'
dispenser:
$ref: '#/components/schemas/Dispenser'
systemTime:
type: string
format: date-time
description: Device system time in ISO 8601 format (UTC). Maps to PID h_system_time (0xA004). Available on nrf52 devices with firmware >= 1.20.
example: '2024-03-30T12:00:00Z'
desiredConfig:
type: object
x-sl-internally-excluded: true
x-sl-error-message: You do not have permission to view this reference
required:
- uniqueId
- deviceType
- category
- model
- product
- productCode
- federation
- deployment
- firmwareInfo
- $ref: '#/components/schemas/DeviceEditableVirtualAttributes'
- $ref: '#/components/schemas/BeaconConfig'
- $ref: '#/components/schemas/EditableGatewayConfig'
- type: object
description: Some schema overrides.
properties:
occupancy:
$ref: '#/components/schemas/OccupancyAllSettings'
AccelerometerSettings:
type: object
x-stoplight:
id: q22ra4lowsp5r
description: Accelerometer settings.
properties:
features:
description: List of Accelerometer features that are enabled
type: array
items:
type: string
enum:
- ACCELEROMETER
- X_AXIS
- Y_AXIS
- Z_AXIS
- MOVE_DETECTION
- DOUBLE_TAP_DETECTION
sensitivity:
description: Accelerometer sensitivity
type: integer
enum:
- 16
- 32
- 64
- 128
preset:
description: Preset for Accelerometer configuration
type: string
enum:
- MOVEMENT
- FREE_FALL
- DOUBLE_TAP
- DOUBLE_TAP_AND_MOVEMENT
- DOUBLE_TAP_AND_FREE_FALL
move:
description: Movement detection parameters
type: object
properties:
threshold:
description: Value (in m*g*) that an acceleration needs to exceeds in order to trigger movement detection
type: integer
duration:
description: Time (in ms) than an acceleration needs to stay above threshold value in order to trigger movement detection
type: integer
detectionFlags:
type: array
items:
type: string
enum:
- X_POSITIVE
- Y_POSITIVE
- Z_POSITIVE
- X_NEGATIVE
- Y_NEGATIVE
- Z_NEGATIVE
detectionFlagsJunction:
type: string
enum:
- AND
- OR
doubleTap:
description: Double tap detection parameters
type: object
properties:
threshold:
description: Value ( in m*g*) that an acceleration needs to exceeds in order to trigger movement detection
type: integer
timeLimit:
description: Maximum duration (in ms) of a single tap
type: integer
timeLatency:
description: Minimum time gap (in ms) between two taps
type: integer
timeWindow:
description: Maximum duration (in ms) of the whole event
type: integer
detectionFlags:
description: List of accelerometer axes that are monitored for double tap events
type: array
items:
type: string
enum:
- X_AXIS
- Y_AXIS
- Z_AXIS
highPass:
description: High-pass filter parameters
type: object
properties:
accelerometerData:
type: boolean
description: Flag indicating whether the high-pass filter should be applied to raw accelerometer data
moveDetection:
type: boolean
description: Flag indicating whether the high-pass filter should be applied when movement detection is enabled
doubleTapDetection:
type: boolean
description: Flag indicating whether the high-pass filter should be applied when double tap detection is enabled
mode:
description: High-pass filter mode
type: string
enum:
- NORMAL
- NORMAL_RESET
- AUTORESET
- REFERENCE
cutOffFrequency:
description: High-pass filter cut-off frequency
type: number
enum:
- 0.05
- 0.1
- 0.2
- 0.5
reference:
description: High-pass filter reference
type: integer
IrReceiverSettings:
type: object
description: IR Receiver setting.
properties:
wakeUpInterval:
type: integer
minimum: 0
maximum: 255
description: 'Interval between detection attempts, encoded as u8. 0 - disabled. Encodes time using 2-bit scale + 6-bit mantissa: 0b00=seconds, 0b01=ms, 0b10=ms*10, 0b11=ms*100. Max 63 per scale (e.g. max 63 seconds, or 6300ms, or 63000ms)'
maxListenInterval:
type: integer
minimum: 0
maximum: 255
description: 'Maximum duration to try and detect IR signal, encoded as u8. Encodes time using 2-bit scale + 6-bit mantissa: 0b00=seconds, 0b01=ms, 0b10=ms*10, 0b11=ms*100. Max 63 per scale (e.g. max 63 seconds, or 6300ms, or 63000ms)'
disableOnNoMotion:
type: boolean
description: Whether or not to disable IR receiver when the beacon is stationary.
IrTransmitterSettings:
type: object
description: IR Transmitter setting.
properties:
dutyCycle:
type: integer
minimum: 0
maximum: 100
description: Duty cycle used for the IR emission as a percentage
intensity:
type: integer
minimum: 0
maximum: 100
description: Power intensity for the IR emission as a percentage
protoV2:
type: boolean
description: Flag that enables IR Protocol V2
BleScanSettings:
type: object
description: BLE scanning setting. Can be used for fingerprinting.
properties:
interval:
type: integer
minimum: 1
maximum: 604800
default: 82800
description: 'The interval between BLE scans. Unit is seconds. 0: disabled. Default: 23h = 82800 seconds'
duration:
type: integer
minimum: 100
maximum: 65535
default: 10000
description: Duration of each BLE scan. Unit is milliseconds.
models:
type: string
default: 090e1c1d1f22
description: 'Allowed models array for scanning, expressed as hexadecimal string.'
force:
type: boolean
default: false
description: Force the BLE scan.
size:
type: integer
minimum: 0
maximum: 255
default: 20
description: Maximum number of scanned items reported per scan. Requires nrf52 firmware >= 2.5.88.
ConfigLocksRequest:
type: object
properties:
locks:
type: object
properties:
roomNumber:
$ref: '#/components/schemas/LockDetailsConfirmationId'
temperatureMonitor:
$ref: '#/components/schemas/LockDetailsConfirmationId'
ConfigLocksResponse:
type: object
properties:
locks:
type: object
properties:
roomNumber:
$ref: '#/components/schemas/LockDetails'
temperatureMonitor:
$ref: '#/components/schemas/LockDetails'
LockDetails:
type: object
properties:
confirmationId:
$ref: '#/components/schemas/LockDetailsConfirmationId'
LockDetailsConfirmationId:
type: string
description: The value included in the DeviceChangedEvent.UPDATED to confirm that a specific configuration has been applied on a device
example: ed26348a-e33e-428c-a343-33e0054ebdf9
PowerSavingSettings:
description: Power Saving settings
x-stoplight:
id: 10t53bq8hl1v2
type: object
properties:
mode:
type: string
enum:
- LIGHT_SENSOR
- RTC
- MOTION_DETECTION
- BURST_MODE
description: |
Currently enabled power saving mode. In all modes except BURST_MODE,
nonconnectable packets (iBeacon, Eddystone, etc.) are switched off,
Kontakt packet interval is reduced (at least every 2s, at most every 10s),
and Kontakt TLM is off.
| Value | Description |
|-------|-------------|
| MOTION_DETECTION | Enter power saving when no motion is detected (requires accelerometer). Configure via `moveSuspendTimeout` |
| LIGHT_SENSOR | Enter power saving based on ambient light level (requires light sensor). Configure via `lightSensorThreshold` and `lightSensorHysteresis` |
| RTC | Enter power saving on a weekly schedule using the real-time clock. Configure days and hours via the `rtc` property |
| BURST_MODE | Device advertises all configured frames for a set duration, then sleeps. Configure via `burstOnTime` and `burstOffTime`. Cannot be combined with other power saving modes. Panic Button Frame is advertised independently. Button press prolongs advertising. Sleep time is randomized (±10%). During sleep, accelerometer events are still detected, RTC keeps time, and shuffling works normally |
nullable: true
features:
type: array
items:
type: string
enum:
- LIGHT_SENSOR
- RTC
- MOTION_DETECTION
- BURST_MODE
deprecated: true
description: 'Deprecated! Please use the mode parameter instead. Currently enabled power saving mode. Possible values are `LIGHT_SENSOR` (Beacon Pro BP16-3 only) and `MOTION_DETECTION`, `RTC`, `BURST_MODE` or an empty list.'
moveSuspendTimeout:
nullable: true
type: integer
minimum: 60
maximum: 3600
description: Time (in seconds) after which a Card Tag CT16-2 engages power saving mode. Possible values are in range between 60 (1 minute) and 3600 (1 hour).
powerSaverAdvertiseInterval:
deprecated: true
nullable: true
type: integer
description: Bluetooth Advertising interval that a Card Tag CT16-2 should use when in the Power Saving mode. Available only on Card Tags CT16-2 with firmware 4.2 or newer.
rtc:
nullable: true
description: A list of object representing days of a week and hours during that day when a power saving mode should be engaged. Available only on Devices equipped with a Real-Time Clock (RTC).
type: array
items:
type: object
properties:
day:
type: string
enum:
- MON
- TUE
- WED
- THU
- FRI
- SAT
- SUN
description: Indicates a day of a week.
hours:
type: array
items:
type: integer
minimum: 0
maximum: 23
description: 'List of hours (in UTC, using 24h clock) from a day specified in the `day` parameter, during which Power Saving should be enabled, e.g. 17 means Power Saving will be enabled from 17:00 until 17:59 UTC.'
lightSensorThreshold:
nullable: true
type: integer
minimum: 0
maximum: 100
description: 'Threshold of ambient light intensity, expressed in percents, below which a Device enters the power saving mode. Applicable only to Devices equipped with a light sensor.'
lightSensorHysteresis:
nullable: true
type: integer
description: 'Light sensor''s [hysteresis](https://en.wikipedia.org/wiki/Hysteresis#In_engineering), expressed in percent points. More details in Power Saving guide. Applicable only to Devices equipped with a light sensor.'
burstOnTime:
nullable: true
type: integer
minimum: 15
maximum: 65535
description: Number of *seconds* a beacon should broadcast when `BURST_MODE` is active
burstOffTime:
nullable: true
type: integer
minimum: 1
maximum: 10080
description: Number of *minutes* between each broadcasts when `BURST_MODE` is active
External:
description: A representation of a 3rd party device
type: object
deprecated: true
properties:
id:
type: string
format: UUID
description: Device object ID used internally in Kontakt.io API
uniqueId:
type: string
description: MAC address of the registered device
vendor:
type: string
enum:
- CASSIA
- MERAKI
- RUCKUS
alias:
type: string
nullable: true
description: 'Alternative description for the Device, stored only on Kontakt.io backend - it''s not possible to read this value via Bluetooth directly from the Device itself. In Device Management App represented as a Notes.'
tags:
type: array
description: 'List of custom tags, defined and editable by Device''s Manager'
items:
type: string
deviceType:
type: string
enum:
- EXTERNAL
description: Type of the Device
managerId:
type: string
format: UUID
description: ID of the Device's Manager
ownerId:
type: string
format: UUID
description: 'ID of the Device''s Owner. If a Device was assigned to its current Manager by a Supervisor or shared with the Manager, this property will indicate a Manager that is an actual owner of this particular Device.'
access:
$ref: '#/components/schemas/DeviceDataRole'
venue:
type: object
x-sl-internally-excluded: true
x-sl-error-message: You do not have permission to view this reference
shares:
description: List of Share objects describing how and with whom the Device has been shared
type: array
items:
type: object
properties:
managerMail:
type: string
format: email
description: Email address of a Manager that received access to this Device
access:
$ref: '#/components/schemas/DeviceDataRole'
expirationDate:
type: integer
nullable: true
description: 'Unix epoch timestamp indicating when a share will be revoked. If a Device was shared indefinitely, this value will be `null`.'
metadata:
type: object
nullable: true
description: Object containing arbitrary key-value pairs that can be defined by a Device's Manager
properties:
type: object
nullable: true
description: Object containing arbitrary key-value pairs that can be defined by a Device's Manager
lat:
type: number
nullable: true
description: 'Latitude of a place where the Device has been detected the last time. Can be set manually or automatically, e.g. in Kontakt.io Administration Apps.'
lng:
type: number
nullable: true
description: 'Longitude of a place where the Device has been detected the last time. Can be set manually or automatically, e.g. in Kontakt.io Administration Apps.'
deployedlat:
type: number
nullable: true
description: Latitude of a place where the Device should be installed. Can be set by placing a Device in a Location in Kontakt.io Panel.
deployedlng:
type: number
nullable: true
description: Longitude of a place where the Device should be installed. Can be set by placing a Device in a Location in Kontakt.io Panel.
queriedBy:
type: string
nullable: true
DeviceStatusesRequest:
type: object
properties:
statuses:
type: array
items:
type: object
properties:
uniqueId:
type: string
description: The uniqueId of a devices that the status relates to
example: 12df23Df
timestamp:
type: string
description: 'The timestamp that correlates to the status period, eg. yyyy-MM-ddThh:mm:ssZ, eg. 2023-07-25T11:58:12Z'
example: '2023-07-25T11:58:12.246+0000'
type:
type: string
description: The status to be sent to DM-API
enum:
- FIRMWARE_UPGRADE_ERROR
- INFO
- ERROR
example: FIRMWARE_UPGRADE_ERROR
message:
type: string
description: Additional information to be passed with the status
example: 'Firmware upgrade failed, corrupted binary'
DeviceReplaceRequest:
type: object
properties:
sourceUniqueId:
type: string
description: Unique identifier of the gateway being replaced.
targetUniqueId:
type: string
description: Unique identifier of the gateway that should receive the pending configuration.
required:
- sourceUniqueId
- targetUniqueId
OrderManagementResponse:
type: object
properties:
orders:
type: object
description: Per-order claiming/releasing status
properties:
each orderId from request:
type: object
description: Claiming/releasing status for this order ID
properties:
status:
type: string
description: |-
Successful statuses:
CLAIMED
RELEASED
Failure statuses:
CANNOT_CLAIM or CANNOT_RELEASE - received a non-200 response from DCC, except...
NOT_FOUND - received a 404 response from DCC
UNCLASSIFIED_COMMUNICATION_ERROR - unknown error when communicating with DCC.
UNCLASSIFIED_SCHEDULING_ERROR - order claimed/released, but can not schedule a job for adding/removing order devices.
enum:
- CLAIMED
- RELEASED
- CANNOT_CLAIM
- CANNOT_RELEASE
- NOT_FOUND
- UNCLASSIFIED_COMMUNICATION_ERROR
- UNCLASSIFIED_SCHEDULING_ERROR
details:
type: string
description: 'Usually error details, e.g. ''503 DCC unavailable'''
totalDevices:
type: number
description: Number of devices in this order
DeviceType:
type: string
enum:
- BEACON
- GATEWAY
- EXTERNAL
description: General type of device.
DeviceCategory:
type: string
enum:
- TAG
- INFRASTRUCTURE
description: 'Category of the device, whether it''s a moving (TAG) or static (INFRASTRUCTURE) device.'
DeviceModel:
type: string
enum:
- SMART_BEACON
- USB_BEACON
- SENSOR_BEACON
- CARD_BEACON
- GATEWAY
- BEACON_PRO
- TAG_BEACON
- SMART_BEACON_3
- HEAVY_DUTY_BEACON
- CARD_BEACON_2
- TOUGH_BEACON_2
- BRACELET_TAG
- UNIVERSAL_TAG
- BRACELET_TAG_2
- LANYARD_TAG
- NANO_TAG
- STICKER_TAG
- PUCK_TAG
- PORTAL_LIGHT
- SMART_BADGE
- SMART_BADGE_3_MINI
- PORTAL_BEAM
- NANO_SERIES
- NANO_TAG_IR
- ASSET_TAG_2
- ANCHOR_BEACON_2
- BEAM_MINI
- PORTAL_BEAM_IR
- DISPENSER_BEACON
- ES10_DISPENSER_BEACON
- UNIVERSAL_DISPENSER_BEACON
- PORTAL_LIGHT_2S
- PORTAL_LIGHT_2
- ASSET_TAG_2_MINI
- PARTNER_DEVICE
- EXTERNAL
description: Kontakt.io internal model name of the device. Multiple products may have the same model name. Managed 3rd party devices will all have `PARTNER_DEVICE`.
DeploymentInfo:
type: object
description: Information about device's deployment.
properties:
status:
$ref: '#/components/schemas/DeploymentStatus'
deploymentDate:
type: string
format: date-time
nullable: true
description: Timestamp of when the device was deployed (ISO 8601 format). Defaults to the current time when deployment info is updated without an explicit date.
example: '2026-04-10T12:00:00Z'
installerEmail:
type: string
nullable: true
description: Email address of the person who deployed the device.
example: john.doe@example.com
installerName:
type: string
nullable: true
description: First and last name of the person who deployed the device.
example: John Doe
required:
- status
DeploymentStatus:
type: string
description: |-
Current deployment status of this device - e.g. whether is it deployed or not.
`END_OF_LIFE` means the device is not going to be used anymore. Can occur for many reasons: battery dead, unserviceable device, contract with owning company was discontinued, etc.
enum:
- TO_BE_DEPLOYED
- DEPLOYED
- END_OF_LIFE
LocationInfo:
type: object
description: Information about device location.
properties:
campusId:
type: number
description: Campus identifier
example: 100
campusName:
type: string
description: Campus name
buildingId:
type: number
description: Building identifier
example: 100
buildingName:
type: string
description: Building name
floorId:
type: number
description: Floor identifier
example: 100
floorName:
type: string
description: Floor name
roomId:
type: number
description: Room identifier
example: 100
roomName:
type: string
description: Room name
DisplaySettings:
type: object
description: Device display settings.
properties:
ledIntensity:
type: number
description: 'LED light intensity, ranging from 0% (completely off) to 100% (maximum brightness).'
minimum: 0
maximum: 100
ledBlinkInterval:
type: number
description: The number of seconds between LED blinks.
minimum: 1
maximum: 255
ledBlinkEnabled:
type: boolean
description: Indicates whether the LED light is enabled.
example: true
temperatureUnit:
type: string
description: The unit for displaying temperature.
enum:
- CELSIUS
- FAHRENHEIT
LowBatterySettings:
type: object
description: Device low battery settings.
properties:
alertLevel:
type: integer
description: The battery level threshold (percentage) below which a low battery alert is triggered.
example: 10
minimum: 1
maximum: 100
alertEnabled:
type: boolean
description: Indicates whether the low battery alert is enabled.
example: true
SensorSettings:
type: object
description: Device sensor settings.
properties:
samplingInterval:
type: integer
description: Interval (in seconds) at which sensor data is sampled.
example: 60
minimum: 1
maximum: 3600
loggingFactor:
type: integer
description: Factor used to determine how often sensor data is logged.
example: 15
minimum: 1
maximum: 65535
LocalAlertingSettings:
type: object
description: Device local alerting settings.
properties:
alertSamples:
type: integer
description: The number of samples considered for triggering alerts.
example: 15
minimum: 1
maximum: 65535
loggingFactor:
type: integer
description: Logging factor specifically used during alert mode.
example: 1
minimum: 1
maximum: 65535
armingState:
type: string
description: The current state of the device’s alert system.
enum:
- ARMED
- PAUSED
- HALTED
example: ARMED
armingDelay:
type: integer
description: Delay (in seconds) before the device transitions to the armed state.
example: 300
minimum: 0
maximum: 3600
deviceErrorSoundEnabled:
type: boolean
description: Indicates if the device error sound is enabled.
example: true
sensorErrorSoundEnabled:
type: boolean
description: Indicates if sensor error sound is enabled.
example: true
sensorOobSoundEnabled:
type: boolean
description: Indicates if sensor out-of-bound alert sound is enabled.
example: true
temperatureProbes:
$ref: '#/components/schemas/TemperatureProbesSettings'
humidityProbes:
$ref: '#/components/schemas/HumidityProbesSettings'
BuzzerSnoozing:
type: object
description: Buzzer snoozing settings for Temperature Monitor Pro devices. Maps to PID buzzer_snooze_duration_m (0x917D).
properties:
state:
type: string
description: 'Snooze state. INACTIVE means snoozing is disabled, INFINITE snoozes indefinitely. Device mapping uses 0 for INACTIVE and -1 for INFINITE.'
enum:
- ACTIVE
- INACTIVE
- INFINITE
duration:
type: integer
description: 'Snooze duration in minutes for ACTIVE. Ignored for INACTIVE and INFINITE states. Device mapping uses 0/-1 for inactive/infinite, so minimum is 1.'
minimum: 1
maximum: 32767
Dispenser:
type: object
description: Dispenser settings for UHH dispenser beacons. Maps to PIDs dispenser_model_id (0x917E) and dispenser_detection_params (0x917F). Requires soap_dispenser capability and firmware nrf52 >= 2.16.1.
properties:
model:
type: string
description: Dispenser model the beacon is mounted on. UNSET (0xFF) disables dispense detection.
enum:
- ES8_GOJO
- ES10_GOJO
- GENERIC_UHH_MANUAL
- GENERIC_UHH_AUTO
- FMX12_GOJO
- FMX20_GOJO
- COMPACT_AUTO_ECOLAB
- COMPACT_MANUAL_ECOLAB
- CLASSIC_AUTO_ECOLAB
- CLASSIC_MANUAL_ECOLAB
- UNSET
detectionParams:
type: string
description: 'Hex-encoded binary blob (0-500 bytes) with detection algorithm parameters. Structure: uint16 params_id + uint8 model_id + uint8 algorithm_id + uint8[] params_data. Valid lengths: 0, 4, or >4 bytes.'
pattern: '^([0-9A-Fa-f]{2})*$'
maxLength: 1000
example: '00010002030405'
TemperatureProbe:
type: object
description: Settings for a temperature probe.
properties:
alertMaxEnabled:
type: boolean
description: Indicates if the maximum temperature alert is enabled.
example: true
alertMaxLevel:
type: number
format: float
description: The maximum temperature level (in Celsius) to trigger an alert.
example: 40.5
minimum: -273
maximum: 1000
alertMinEnabled:
type: boolean
description: Indicates if the minimum temperature alert is enabled.
example: true
alertMinLevel:
type: number
format: float
description: The minimum temperature level (in Celsius) to trigger an alert.
example: -100.5
minimum: -273
maximum: 1000
sensorEnabled:
type: boolean
description: Indicates if the temperature sensor is enabled.
example: true
HumidityProbe:
type: object
description: Settings for a humidity probe.
properties:
alertMaxEnabled:
type: boolean
description: Indicates if the maximum humidity alert is enabled.
example: true
alertMaxLevel:
type: integer
description: The maximum humidity level (in %) to trigger an alert.
example: 80
minimum: 0
maximum: 100
alertMinEnabled:
type: boolean
description: Indicates if the minimum humidity alert is enabled.
example: true
alertMinLevel:
type: integer
description: The minimum humidity level (in %) to trigger an alert.
example: 20
minimum: 0
maximum: 100
sensorEnabled:
type: boolean
description: Indicates if the humidity sensor is enabled.
example: true
TemperatureProbesSettings:
type: object
description: Settings for temperature probes.
properties:
probe0:
$ref: '#/components/schemas/TemperatureProbe'
probe1:
$ref: '#/components/schemas/TemperatureProbe'
probe2:
$ref: '#/components/schemas/TemperatureProbe'
HumidityProbesSettings:
type: object
description: Settings for humidity probes.
properties:
probe0:
$ref: '#/components/schemas/HumidityProbe'
FirmwareInfo:
type: object
description: Details about device's firmware.
required:
- firmwareName
- firmwareVersion
- upgrade
properties:
firmwareName:
type: string
description: Identifier of the firmware.
example: portal-beam
firmwareVersion:
type: string
description: Version of the firmware.
example: 2.8.1
upgrade:
type: object
description: Details about next firmware upgrade.
properties:
nextAvailableVersion:
type: string
description: 'Latest firmware version device can be upgraded to, if any.'
nullable: true
example: 2.10.1
scheduledVersion:
type: string
description: Firmware version that was scheduled for upgrade.
nullable: true
example: 2.10.0
onDemand:
type: boolean
description: Whether firmware upgrade should be scheduled immediately.
releaseChannel:
type: string
description: Name of the release channel that is used to find firmware upgrades
example: regular
scheduledBy:
type: object
description: User who scheduled firmware upgrade.
nullable: true
required:
- id
- email
- fullName
properties:
id:
type: string
format: uuid
description: User id.
email:
type: string
format: email
description: User email.
fullName:
type: string
description: Full user name.
lastError:
type: object
description: Last recorded firmware upgrade error.
nullable: true
properties:
message:
type: string
description: Error message.
timestamp:
type: string
format: date-time
description: Error timestamp.
example: '2023‐09‐18T15:33:00Z'
DeviceFederationDetails:
type: object
x-examples:
Example 1:
id: 186f64ac-cd17-4a4b-8cb0-905ff2e99c01
displayName: My Federation
source: edm
sourceApiKey: A905ff2e99c01XL1868cb0f644a4bac
created: '2023-07-25T11:58:12.246+0000'
lastSync: null
status: NEW
properties:
id:
type: string
format: uuid
description: System-generated unique identifier.
displayName:
type: string
description: Human-friendly display name.
source:
type: string
description: Idntifier of Source Device Management.
sourceApiKey:
type: string
description: Api-Key of Source Device Management user used in the synchronization requests.
nullable: true
created:
$ref: '#/components/schemas/CreatedDate'
lastSync:
type: string
description: Last successful full synchronization (ISO 8601 format).
example: '2023-07-25T11:58:12.246+0000'
nullable: true
status:
$ref: '#/components/schemas/DeviceFederationStatus'
required:
- id
- displayName
- source
- status
DeviceFederationStatus:
title: DeviceFederationStatus
x-stoplight:
id: crnkdckhkhlyc
enum:
- NEW
- SYNCED
- SYNCING
- DELETING
- FAILURE
description: |-
Current status of Device Federation.
* `NEW` - Federation newly created
* `SYNCED` - Federation is ok, synchronized, no full federation synchronization is progress
* `SYNCING` - A full federation synchronization is in progress
* `DELETING` - Federation is being deleted
* `FAILURE` - The last full federation synchronization failed
NewDeviceFederationRequest:
type: object
x-examples:
Example 1:
displayName: My Federation
source: edm
sourceApiKey: ex9L2xd1qta67dtn12
properties:
displayName:
type: string
description: Human-friendly display name.
source:
type: string
description: Identifier of Source Device Management. List of available sources can be obtained with the `GET /device-federations-sources` endpoint.
sourceApiKey:
type: string
description: Api-Key of Source Device Management user used in the synchronization requests.
required:
- displayName
- source
- sourceApiKey
DevicesSynchronizationResult:
type: object
x-examples:
Example 1:
added: 1
updated: 0
failed: 0
removed: 0
errors: []
properties:
added:
type: integer
description: How many devices were added to the target account.
updated:
type: integer
description: How many devices were updated in the target account.
failed:
type: integer
description: How many devices couldn't be added to the target account due to errors.
removed:
type: integer
description: How many devices were removed from the target account due to them missing in the source account.
errors:
description: List of errors that occurred during the sync
type: array
items:
type: string
required:
- added
- updated
- failed
- removed
- errors
DeviceFederationSyncJobResponse:
type: object
x-examples:
Example 1:
added: 1
updated: 0
failed: 0
removed: 0
errors: []
properties:
jobKey:
type: string
description: Identifier of the job
status:
$ref: '#/components/schemas/JobStatus'
result:
$ref: '#/components/schemas/DevicesSynchronizationResult'
required:
- jobKey
- result
- status
DeviceFederationSyncOneDeviceResponse:
type: object
properties:
uniqueId:
type: string
status:
type: string
enum:
- UPDATED
- CREATED
- DELETED
- FAILED
DeviceDataRole:
type: string
enum:
- OWNER
- SUPERVISOR
- EDITOR
- VIEWER
description: Type of access granted to this device.
VenueDataRole:
type: string
enum:
- OWNER
- SUPERVISOR
- VIEWER
description: Type of access granted to this venue.
DeviceAccessResponse:
type: object
properties:
managerId:
description: Identifier of the managers account
example: 4dd811db-dbc4-4eb5-9dff-463f553bef04
email:
description: Email of the managers account
example: manager@example.com
firstName:
description: Managers first name
example: John
lastName:
description: Managers last name
example: Doe
role:
type: string
example: VIEWER
description: Role that the manager should have for the device
enum:
- VIEWER
- EDITOR
expirationDate:
type: string
description: The expiration date for assigned role
example: '2024-12-25T11:58:12.246+0000'
DeviceAccessGrantRequest:
type: object
properties:
managerEmails:
type: array
example:
- manager@example.com
description: List of manager emails that the permission should be granted for
items:
type: string
role:
type: string
example: VIEWER
description: Role that the manager should have for the device
enum:
- VIEWER
- EDITOR
expirationDate:
type: string
description: The expiration date for assigned role
example: '2024-12-25T11:58:12.246+0000'
DeviceAccessRevokeRequest:
type: object
properties:
managerEmails:
type: array
example:
- manager@example.com
description: List of manager emails that the permission should be revoked from
items:
type: string
DeviceAccessBulkJobResponse:
type: object
properties:
jobKey:
type: string
description: Identifier of the job
example: grant-device-access_b4dfa2ed-4ac9-4b36-b662-be6be3925193
status:
$ref: '#/components/schemas/JobStatus'
progress:
type: integer
minimum: 0
maximum: 100
description: Progress of the device access bulk process
example: 55
result:
type: object
properties:
devicesRequested:
type: number
description: Number of devices requested with the BQL
example: 100
accessGranted:
type: number
description: Number of devices that the access has been granted for
example: 50
accessGrantFailed:
type: number
description: Number of devices that the access grant failed for
example: 10
accessRevoked:
type: number
description: Number of devices that the access has been revoked for
example: 10
accessRevokeFailed:
type: number
description: Number of devices that the access revoke failed for
example: 20
devicesInaccessible:
type: number
description: 'Number of devices that are inaccessible with provided BQL, e.g. insufficient permissions'
example: 10
errors:
type: array
items:
type: object
properties:
type:
type: string
enum:
- VALIDATION_FAILED
- OBJECT_DOES_NOT_EXIST
- UNKNOWN_ERROR
fieldName:
type: string
description: Name of the field with error
example: error
errorMessage:
description: Error message
example: Manager doesn't exist