Kontakt.io External Device API

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).

Operations 5

POST /device/delete Delete an external device
POST /device/external Create a single external device
POST /device/external/import Import external devices
GET /device/external/import Get status of the import process
DELETE /device/external/import/{jobKey} Resets status of external devices import process started by the `POST /device/external/import` call

Documentation

Specifications

Other Resources

Work with this as data

Every API 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 apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/kontaktio-external-device-api"
All apis
curl "https://apis.io/api/v1/apis?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.

OpenAPI Specification

kontaktio-external-device-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Device Management External Device 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/
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: 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).
paths:
  /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'
components:
  schemas:
    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'
    Polygon:
      type: object
      properties:
        id:
          type: string
          format: uuid
        polygon:
          type: array
          items:
            type: object
            properties:
              x:
                type: integer
              y:
                type: integer
    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'
    DeploymentInfo:
      type: object
      description: Information about device's deployment.
      properties:
        status:
          $ref: '#/components/schemas/DeploymentStatus'
        deploymentDate:
          type:
          - string
          - 'null'
          format: date-time
          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
          - 'null'
          description: Email address of the person who deployed the device.
          example: john.doe@example.com
        installerName:
          type:
          - string
          - 'null'
          description: First and last name of the person who deployed the device.
          example: John Doe
      required:
      - status
    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
          - 'null'
          description: Optional details
          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
    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
    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. \n\n0 - static occupancy.  \n2 - 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
    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
    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'
    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
    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
          - 'null'
          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:
          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'
    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'
    UniqueId:
      description: Unique identifier of a device.
      type: string
      example: 11P10AvW
    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.


            **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`.

            '
        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.

            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 |

            '
          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
    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.
    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
    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
    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
    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. \n 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
               

# --- truncated at 32 KB (80 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kontaktio/refs/heads/main/openapi/kontaktio-external-device-api-openapi.yml