Kärcher External IoT API (1.0.0)

Download OpenAPI specification:Download

This is the first working version of the Kärcher External IoT API in production. Future updates and improvements are expected based on usage and feedback.


Authentication

Before you can use the Kärcher External IoT API, you need to authenticate your requests. This section explains how to get access and use the API securely.

What You Need to Get Started

  1. Client ID: A unique identifier for your application (provided by Kärcher)
  2. Client Secret: A secure password for your application (provided by Kärcher)
  3. Environment: Choose between Production or Staging environment

Note: If you don't have these credentials yet, please contact your Kärcher representative to request API access.

How Authentication Works

The API uses a secure authentication method called OAuth 2.0. Here's the simple process:

  1. Get a Token: Use your credentials to get a temporary access token
  2. Use the Token: Include this token in all your API requests
  3. Token Expires: Tokens expire after 1 hour, so you'll need to get a new one

Step 1: Getting Your Access Token

First, you need to get an access token using your credentials.

Choose your environment:

  • Production : https://auth.fds.kaercher.com/oauth2/token

  • Staging : https://auth.stage.fds.kaercher.com/oauth2/token

  • Access token rate limit: 10 requests/10 minutes

Make this request:

# Production Environment
curl -X POST https://auth.fds.kaercher.com/oauth2/token \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET"

You'll get back a response like this:

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600
}

Important: Save the access_token value - you'll need it for the next step!

Step 2: Using Your Access Token

Now you can make API requests by including your token in the Authorization header.

Example API request:

curl -X GET https://api.fds.kaercher.com/external/v1/machines/specifications \
    -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Common Problems and Solutions

Problem What it means How to fix
401 Unauthorized Your credentials are invalid or expired Check your Client ID and Client Secret. If using a token, get a new one
403 Forbidden You don't have permission for this action Contact Kärcher to request additional permissions
400 Bad Request Your request format is incorrect Make sure you're sending credentials in the request body, not as URL parameters
Token expired Your access token has expired (after 1 hour) Get a new token using the same process as Step 1

Device Families and Concepts

The Kärcher External IoT API supports multiple device families, each with distinct characteristics, operational patterns, and capabilities. Understanding these family-specific differences is crucial for proper API integration.

Note: While this API is primarily focused on robotic devices, it is a general IoT API and also offers access to non-robotic devices. Capabilities and available data for non-robotic devices may differ significantly from those of robots, and only basic information may be available for some device types.

Device Family Overview

Each device family represents a group of machines with similar functionality and operational behavior. While all families use the same API endpoints (/machine/{materialNumber}/{serialNumber}/), they differ significantly in:

  • Status states - Available machine states vary by family
  • Command payloads - Each family has specific command structures
  • Cleaning report formats - Report data and asset types differ
  • Operational concepts - Mission vs. map-based operations

Supported Device Families

KIRA Scrubber Family

Autonomous floor cleaning robots with routine-based operation

Image Material Number Model Description
1.533-001.0 KIRA B50 HW 1.0 Midsize autonomous scrubber dryer with roller brushes
1.533-002.0 KIRA B50 HW 2.0 Midsize autonomous scrubber dryer with roller brushes
1.533-003.0 KIRA BR50 HW 3.0 Midsize autonomous scrubber dryer with roller brushes
1.533-050.0 KIRA BD50 Midsize autonomous scrubber dryer with disc brushes
1.533-013.0 KIRA BR200 Large autonomous scrubber dryer with roller brushes
1.533-014.0 KIRA BD200 Large autonomous scrubber dryer with disc brushes

Key Characteristics:

  • Routine and single mission-based operation
  • SVG-based cleaning report assets
  • Advanced navigation and mapping capabilities

KIRA Vacuum Family

Compact commercial vacuum cleaners with map-level operation

Image Material Number Model Description
1.454-500.0 CV50 Professional dry vacuum
1.454-505.0 CV50 USA Professional dry vacuum

Key Characteristics:

  • Map-level operation focus
  • PNG-based cleaning report assets
  • Manual and semi-automated operation modes

Family-Specific States

KIRA Family States

State Description Data Type Example Value / Structure
charging Whether the robot is currently charging. bool true / false
docked Whether the robot is docked at its charging station. bool true / false
freshWaterLevel Current level of fresh water in the tank in Liters number 60
inorbitEnabled Indicates if integration with InOrbit cloud is enabled. bool true / false
machineOperatingHours Total operating hours of the machine (in seconds). number 356030
machinePosition Current GPS position of the robot. object { "accuracy": 12.808, "latitude": 51.8003658, "longitude": 7.7436499 }
repeatProgress Progress of a repeated cleaning task or mission. object { "progress": 0.019999999552965164, "routeName": "Test1", "repeatPathId": "3", "repeatExecutionId": "1.533-002.0:020146-ad0978ae-62c2-498d-9dec-dc737200304e"}

