Kontakt.io · Schema
Device
CompanyIoTRTLSHealthcareAsset TrackingLocationOccupancyBluetoothDevice ManagementTelemetrySensorsStreaming
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/kontaktio/main/json-schema/kontaktio-device-schema.json",
"title": "Device",
"x-generated": "2026-10-12",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/kontaktio-device-api-openapi.yml#/components/schemas/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": "#/$defs/DeviceType"
},
"category": {
"$ref": "#/$defs/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": "#/$defs/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": "#/$defs/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": "#/$defs/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": "#/$defs/DeviceDataRole"
},
"expirationDate": {
"type": [
"integer",
"null"
],
"description": "Unix epoch timestamp indicating when a share will be revoked. If a Device was shared indefinitely, this value will be `null`."
}
}
}
},
"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",
"null"
],
"format": "int32",
"deprecated": true,
"description": "Battery level percentage. Deprecated; use status.batteryLevel. Returns -1 when device is externally powered."
},
"lastSeen": {
"type": [
"integer",
"null"
],
"format": "int64",
"deprecated": true,
"description": "Unix epoch timestamp (seconds) of the last online moment. Deprecated; use status.lastOnlineTimestamp."
},
"status": {
"type": [
"object",
"null"
],
"description": "Device status details.",
"properties": {
"online": {
"type": [
"boolean",
"null"
],
"description": "Whether the device is currently online."
},
"offlineReason": {
"type": [
"string",
"null"
],
"description": "Reason reported when the device is offline."
},
"externalPower": {
"type": [
"boolean",
"null"
],
"description": "Whether the device is externally powered."
},
"batteryLevel": {
"type": [
"integer",
"null"
],
"format": "int32",
"description": "Battery level percentage."
},
"batteryLevelTimestamp": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "Timestamp of the last battery level update (ISO 8601 format)."
},
"firstOnlineTimestamp": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "First time the device was seen online (ISO 8601 format)."
},
"lastOnlineTimestamp": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "Most recent online timestamp (ISO 8601 format). If online, current time truncated to minutes."
}
}
},
"federation": {
"type": "object",
"description": "Information about device's federation.",
"required": [
"federated"
],
"properties": {
"id": {
"type": "string",
"description": "ID of related DeviceFederation. `null` if not federated."
},
"source": {
"type": "string",
"description": "Cloud ID of Source Device Management. `null` if not federated."
},
"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)."
}
}
},
"deployment": {
"$ref": "#/$defs/DeploymentInfo"
},
"pendingConfig": {
"oneOf": [
{
"$ref": "#/$defs/PendingBeaconConfig"
},
{
"$ref": "#/$defs/PendingGatewayConfig"
}
]
},
"firmwareInfo": {
"$ref": "#/$defs/FirmwareInfo"
},
"currentLocation": {
"$ref": "#/$defs/LocationInfo"
},
"displaySettings": {
"$ref": "#/$defs/DisplaySettings"
},
"lowBatterySettings": {
"$ref": "#/$defs/LowBatterySettings"
},
"sensorSettings": {
"$ref": "#/$defs/SensorSettings"
},
"localAlertingSettings": {
"$ref": "#/$defs/LocalAlertingSettings"
},
"buzzerSnoozing": {
"$ref": "#/$defs/BuzzerSnoozing"
},
"dispenser": {
"$ref": "#/$defs/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."
},
"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": "#/$defs/DeviceEditableVirtualAttributes"
},
{
"$ref": "#/$defs/BeaconConfig"
},
{
"$ref": "#/$defs/EditableGatewayConfig"
},
{
"type": "object",
"description": "Some schema overrides.",
"properties": {
"occupancy": {
"$ref": "#/$defs/OccupancyAllSettings"
}
}
}
],
"$defs": {
"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"
}
}
}
}
},
"BeaconConfig": {
"description": "Full beacon-type configuration.",
"allOf": [
{
"$ref": "#/$defs/ConfigBle"
},
{
"$ref": "#/$defs/ConfigIBeacon"
},
{
"$ref": "#/$defs/ConfigEddystone"
},
{
"$ref": "#/$defs/ConfigButton"
},
{
"$ref": "#/$defs/ConfigEid"
},
{
"type": "object",
"properties": {
"powerSaving": {
"$ref": "#/$defs/PowerSavingSettings"
},
"accelerometer": {
"$ref": "#/$defs/AccelerometerSettings"
},
"occupancy": {
"$ref": "#/$defs/OccupancyPhysicalSettings"
},
"irReceiver": {
"$ref": "#/$defs/IrReceiverSettings"
},
"irTransmitter": {
"$ref": "#/$defs/IrTransmitterSettings"
},
"bleScan": {
"$ref": "#/$defs/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."
},
"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": "#/$defs/DisplaySettings"
},
"lowBatterySettings": {
"$ref": "#/$defs/LowBatterySettings"
},
"sensorSettings": {
"$ref": "#/$defs/SensorSettings"
},
"localAlertingSettings": {
"$ref": "#/$defs/LocalAlertingSettings"
},
"buzzerSnoozing": {
"$ref": "#/$defs/BuzzerSnoozing"
},
"dispenser": {
"$ref": "#/$defs/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."
}
}
}
]
},
"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."
}
}
},
"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
}
}
},
"ConfigBle": {
"type": "object",
"description": "General BLE advertising settings.",
"properties": {
"name": {
"description": "Bluetooth name.",
"maxLength": 15,
"type": "string"
},
"profiles": {
"type": [
"array",
"null"
],
"description": "List of beacon profiles Device should broadcast.",
"deprecated": true,
"items": {
"type": "string",
"enum": [
"IBEACON",
"EDDYSTONE"
]
}
},
"packets": {
"description": "Beacon advertising packets that should be broadcasted by a device.",
"type": [
"array",
"null"
],
"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",
"null"
],
"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.\n\n**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`.\n"
},
"shuffled": {
"type": [
"boolean",
"null"
],
"description": "Flag indicating whether a beacons should turn the Kontakt.io Secure Shuffling on (`true`) or of (`false`)."
},
"txPower": {
"type": [
"integer",
"null"
],
"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)."
},
"interval": {
"type": [
"integer",
"null"
],
"minimum": 100,
"maximum": 10240,
"description": "Advertising interval in milliseconds for iBeacon and Eddystone packets."
},
"kontaktFrameInterval": {
"type": [
"integer",
"null"
],
"minimum": 20,
"maximum": 10240,
"description": "Advertising interval in milliseconds for Kontakt.io Secure Profile packet (Kontakt Packet)."
},
"telemetryInterval": {
"type": [
"integer",
"null"
],
"minimum": 20,
"maximum": 10240,
"description": "Advertising interval in milliseconds for Kontakt.io Telemetry packet."
},
"locationFrameInterval": {
"type": [
"integer",
"null"
],
"minimum": 100,
"maximum": 10240,
"description": "Advertising interval in milliseconds for Kontakt.io Location packet."
},
"telemetryFields": {
"type": [
"array",
"null"
],
"description": "Bitmask-based configuration of fields included in the Kontakt.io Telemetry packet.\nEach value enables a specific telemetry field. Available fields depend on device hardware capabilities.\n\n| Value | Description |\n|-------|-------------|\n| AIR_PRESSURE | Air pressure in Pa, as a float32 number |\n| AIR_QUALITY | Air-Quality-Index (AQI) in units 0-254, 255 meaning invalid |\n| BATTERY | Battery percentage, from 0% to 100%, with 255 meaning externally-powered |\n| BLE_CHANNEL | BLE channel on which it is advertising: 0 - 40 |\n| BLE_SCAN_RESULT | BLE scan results |\n| BUTTON_CLICK | Seconds since the last button click, saturating at 0xFFFF |\n| BUTTON_DOUBLE_CLICK | Seconds since the last double click, saturating at 0xFFFF |\n| DOUBLE_TAP_EVENT | Seconds since the last double tap, saturating at 0xFFFF |\n| GAS_SENSOR | Gas sensor reading |\n| GPIO | GPIO state as a telemetry, not implemented |\n| HUMIDITY | Relative humidity percentage 0-100, 255 meaning invalid |\n| IDENTIFIED_BUTTON_CLICK | Click 8-bit counter, and seconds since the last button click, saturating at 0xFFFF |\n| INOUT_COUNTER | In/out people counter |\n| IR_STATS | IR scan statistics |\n| LIGHT_LEVEL | Light level as a percentage: 0 - dark, 100 - sunny environment, 255 - invalid |\n| LIGHT_LEVEL_LUX | Light level in lux, as an uint16 |\n| LOGGING_ENABLED | Show if logging is enabled and if data is available for download |\n| MOVEMENT_EVENT | Movement 8-bit counter, and seconds since the last movement click, saturating at 0xFFFF |\n| MOVEMENT_THRESHOLD_EVENT | Seconds since the last movement, saturating at 0xFFFF |\n| OCCUPANCY | Number of people measured by the detector: 0 - 254, 255 - invalid |\n| PEOPLE_DETECTION | People detection |\n| PIR_DETECTION | Seconds since the last PIR movement, saturating at 0xFFFF |\n| PROXIMITY_REPORT | Proximity report |\n| ROOM_NUMBER | Room number, either measured, or configured. Uint16 |\n| RSSI_SCAN | RSSI scan results |\n| SOAP_DISPENSER | Soap dispenser event |\n| TAP_EVENT | Seconds since the last tap, saturating at 0xFFFF |\n| TEMPERATURE | Temperature as signed 8-bit integer, from -128 to 127C |\n| TEMPERATURE_16_BITS | Temperature as an FP8.8 signed fixed-point number |\n| TWO_BUTTON_INFO | 2x click 8-bit counters, and seconds since the any button click, saturating at 0xFFFF |\n| UTC_TIME | Unix timestamp, UTC time from 1970 in seconds |\n| RAW_ACCELEROMETER | Sensitivity: 1/1000 of a g; X, Y, Z values in units of the sensitivity |\n",
"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",
"null"
],
"description": "BLE broadcasting channel used for Kontakt.io Location packet broadcasts. 0 means randomized channel broadcasting.",
"enum": [
0,
37,
38,
39
]
}
}
},
"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.\nAn empty list `[]` corresponds to a mask of `0b000` (all flags unset) which is the default:\nclick and long-press are enabled, triple-click is disabled.\nSend an empty list to restore defaults.\n\nNote: `CLICK_OFF` and `LONG_PRESS_OFF` are inverted flags — setting them **disables** a behavior\nthat is on by default. `TRIPLE_CLICK` is a normal flag — setting it **enables** a behavior\nthat is off by default.\n\n| Value | Description |\n|-------|-------------|\n| CLICK_OFF | Disable single-click detection. On by default — set this flag to turn it off |\n| LONG_PRESS_OFF | Disable long-press detection. On by default — set this flag to turn it off |\n| TRIPLE_CLICK | Require a triple-click to trigger a panic event instead of a single click. Off by default |\n| MULTI_CLICK | Enable multi-click detection. Mutually exclusive with TRIPLE_CLICK. Off by default |\n",
"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.\n",
"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."
}
}
},
"ConfigEddystone": {
"type": "object",
"description": "Eddystone settings.",
"properties": {
"namespace": {
"type": [
"string",
"null"
],
"description": "Eddystone UID Namespace.",
"maxLength": 20,
"minLength": 20
},
"instanceId": {
"type": [
"string",
"null"
],
"description": "Eddystone UID Instance ID.",
"maxLength": 12,
"minLength": 12
},
"url": {
"type": [
"string",
"null"
],
"description": "Eddystone URL address. Hex-encoded according to Eddystone specification."
},
"decodedUrl": {
"type": [
"string",
"null"
],
"description": "Eddystone URL address. Alias for `url` but in decoded format. `decodedUrl` takes precedence."
},
"rssi0m": {
"type": [
"array",
"null"
],
"description": "List of new Calibrated RSSI@0m values (Eddystone) for each TX power level the Device can use.",
"deprecated": true,
"items": {
"type": "integer"
}
}
}
},
"ConfigEid": {
"type": "object",
"description": "Eddystone-EID settings.",
"properties": {
"eidIdentityKey": {
"description": "Eddystone-EID Identity Key.",
"type": [
"string",
"null"
]
},
"eidRotationPeriodExponent": {
"description": "Eddystone-EID rotation period exponent.",
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 15
}
}
},
"ConfigIBeacon": {
"type": "object",
"description": "iBeacon settings.",
"properties": {
"proximity": {
"type": [
"string",
"null"
],
"format": "UUID",
"description": "iBeacon Proximity UUID."
},
"major": {
"type": [
"integer",
"null"
# --- truncated at 32 KB (76 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kontaktio/refs/heads/main/json-schema/kontaktio-device-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/kontaktio-device"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.