Kontakt.io Device (Portal Beam) API

These endpoints are designed to assist with storing metadata associated with Portal Beams

Operations 5

POST /portalbeam/image Store or erase Portal Beam calibration image
GET /portalbeam/image List images for one or more Portal Beams
POST /portalbeam/stitching Create or update stitching between two devices
GET /portalbeam/stitching Get stitching by uniqueIds
DELETE /portalbeam/stitching Delete stitching between two selected beams

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-device-portal-beam-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-device-portal-beam-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Device Management Device (Portal Beam) 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: Device (Portal Beam)
  description: 'These endpoints are designed to assist with storing metadata associated with Portal Beams

    '
paths:
  /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: []
components:
  schemas:
    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
    Polygon:
      type: object
      properties:
        id:
          type: string
          format: uuid
        polygon:
          type: array
          items:
            type: object
            properties:
              x:
                type: integer
              y:
                type: integer
    StitchingPair:
      type: object
      required:
      - firstDevice
      - secondDevice
      properties:
        firstDevice:
          $ref: '#/components/schemas/StitchedDevice'
        secondDevice:
          $ref: '#/components/schemas/StitchedDevice'
    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
    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...
    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
    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'
    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'
    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'
  securitySchemes:
    bearer_token:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Provide a JWT in the `Authorization: Bearer <token>` 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.
externalDocs:
  url: https://developer.kontakt.io