progress: current mission progress [0-1]
repeatExecutionId: Internal ID of the current execution
repeatPathId: Internal ID of the route
routeName: Name of the Route, as given on the device
robotStatus High-level status of the robot. string one of Idle, Autonomous, Charging, Docking
serviceCounter Various service and usage counters for maintenance tracking. object { "cleaning_time": "98:53:50.295718", "operation_time": "810:42:47.266423", "meter_count": 0, "service_date": "2025-06-10T15:25:06.794977", "suction_time": "00:00:00", "brush_time": "00:00:00", "sidebroom_time": "00:00:00", "dock_count": 0 }
softwareVersion Current software version running on the robot. string 2.2.1
routes List of routes stored on the device. Each route describes an individual cleaning mission generated during a TeachIn session. See routes for the full data structure. Due to the 128 KB AWS IoT limit, capped at 330 items. array of objects [{ "id": 44, "name": "4-long-loop-4", "startLandmark": "id_4", ... }]
routines List of routines stored on the device. A routine is an ordered sequence of routes linked by shared landmarks. See routines for the full data structure. Due to the 128 KB AWS IoT limit, capped at 330 items. array of objects [{ "id": 74, "name": "trip", "routeIds": [24, 26, 30, 24], ... }]
schedules List of schedules stored on the device. Each schedule defines when a routine runs using an rrule recurrence string. See schedules for the full data structure. Due to the 128 KB AWS IoT limit, capped at 330 items. array of objects [{ "id": 26, "name": "six", "idRoutine": 112, "rrule": "...", "color": "#b1b0a1", ... }]

KIRA Vacuum Family States

State Description Data Type Example Value / Structure
cleaningSchedules List of scheduled cleaning tasks. list of objects [] or [ { "scheduleId": "...", "time": "08:00", "days": ["Mon", "Wed"] } ]
location Current map-relative position of the robot. object { "coordinateY": 20293, "mapId": "b0d7aab5-0d2d-44e0-9b31-8ec747b07879", "coordinateX": 37411 }
mapId Unique identifier for the current map in use. object { "uniqueMapId": "b0d7aab5-0d2d-44e0-9b31-8ec747b07879" }
maps List of available map IDs on the robot. list of strings ["8922622c-4418-4d21-9b37-f49f47274e8b", ...]
mcuMainInfo Main MCU info, including state, map count, operation and cleaning time, and storage usage. object { "machineState": 0, "machineStateEnum": "CLEANING_MODE", "mapCount": 5, "totalOperation": 221170, "totalCleaningTime": 1120069, "usedStorage": 56 }
savedWifiNetworks List of saved WiFi networks. list of objects [] or [ { "ssid": "HRD", "mac": "24:cf:24:3f:95:ec" } ]
serviceCounter Service and maintenance counters for various components. object { "brush": 1120069, "filter": 210888, "sensors": 43333, "dirtContainer": 12823, "rubberLip": 210888, "version": 1, "sideBroom": 393352 }
settings Various robot settings and configuration parameters. object { "beep": {"status":0}, "hmiLanguage": {"language":"fi"}, "soundOperating": {"status":1}, "soundVolume": {"soundVolume":100}, "robotName": {"robotName":"Talvikangas uusi"}, "batteryTheftProtection": {"status":0}, "lock": {"status":0}, "blink": {"status":0}, "lockcode": {"code":9999}, "theftProtection": {"status":0}, "lights": {"status":1}, "soundWarning": {"status":1} }
softwareVersion Current software version running on the robot. string 1.3.23-1.1.42-1.3.22
time Current time reported by the robot. string 2025-09-03T14:06:10.262+03
wifiStatus Current WiFi connection status and network details. object { "macAddress": "00:D6:CB:8D:F2:2C", "ipv6Address": "fe80::ac02:62ff:fea0:9aaf%dummy0", "signalStrength": -57, "ipv4Address": "192.168.31.129", "networkName": "HRD", "subnetMask": 0, "defaultGateway": "192.168.31.1" }

Device Commands

Our cloud interfaces with cleaning devices by issuing specific commands. We currently support two primary device classes: Kira and CV50. Each class has a distinct set of commands and payload structures.

Kira Device Commands

This section defines the specific command names, arguments, and behaviors available for the Kira device class.

Mission Commands

Available since version 2.3.0.

These are argument-free commands used to control the execution state of the currently active mission or repeat.

  • missionPause: Pauses the currently active mission/repeat. This is the equivalent of the Pause button on the Kira's HMI. The mission can be resumed using the missionResume command.

  • missionResume: Resumes a currently paused mission/repeat. This is the equivalent of the Resume button on the Kira's HMI.

  • missionStop: Instantly cancels the active mission/repeat. The Kira will remain at its current position. Note: Starting a new mission/repeat at this location will likely fail, as the Kira requires a docking station or landmark to localize itself for every mission. This is the equivalent of the Cancel button on the Kira's HMI.

  • missionDriveBackAndSkip: Skips the current route in a routine after driving back to the docking station or landmark. This is the equivalent of the Skip button on the Kira's HMI.

  • missionInstinctiveDocking: Interrupts the current route and drives the Kira back to the docking station to exchange resources. Afterward, the Kira will return to the position where it was interrupted and continue the route.

  • missionDriveBackAndCancel: Cancels the current route/routine after driving back to the docking station or landmark. This is the recommended method for canceling a mission (preferred over missionStop), as it ensures the Kira is positioned to start new missions at a valid location.

Scheduling Commands

These are commands used to create, update or destroy schedules on the robot.

RRule — Recurrence Rules

All scheduling commands use an rrule string to define when a schedule runs. RRule is a standard format for expressing recurring calendar dates. The Kira device supports a specific subset of the full RRule specification, described below.

An rrule string is composed of two or three newline-separated (\n) components:

  1. DTSTART — defines the start date and time with timezone
  2. RRULE — defines the recurrence pattern
  3. EXDATE (optional) — excludes specific dates from the series

Example structure:

DTSTART;TZID=Europe/Berlin:20250826T114100\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=1\nEXDATE;TZID=Europe/Berlin:20250821T113100

Supported fields:

Field Description Example
DTSTART Start date and time. Must always include a timezone identifier. DTSTART;TZID=Europe/Berlin:20250826T114100
FREQ Repetition unit. Supported values: DAILY, WEEKLY, MONTHLY. FREQ=DAILY
COUNT Used only for one-time (non-repeating) schedules. Must be 1. Repeating schedules use UNTIL instead. COUNT=1
UNTIL End date for a repeating schedule (inclusive). Omitted for one-time schedules. UNTIL=20250930T235900
INTERVAL Repetition interval, used together with FREQ. Supported range: 15. An INTERVAL=2 with FREQ=DAILY means every other day. INTERVAL=2
BYDAY Used with FREQ=WEEKLY to specify individual weekdays. Comma-separated values: MO, TU, WE, TH, FR, SA, SU. BYDAY=MO,TH,SU
EXDATE Excludes specific occurrences from the series. Must include a timezone identifier and match the time component of DTSTART. EXDATE;TZID=Europe/Berlin:20250821T113100

Examples:

// A single, one-time schedule on the given DTSTART time
DTSTART;TZID=Europe/Berlin:20250428T161100\nRRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
// A weekly repeating schedule on Mondays, Thursdays, and Sundays until 2025-09-01
DTSTART;TZID=Europe/Berlin:20250831T090800\nRRULE:FREQ=WEEKLY;UNTIL=20250901T235900;INTERVAL=1;BYDAY=MO,TH,SU
// A daily repeating schedule with 2025-08-21 excluded
DTSTART;TZID=Europe/Berlin:20250801T113100\nRRULE:FREQ=DAILY;UNTIL=20250822T235900;INTERVAL=1\nEXDATE;TZID=Europe/Berlin:20250821T113100

scheduleAdd

Registers a new rrule-based schedule directly on the Kira device. It supports scheduling single routes, standard routines, or on-the-fly anonymous routines.

Parameters

Name Type Description
name string A free-form string to name the schedule.
color string A hex code for the color displayed on the robot's HMI calendar.
Supported values: #b1b0a1, #4b8969, #238c96, #b61a2d, #6e6e6e
rrule string The recurring rule string defining the schedule (Kira specific RRULE format).
routineId integer The ID of the routine to execute. Must exist in the routines telemetry. (Mutually exclusive with routeIds).
routeIds array of integers An array of route IDs defining a new anonymous routine. IDs must exist in the routes telemetry and must be sequentially linked via start and end landmarks. (Mutually exclusive with routineId).

Examples

// Adding a schedule for an existing routine (ID: 57)
{
  "name": "a-routine-schedule",
  "color": "#b1b0a1",
  "rrule": "DTSTART;TZID=Europe/Berlin:20250824T114000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=2",
  "routineId": 57,
}
// Adding a schedule for a single existing route (ID: 18)
{
  "name": "a-route-schedule",
  "color": "#4b8969",
  "rrule": "DTSTART;TZID=Europe/Berlin:20250824T114000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=2",
  "routeIds": [18],
}
// Adding a schedule for a new anonymous routine (Routes: 18, 23, 18)
{
  "name": "a-new-routine-schedule",
  "color": "#238c96",
  "rrule": "DTSTART;TZID=Europe/Berlin:20250824T114000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=2",
  "routeIds": [18, 23, 18],
}

Response

Upon successful completion, the newly created scheduleId is returned within the statusDetails object. You can use this ID to correlate the schedule with the new entry in the schedules telemetry. Additionally, the new schedule entry will include the jobId of this command.

Note: statusDetails only supports string values. Ensure you parse scheduleId to an integer when using it in subsequent API calls.

{
  "status": "SUCCEEDED",
  "statusDetails": {
    "scheduleId": "44"
  },
  "updatedAt": "2025-09-03T10:13:13.03Z"
}

scheduleChange

Modifies an existing schedule. All parameters except scheduleId are optional. Any omitted parameter will retain its current value.

Parameters

Name Type Description
scheduleId integer Required. The unique ID of the schedule to update. Must exist in the schedules telemetry.
name string Optional. A free-form string to rename the schedule.
color string Optional. A hex code for the HMI calendar color.
rrule string Optional. The recurring rule string defining the schedule.
routineId integer Optional. The ID of the routine to execute. (Mutually exclusive with routeIds).
routeIds array of integers Optional. An array of route IDs defining an anonymous routine. (Mutually exclusive with routineId).

Examples

// Updating only name and color
{
  "scheduleId": 22,
  "name": "hustling-time",
  "color": "#6e6e6e",
}
// Updating the rrule time and routine assignment
{
  "scheduleId": 22,
  "rrule": "DTSTART;TZID=Europe/Berlin:20250824T124000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=2",
  "routineId": 115,
}
// Excluding specific dates from an existing series
{
  "scheduleId": 22,
  "rrule": "DTSTART;TZID=Europe/Berlin:20250824T124000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=2\nEXDATE;TZID=Europe/Berlin:20250814T163300,20250822T163300",
}
// Updating all properties in a single call
{
  "scheduleId": 22,
  "name": "hustling-time",
  "color": "#6e6e6e",
  "rrule": "DTSTART;TZID=Europe/Berlin:20250824T124000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=2\nEXDATE;TZID=Europe/Berlin:20250814T163300,20250822T163300",
  "routineId": 115,
}

scheduleNow

Instantly schedules and executes a defined routine or set of routes.

Parameters

Name Type Description
routineId integer The ID of the routine to execute. Must exist in the routines telemetry. (Mutually exclusive with routeIds).
routeIds array of integers An array of route IDs defining an anonymous routine. Must exist in the routes telemetry and be linked via start/end landmarks. (Mutually exclusive with routineId).

scheduleRemove

Removes an existing schedule from the Kira device.

Parameters

Name Type Description
scheduleId integer Required. The unique ID of the schedule to delete. Must exist in the schedules telemetry.

Kira Command Execution Example

This section shows a general end-to-end example of sending a command to a Kira machine, polling its status, and optionally cancelling or reviewing history. The example uses scheduleAdd to register a new daily cleaning schedule for an existing routine.

Step 1 — Send a Command

POST /machines/{materialNumber}/{serialNumber}/commands

curl -X POST https://api.fds.kaercher.com/external/v1/machines/1.533-002.0/000001/commands \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "commandName": "scheduleAdd",
    "commandParameters": {
      "name": "morning-clean",
      "color": "#4b8969",
      "rrule": "DTSTART;TZID=Europe/Berlin:20250826T070000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=1",
      "routineId": 57
    }
  }'

Response 200 OK:

{
  "commandName": "scheduleAdd",
  "commandParameters": {
    "name": "morning-clean",
    "color": "#4b8969",
    "rrule": "DTSTART;TZID=Europe/Berlin:20250826T070000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=1",
    "routineId": 57
  },
  "createdAt": "2025-06-11T11:51:51.077Z",
  "executionId": "36fxuYjGPr9QWCcjNgLg15"
}

Save the executionId from the response — you'll use it to track or cancel the execution.

Step 2 — Poll Execution Status

GET /machines/command-execution/{executionId}

curl -X GET https://api.fds.kaercher.com/external/v1/machines/command-execution/36fxuYjGPr9QWCcjNgLg15 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Response 200 OK:

{
  "data": {
    "executionId": "36fxuYjGPr9QWCcjNgLg15",
    "commandName": "scheduleAdd",
    "commandParameters": {
      "name": "morning-clean",
      "rrule": "DTSTART;TZID=Europe/Berlin:20250826T070000\nRRULE:FREQ=DAILY;UNTIL=20250930T235900;INTERVAL=1",
      "color": "#4b8969",
      "routineId": 6
    },
    "executionRequester": "7sup7pd...",
    "createdAt": "2026-03-27T13:51:26.437Z",
    "executionEvents": [
      {
        "status": "SUCCEEDED",
        "updatedAt": "2026-03-27T13:54:38.635Z"
      },
      {
        "status": "QUEUED",
        "updatedAt": "2026-03-27T13:51:29.402Z"
      },
      {
        "status": "REQUESTED",
        "updatedAt": "2026-03-27T13:51:24.062Z"
      }
    ]
  }
}

Step 3 — (Optional) Cancel If Still Queued or In Progress

DELETE /machines/command-execution/{executionId}

A command can only be cancelled if it is in the QUEUED or IN_PROGRESS status.

curl -X DELETE https://api.fds.kaercher.com/external/v1/machines/command-execution/36fxuYjGPr9QWCcjNgLg15 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Returns 204 No Content on success.

Step 4 — (Optional) View Execution History

GET /machines/{materialNumber}/{serialNumber}/command-executions

curl -X GET "https://api.fds.kaercher.com/external/v1/machines/1.533-002.0/000001/command-executions?limit=10&sort=desc" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Notes:

  • For argument-free commands such as missionPause, missionResume, and missionStop, use an empty commandParameters: {}.
  • The scheduleAdd example above registers a daily routine (ID 57) running at 07:00 Berlin time from 2025-08-26 through 2025-09-30.
  • Rate limit: 5 requests/second on command endpoints.

CV50 Device Commands

Unlike the Kira class, the CV50 device class operates using a single, unified top-level command called cv50_set. All specific actions, configurations, and operations are passed as sub-commands within the payload of this main command.

Wrapper Structure (cv50_set):

The payload for a cv50_set command must contain a keys array. Currently, this array is strictly limited to a single element. This single object within the array must contain exactly one key-value pair, where the key is the sub-command string (e.g., "settings.lights") and the value is its corresponding parameter object.

Payload Example:

{
  "keys": [
    {
      "settings.lights": {
        "status": 0.0
      }
    }
  ]
}

Below are the available sub-commands, their parameters, and the expected JSON structures for their parameter objects.

Cleaning Profiles (cleaningProfile.*)

Commands for managing maps, schedules, and cleaning profiles.

cleaningProfile.schedule.set

Creates or updates a cleaning schedule for a specific map.

Parameters

Name Type Description
weekDays array of integers Days of the week to run (0 = Monday, 1 = Tuesday, etc.). Example: [0, 2] for Mon/Wed.
startTime string Start time in UTC+0 timezone, formatted as hh:mm (e.g., "08:01").
repetition integer Schedule frequency. 0 = once, 1 = weekly.
mode integer Cleaning mode. 0 = normal, 1 = eco, 2 = boost.
mapId string (uuid) The UUID of the map.
scheduleId string (uuid) The unique UUID of the schedule.

Parameter JSON Example:

{
  "weekDays": [0, 2],
  "startTime": "08:01",
  "repetition": 0,
  "mode": 1,
  "mapId": "82e79191-c216-43ea-a963-67b6d2a4b82e",
  "scheduleId": "7e0adfd5-e65a-488e-954d-70b05219b137"
}

cleaningProfile.schedule.delete

Deletes a specific schedule from a profile.

Parameters

Name Type Description
scheduleId string (uuid) The UUID of the schedule to delete.
mapId string (uuid) The UUID of the associated map.

Parameter JSON Example:

{
  "scheduleId": "7e0adfd5-e65a-488e-954d-70b05219b137",
  "mapId": "82e79191-c216-43ea-a963-67b6d2a4b82e"
}

cleaningProfile.delete

Deletes an entire map profile.

Parameters

Name Type Description
mapId string (uuid) The full UUID-v4 string of the map to delete.

Parameter JSON Example:

{
  "mapId": "82e79191-c216-43ea-a963-67b6d2a4b82e"
}

Device Settings (settings.*)

Commands for configuring the robot's hardware settings, security, and user interface.

Parameters & Examples

Sub-Command Parameter(s) Description Parameter JSON Example
settings.lockcode code: integer Sets a 4-digit PIN code. {"code": 1234}
settings.lock status: integer Enables/disables the device lock (1 = true/enabled). {"status": 0}
settings.batteryTheft status: integer Activates (1) or deactivates (0) battery theft protection. {"status": 1}
settings.theftProtection status: integer Activates (1) or deactivates (0) robot theft protection. {"status": 1}
settings.beep status: integer Triggers audio feedback so the user can locate the robot. {"status": 1}
settings.blink status: integer Triggers visual feedback so the user can locate the robot. {"status": 1}
settings.lights status: number Activates (1.0) or deactivates (0.0) status LEDs on the robot. {"status": 1.0}
settings.soundVolume soundVolume: integer Sets audio volume from 0 to 100 (0 disables sound). {"soundVolume": 50}
settings.soundWarning status: integer Toggles warning sounds on (1) or off (0). {"status": 1}
settings.soundOperating status: integer Toggles operational sounds on (1) or off (0). {"status": 1}
settings.robotName robotName: string Sets an arbitrary user-defined name for the robot. {"robotName": "robot name"}
settings.reset settings: integer
firmware: integer
Resets settings to factory defaults and unclaims the device. {"settings": 1, "firmware": 1}

settings.hmiLanguage

Sets the interface language of the robot's HMI.

Parameters

Name Type Description
hmiLanguage string A 2-letter language code.

Supported Codes:

de (German), fr (French), nl (Dutch), en (English), sv (Swedish), no (Norwegian), fi (Finnish), da (Danish), pl (Polish), cs (Czech), sk (Slovak), ja (Japanese), ko (Korean), es (Spanish), pt (Portuguese), it (Italian), el (Greek), tr (Turkish), ru (Russian), ar (Arabic), zh (Chinese), hr (Croatian), sl (Slovenian), sr (Serbian), uk (Ukrainian), ro (Romanian), hu (Hungarian), et (Estonian), bg (Bulgarian), lv (Latvian).

Parameter JSON Example:

{
  "hmiLanguage": "en"
}

Cleaning Operations (cleaning.*)

Real-time commands to control the robot's physical movement and cleaning state.

Sub-Command Parameter(s) Description Parameter JSON Example
cleaning.continue (None) Resumes cleaning if the robot was previously paused. {}
cleaning.pause (None) Pauses the current cleaning operation. {}
cleaning.start mapId: string Attempts to start cleaning on the given map UUID. Use "basic" for basic cleaning mode without a map. {"mapId": "82e79191-c216..."}
cleaning.stop (None) Instantly terminates the current cleaning or map exploration. {}
cleaning.returnHome (None) Commands the robot to return to its home position/docking station. {}

Remote Control (remote.*)

Sub-Command Parameter(s) Description Parameter JSON Example
remote.start (None) Triggers the robot to start remote control pairing via Bluetooth. {}

CV50 Command Execution Example

This section shows an end-to-end example of sending a cv50_set command to a CV50 machine. The example updates the robot's sound volume setting.

Step 1 — Send a Command

POST /machines/{materialNumber}/{serialNumber}/commands

curl -X POST https://api.fds.kaercher.com/external/v1/machines/1.454-500.0/000042/commands \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "commandName": "cv50_set",
    "commandParameters": {
      "keys": [
        {
          "settings.soundVolume": {
            "soundVolume": 75
          }
        }
      ]
    }
  }'

Response 200 OK:

{
  "commandName": "cv50_set",
  "commandParameters": {
    "keys": [
      {
        "settings.soundVolume": {
          "soundVolume": 75
        }
      }
    ]
  },
  "createdAt": "2025-06-11T12:00:00.000Z",
  "executionId": "7t8wChhKBuuD4ToGqPYYYS"
}

Step 2 — Poll Execution Status

GET /machines/command-execution/{executionId}

curl -X GET https://api.fds.kaercher.com/external/v1/machines/command-execution/7t8wChhKBuuD4ToGqPYYYS \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Response 200 OK:

{
  "data": {
    "executionId": "7t8wChhKBuuD4ToGqPYYYS",
    "commandName": "cv50_set",
    "commandParameters": {
      "keys": [
        {
          "settings.soundVolume": {
            "soundVolume": 75
          }
        }
      ]
    },
    "executionRequester": "7sup7pd...",
    "createdAt": "2026-03-27T13:27:30.018Z",
    "executionEvents": [
      {
        "status": "SUCCEEDED",
        "updatedAt": "2026-03-27T13:41:40.336Z"
      },
      {
        "status": "QUEUED",
        "updatedAt": "2026-03-27T13:27:33.573Z"
      },
      {
        "status": "REQUESTED",
        "updatedAt": "2026-03-27T13:27:27.206Z"
      }
    ]
  }
}

Step 3 — (Optional) Cancel If Still Queued or In Progress

DELETE /machines/command-execution/{executionId}

A command can only be cancelled if it is in the QUEUED or IN_PROGRESS status.

curl -X DELETE https://api.fds.kaercher.com/external/v1/machines/command-execution/7t8wChhKBuuD4ToGqPYYYS \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Returns 204 No Content on success.

Note: The keys array must contain exactly one sub-command object per request. To apply multiple settings, send separate cv50_set commands.


Kira Telemetry Data

The Kira device publishes structured telemetry data for its routes, routines, and schedules. These telemetry datapoints reflect the on-device state and are available via the machine status API.

Note on size limits: Due to the 128 kB IoT message size limit, each telemetry datapoint is capped at a maximum of 330 items. Any items that exceed this limit are published separately under the corresponding overflow key (e.g., routesOverflow, routinesOverflow, schedulesOverflow). A prioritization strategy is applied to ensure the most relevant items are always included within the limit — items that were recently created, modified, or executed take priority. The order of items in the array does not indicate this priority.

routes

Routes describe individual cleaning missions that were manually recorded during a TeachIn session.

Example item:

{
  "id": 44,
  "name": "4-long-loop-4",
  "startLandmark": "id_4",
  "endLandmark": "id_4",
  "createdAt": "2025-08-15T09:33:34.209849Z",
  "modifiedAt": "2025-05-30T13:37:05.099357Z",
  "thumbnailZipS3": "11989085954014531794.44_mission.zip",
  "mapZipS3": "14862309742929315492.44.zip",
  "duration": "00:15:00",
  "postChargingDuration": "00:15:00"
}

Fields:

Field Type Description
id int Primary key identifying the route on the Kira device it was generated on.
name string User-defined freeform name for the route.
startLandmark string The start landmark, identified by an ArUco code at the beginning of the route.
endLandmark string (Optional) The end landmark of the route, or empty if the route ends without a landmark.
createdAt string Creation timestamp in ISO 8601 format.
modifiedAt string Last modification timestamp in ISO 8601 format.
thumbnailZipS3 string S3 ID of the zip file containing the route thumbnail (thumbnail.svg).
mapZipS3 string S3 ID of the zip file containing the route map.
duration string Estimated duration of the route execution.
postChargingDuration string Estimated duration of charging after route execution.

routines

A routine is an ordered sequence of routes, where each successive route starts at the end landmark of the previous one.

Example item:

{
  "id": 74,
  "createdAt": "2025-08-15T09:33:34.209849Z",
  "modifiedAt": "2025-04-28T15:07:56.699435Z",
  "name": "trip",
  "routeIds": [24, 26, 30, 24],
  "anonymous": false,
  "duration": "00:15:00",
  "postChargingDuration": "00:15:00"
}

Fields:

Field Type Description
id int Primary key identifying the routine on the Kira device.
createdAt string Creation timestamp in ISO 8601 format.
modifiedAt string Last modification timestamp in ISO 8601 format.
name string User-defined freeform name for the routine.
routeIds []int Ordered array of route IDs to execute. References the id field in the routes telemetry.
anonymous bool Marks the routine as internally generated. Anonymous routines are not intended to appear in general routine listings visible to the user.
duration string Estimated total duration of the routine execution.
postChargingDuration string Estimated duration of charging after routine execution.

Note: A routine is only valid if each pair of neighboring routes shares the same landmark — the endLandmark of one route must match the startLandmark of the next.

schedules

Schedules define when routines are executed, using an rrule string for recurrence (see RRule — Recurrence Rules above).

Example item:

{
  "id": 26,
  "name": "six",
  "createdAt": "2025-08-15T09:33:34.209849Z",
  "modifiedAt": "2025-04-28T15:07:56.699435Z",
  "idRoutine": 112,
  "rrule": "DTSTART;TZID=Europe/Berlin:20250925T114300\nRRULE:FREQ=DAILY;COUNT=1;INTERVAL=1",
  "color": "#b1b0a1",
  "idParentSchedule": null
}

Fields:

Field Type Description
id int Primary key identifying the schedule on the Kira device.
name string User-defined freeform name for the schedule.
createdAt string Creation timestamp in ISO 8601 format.
modifiedAt string Last modification timestamp in ISO 8601 format.
idRoutine int ID of the routine to execute. References the id field in the routines telemetry.
rrule string Recurrence rule string defining when the schedule runs. See RRule — Recurrence Rules.
color string Hex color code displayed in the Kira HMI calendar. One of: #b1b0a1, #4b8969, #238c96, #b61a2d, #6e6e6e.
idParentSchedule int? (Optional) If a single event deviates from the recurring series, this points to the parent schedule's id.
jobId string? (Optional) Set when the schedule was created via the scheduleAdd command. Contains the jobId of that command, allowing you to correlate the command with this entry. Not persisted — may be absent in subsequent publishes with the same id, but is guaranteed to be present immediately after a successful scheduleAdd.

Note: Schedules can only reference routines. To schedule a single route, Kira automatically generates an anonymous routine containing that route.

idParentSchedule — Deviating Events

A single occurrence within a recurring schedule can deviate from the rest of the series. This is represented by two linked schedule entries:

  • The parent schedule contains the recurring rrule, with an EXDATE entry that removes the specific occurrence from the normal series.
  • The child schedule contains a one-time rrule for the deviating event and references the parent via idParentSchedule.

Example:

[
  {
    "id": 21,
    "name": "one",
    "createdAt": "2025-08-15T09:30:32.335724",
    "modifiedAt": "2025-08-15T09:30:32.335724",
    "idRoutine": 97,
    "rrule": "DTSTART;TZID=Europe/Berlin:20250819T114000\nRRULE:FREQ=DAILY;UNTIL=20250830T235900;INTERVAL=1\nEXDATE;TZID=Europe/Berlin:20250819T114000",
    "color": "#b1b0a1",
    "idParentSchedule": null
  },
  {
    "id": 29,
    "name": "one",
    "createdAt": "2025-08-19T09:38:59.870097",
    "modifiedAt": "2025-08-15T09:30:32.335724",
    "idRoutine": 97,
    "rrule": "DTSTART;TZID=Europe/Berlin:20250819T135500\nRRULE:FREQ=DAILY;COUNT=1;INTERVAL=1",
    "color": "#b1b0a1",
    "idParentSchedule": 21
  }
]

In this example, schedule 21 is a daily recurring series with the occurrence on 2025-08-19 excluded via EXDATE. Schedule 29 is a one-time replacement for that excluded occurrence, running at a different time and pointing back to its parent via idParentSchedule: 21.


Legal Information

For legal information and imprint, please visit: Kärcher Legal Information


API Endpoints

The following endpoints are available for interacting with the Kärcher External IoT API:

Specifications

Get machine specifications

Retrieves the machine specifications. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
query Parameters
registeredSince
string <date>
Example: registeredSince=2025-01-10

Filter machines by registration Date.

limit
integer
Default: 10

Number of results to return.

cursor
string
Example: cursor=eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCIsIm9mZnNldCI6MjB9

Cursor for pagination.

sort
string
Enum: "asc" "desc"

Sort the results by registration date. Use asc for ascending and desc for descending order.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Telemetry

Get machine statuses

Retrieves the current statuses of a single/multiple machine(s), including generic and device-specific data. Machine Identifier is the "machineId" obtained in the response of the /specifications endpoint. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
query Parameters
machineIds
required
Array of strings <= 10 items
Example: machineIds=bWDsBhPuVFP3ekfWS49yUg,aW4iKdShK2RhgxuFmYZ18k

Unique identifier of the machine(s), separated by commas.

Responses

Response samples

Content type
application/json

In this example, the machine connected to the cloud ("lastConnected" via MQTT) at 2025-02-11T18:40:44.971Z, but the last time it exchanged telemetry or activity data was at 2025-02-11T18:30:44.971Z ("lastContact"). This means that during the 10-minute interval, there was no data exchange despite network-level connectivity.

{
  • "data": [
    ],
  • "errors": [
    ]
}

Notifications

Get customer notifications

Retrieves customer notifications related to machines. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
query Parameters
machineIds
string
Example: machineIds=bWDsBhPuVFP3ekfWS49yUg,aW4iKdShK2RhgxuFmYZ18k

Unique identifier of a single/multiple machine(s), separated by commas. If omitted, returns notifications for all machines. Machine Identifier is the "machineId" obtained in the response of the /specifications endpoint.

limit
integer
Default: 10
Example: limit=10

Number of results to return.

cursor
string
Example: cursor=eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCIsIm9mZnNldCI6MjB9

Cursor for pagination.

sort
string
Enum: "asc" "desc"

Sort the results by received date. Use asc for ascending and desc for descending order.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Execution Reports

Get cleaning reports

Retrieves cleaning reports for machines within a specified time range. If the machine parameter is provided, it filters reports for that specific machine. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
query Parameters
machineId
string
Example: machineId=bWDsBhPuVFP3ekfWS49yUg

Unique identifier of the machine. If omitted, returns reports for all machines. Machine Identifier is the "machineId" obtained in the response of the /specifications endpoint.

startDate
required
string <date-time>
Example: startDate=2025-01-01T00:00:00.000Z

Start date for filtering cleaning reports.

endDate
required
string <date-time>
Example: endDate=2025-01-12T00:00:00.000Z

End date for filtering cleaning reports. Must be later than startDate and within a maximum range of 90 days.

limit
integer
Default: 15
Example: limit=15

Number of results to return.

cursor
string
Example: cursor=eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCIsIm9mZnNldCI6MjB9

Cursor for pagination.

sort
string
Enum: "asc" "desc"

Sort results based on the completion date. Use asc for ascending and desc for descending order.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Get cleaning report map image

Retrives a URL to download the map image of a cleaning report. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
path Parameters
materialNumber
required
string
Example: 1.533-001.0

Material number of the machine.

serialNumber
required
string
Example: 000001

Serial number of the machine.

mapId
required
string
Example: 550e8400-e29b-41d4-a716-446655440000

Unique identifier of the cleaning report map image. This value is obtained from the mapIds field in the cleaning report response.

Responses

File Management

Download files

Downloads files including cleaning report maps, map backgrounds, general files, and attachments. This is a new general-purpose endpoint that supports all file types. All files are organized by machine (material number + serial number) and categorized by file type. The rate limit of this endpoint is 5 requests per second. Note: For cleaning report maps, you can also use the existing dedicated endpoint /machines/{materialNumber}/{serialNumber}/cleaning-reports-map/{mapId}.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
path Parameters
materialNumber
required
string
Example: 1.533-001.0

Material number of the machine.

serialNumber
required
string
Example: 000001

Serial number of the machine.

fileType
required
string
Enum: "cleaning-report-map" "robotics-map" "general" "attachment"
Example: cleaning-report-map

Category of the file to download. Can take these values:

  • cleaning-report-map - Visual maps showing the cleaning path and coverage from cleaning operations. These maps are generated after each cleaning task and display the route taken by the machine, areas cleaned, and coverage statistics. Use this type when downloading maps associated with cleaning reports to visualize the machine's cleaning performance and path coverage. These are the same maps that can be downloaded via the dedicated endpoint /machines/{materialNumber}/{serialNumber}/cleaning-reports-map/{mapId}.

  • robotics-map - Map backgrounds (floor plans) used for navigation and visualization purposes. These maps serve as the underlying reference layer for displaying machine locations, routes, and operational areas. These maps can be used for live positioning of the machine while operating as a background image of the interfaces. Use this type when downloading base map images that provide spatial context for the machine's operating environment.

  • general - General purpose file type for various file formats and use cases.

  • attachment - Placeholder for future use cases and additional file attachment types.

fileId
required
string
Example: 550e8400-e29b-41d4-a716-446655440000

Unique identifier of the file.

Responses

Response samples

Content type
application/json
Example

Commands

Get available commands by machine types

Retrieves a list of available commands for machine types. Machine Type Identifier is Kärcher of your device. Each command may have a unique set of parameters required for execution, and vary depending on the command. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
query Parameters
machineTypes
required
Array of strings <= 10 items
Example: machineTypes=1.533-002.0,0.300-268.0

List of up to 10 machine type identifiers.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Send command to a machine

Sends a command to a specified machine. Machine Identifier is Kärcher - of your device. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
path Parameters
materialNumber
required
string
Example: 1.533-002.0

Material Number of the machine.

serialNumber
required
string
Example: 000001

Serial Number of the machine.

Request Body schema: application/json
required
commandName
required
string
commandParameters
required
object

Parameters for the command as an object.

Responses

Request samples

Content type
application/json
{
  • "commandName": "setHorn",
  • "commandParameters": {
    }
}

Response samples

Content type
application/json
{
  • "commandName": "getLogs",
  • "commandParameters": {
    },
  • "createdAt": "2025-06-11T11:51:51.077Z",
  • "executionId": "36fxuYjGPr9QWCcjNgLg15"
}

Get command execution history

Retrieves the execution history of commands sent to a specified machine. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
path Parameters
materialNumber
required
string
Example: 1.533-002.0

Material Number of the machine.

serialNumber
required
string
Example: 000001

Serial Number of the machine.

query Parameters
limit
integer
Default: 10
Example: limit=10

Number of results to return.

cursor
string
Example: cursor=eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCIsIm9mZnNldCI6MjB9

Cursor for pagination.

sort
string
Enum: "asc" "desc"

Sort results based on the execution date. Use asc for ascending and desc for descending order.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Get command execution details

Retrieves the execution details of a specific command execution. The rate limit of this endpoint is 5 requests per second.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
path Parameters
executionId
required
string
Example: 7t8wChhKBuuD4ToGqPYYYS

Unique identifier of the command execution.

Responses

Response samples

Content type
application/json
{
  • "executionId": "36fxuYjGPr9QWCcjNgLg15",
  • "commandName": "command-name",
  • "commandParameters": {
    },
  • "executionRequester": "1jm9f8eu78edua5avnqnmc7ph0",
  • "createdAt": "2025-04-22T02:04:49.770Z",
  • "executionEvents": [
    ]
}

Cancel command execution

Cancels an ongoing command execution. The command execution events will receive the status 'CANCELLED'. This may not happen immediately, so the client may need to check the status again with the get command execution details endpoint. The command can only be cancelled if it is in the 'QUEUED' or 'IN_PROGRESS' status.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
path Parameters
executionId
required
string^[1-9A-HJ-NP-Za-km-z]{22}$
Example: 7t8wChhKBuuD4ToGqPYYYS

Unique identifier of the command execution.

Responses

Response samples

Content type
application/json
{
  • "status": 400,
  • "message": "invalid_parameter"
}

WebSocket

Establish WebSocket connection

Establishes a WebSocket (wss://) connection for some real-time machine telemetry updates('location', 'cleaningReport', 'mcuMainInfo', 'robotStatus', 'repeatProgress', 'pose').

Connection URL

Replace the server base URL with the WebSocket server URL:

  • PROD: wss://websocket.fds.kaercher.com

  • STAGE: wss://websocket.stage.fds.kaercher.com

Example connection URL:

wss://websocket.fds.kaercher.com?materialNumber=1.454-500.0&serialNumber=002005&accessToken={accessToken}

Authentication

Pass the OAuth2 access token (obtained via client credentials flow) as the accessToken query parameter. The required scope is external-api/websocket:connect.

Datapoints response:

{
  "type": "datapoints",
  "data": {
    "location": {
      "coordinateX": 1636,
      "coordinateY": 6355,
      "mapId": "124b7f11-3d80-4a2b-b5a7-345835b2f465"
    }
  },
  "timestamp": 1773645666755
}

Disconnection

Closing the WebSocket connection ($disconnect) removes the connection from the server automatically. No explicit message is required.

Authorizations:
externalApiAuth-ProdexternalApiAuth-Stage
query Parameters
materialNumber
required
string
Example: materialNumber=1.454-500.0

The material number of the machine to subscribe to. Included in the WebSocket URL as a query string parameter.

serialNumber
required
string
Example: serialNumber=002005

The serial number of the machine to subscribe to. Included in the WebSocket URL as a query string parameter.

accessToken
required
string
Example: accessToken=eyJraWQiOiJleGFtcGxlIiwiYWxnIjoiUlMyNTYifQ...

OAuth2 access token obtained via the client credentials flow. Used by the WebSocket authorizer to authenticate the connection request. Required scope: external-api/websocket:connect.

Responses

Response samples

Content type
application/json
{
  • "status": 400,
  • "message": "invalid_parameter"
}