Platforms
Two platforms. Same sensors.
| Kardian Dashboard | Kardian Health Insights | |
|---|---|---|
| Designed for | Care facilities using PointClickCare (PCC), and remote patient monitoring in the US | Care providers and partners building their own services on real-time and summary data |
| Plans | Lite, Standard, Professional, each with an API Only option | One plan with the full feature set |
| PCC integration | Included | Not available |
| API | REST API, plus WebSocket on Standard and Professional | REST API and WebSocket always included |
| Real-time data | HR, RR, presence, movement index, stability scores, raw data, respiratory waveform (Professional) | All Kardian Professional data, plus awakeness, sleep flags, POBC, 5-minute averages, and Z-scores |
| Regions | US | US, Korea and Japan |
Kardian Dashboard
For care facilities using PointClickCare (PCC) and remote patient monitoring in the US. Three plans (Lite, Standard, Professional), each with an API Only option.
Plans and documentation
Three plans. Two documentation pages.
Each plan is also available as an API Only option, which provides the same API data without the web dashboard, summary reports, or mobile app.
| Plan | REST API documentation | WebSocket API |
|---|---|---|
| Lite, Lite API Only | XK Public API, Lite | Not included |
| Standard, Standard API Only | XK Public API, Standard and Professional | Included (see below) |
| Professional, Professional API Only | XK Public API, Standard and Professional | Included, with respiratory waveform |
Not sure which plan you are on? Please contact your XK representative.
Data by plan
What you can retrieve. Plan by plan.
| Lite | Standard | Professional | |
|---|---|---|---|
| Daily summary (REST) | Daily HR and RR averages, daily POBC for HR and RR | Same as Lite | Same as Lite |
| Daily sleep (REST) | Not included | Daily sleep score and sleep duration | Daily sleep score and sleep duration |
| Averaged vital signs (REST) | Not included | 5-minute HR, RR, and movement index averages, presence dwell times | Same as Standard |
| Alerts (REST webhooks) | Not included | Real-time and daily alert webhooks, presence status | Same as Standard |
| Real-time and raw data (WebSocket) | Not included | HR, RR, presence, movement index, stability scores, raw data | Standard data, plus the respiratory waveform |
| Account management (REST) | Account, buildings, residents, patients, rooms (read) | Full management: buildings, gateways, devices, residents, patients, rooms | Same as Standard |
The respiratory waveform is sent only when the breathing stability score (stability_BR, 0 to 100) is 80 or higher, so that only reliable waveform data is delivered.
REST API
Summaries and management. Over HTTPS.
Server: https://us-central1-xandar-kardian-production.cloudfunctions.net/api. Every request includes your API key in the Authorization header. Full endpoint details, parameters, and response examples are in the documentation page for your plan.
| Endpoint group | Lite | Standard and Professional |
|---|---|---|
| Account | Included | Included, plus dashboard login token |
| Buildings, residents, patients, rooms | Read | Read, create, and update |
| Gateways and devices | Not included | Read, create, update, connection status, data collection on and off |
Daily metrics (/sensorslog/daily-metrics/{serialNumber}) | Included, without sleep data | Included, with sleep score and duration |
| Daily reports, including PointClickCare (PCC) variants | Not included | Included |
| 5-minute HR, RR, and movement index averages | Not included | Included |
| Presence dwell times and alerts | Not included | Included |
Requests are subject to fair-use limits that sit well above normal usage. When a limit is reached, the API returns 429. If you plan a one-time migration or a historical backfill, please let us know in advance.
WebSocket API
Real-time data. Straight from the sensor.
Available on Standard and Professional plans, including their API Only options.
Show the Kardian WebSocket guide
Step 1. Get an access token
Tokens are valid for one hour.
| URL | https://us-central1-xandar-kardian-production.cloudfunctions.net/api/token/external_auth_token |
|---|---|
| Method | GET |
| Header | Authorization: your API key |
| Query parameter | email: the email address registered with your account |
| Response | { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } |
Step 2. Connect
Server: wss://realtime-data.xkcorp.com/realtimeSensorData. Use socket.io-client and pass the token in the auth field.
const axios = require('axios');
const { io } = require('socket.io-client');
async function connectSocket() {
try {
const response = await axios.get(
'https://us-central1-xandar-kardian-production.cloudfunctions.net/api/token/external_auth_token',
{
headers: { Authorization: 'your-api-key' },
params: { email: 'your-email@example.com' }
}
);
const token = response.data.token;
const socket = io('wss://realtime-data.xkcorp.com/realtimeSensorData', {
transports: ['websocket'],
auth: { token }
});
socket.on('connect', () => {
console.log('Socket connected.');
joinRoom(socket, 'buildingId'); // Replace with your actual buildingId
});
socket.on('connect_error', (err) => console.error('Connection Error:', err));
socket.on('disconnect', (reason) => console.warn('Disconnected:', reason));
// Receive all events
socket.onAny((event, data) => console.log(`Received event: ${event}`, data));
// Receive updates from one sensor
const serialNumber = 'serialNumber'; // Replace with the actual serial number
socket.on(serialNumber, (data) => console.log(`Data for ${serialNumber}:`, data));
} catch (error) {
console.error('Authentication or Connection failed:', error);
}
}
function joinRoom(socket, buildingId) {
socket.emit('joinRoom', buildingId);
}
connectSocket();
Step 3. Join a room
After connecting, subscribe by sending a joinRoom event with your building identifier: { "buildingId": "<your-building-id>" }
Step 4. Receive data
- All events:
socket.onAny((event, data) => { ... }) - One sensor:
socket.on(serialNumber, callback)
Reconnection and good practice
- The connection can drop during server restarts or network instability. Listen for
disconnectand reconnect with exponential backoff or a fixed delay, such as 3 seconds. - Refresh the token before its one-hour expiry.
- Store API keys and tokens securely and never expose them in client-side code.
- Log connect, message, and disconnect events for monitoring.
Data parameters: Presence_vital (application 41)
Using HR and RR values. Use HR only when stability_HR is 80 or higher, and use the breathing rate (BR) only when stability_BR is 80 or higher. Values received with a stability score below 80 are not reliable enough and should not be used.
| Parameter | Meaning | Format |
|---|---|---|
application | Application number (41) | |
start_date | Start time of the reading | |
createdAt | Time the record was created | |
serial | Sensor serial number | 12-character string |
presence | Whether a person is present | -1: booting, 0: vacant, 1: occupied |
BR | Breathing rate per minute. Use only when stability_BR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured breathing rate |
HR | Heart rate per minute. Use only when stability_HR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured heart rate |
movement_index | Measured movement in the space | Floating number from 0 upward |
stability_BR | Breathing stability score. Higher means a more reliable breathing rate reading. Also controls whether waveform is sent. | 0 to 100 |
stability_HR | Heart rate stability score. Higher means a more reliable heart rate reading. | 0 to 100 |
stability_move | Stability of breathing and heart rate readings based on movement. Less movement gives a higher value. | 0 to 100 |
version | Radar firmware version | XXYYZZ: version XX.YY.ZZ |
dwelltime | Duration of the most recent presence, in seconds | Floating number, 0 or higher |
Amplitude_BR | Reserved | |
Distance_BR | Distance at which breathing is detected | 0 to end range, in meters |
Variance_HR | Reserved | |
Variance_BR | Reserved | |
Region_Presence | Whether a person is present in the bed area | -1: booting, 0: vacant, 1: occupied |
dataCursor | Counter that increases by 10 per second | Integer, 0 or higher |
waveform | Respiratory waveform showing inhalation and exhalation. Professional plan only. Sent only when stability_BR is 80 or higher; otherwise the field is omitted. | 50 floating values covering the last 5 seconds, 10 per second |
Data parameters: SUHO (application 46)
| Parameter | Meaning | Format |
|---|---|---|
application | Application number (46) | |
start_date | Start time of the reading | |
createdAt | Time the record was created | |
serial | Sensor serial number | 12-character string |
presence | Whether a person is present | -1: booting, 0: vacant, 1: occupied |
BR | Breathing rate per minute. Use only when stability_BR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured breathing rate |
HR | Heart rate per minute. Use only when stability_HR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured heart rate |
movement_index | Measured movement in the space | Floating number from 0 upward |
stability_BR | Breathing stability score. Higher means a more reliable breathing rate reading. | 0 to 100 |
stability_HR | Heart rate stability score. Higher means a more reliable heart rate reading. | 0 to 100 |
stability_move | Stability of breathing and heart rate readings based on movement. Less movement gives a higher value. | 0 to 100 |
version | Radar firmware version | XXYYZZ: version XX.YY.ZZ |
dwelltime | Duration of the most recent presence, in seconds | Floating number, 0 or higher |
Amplitude_BR | Reserved | |
Distance_BR | Distance at which breathing is detected | 0 to end range, in meters |
Variance_HR | Reserved | |
Variance_BR | Reserved | |
Region_Presence | Whether a person is present in the bed area | -1: booting, 0: vacant, 1: occupied |
dataCursor | Counter that increases by 10 per second | Integer, 0 or higher |
USD_Alert_Flag | 1 when there is breathing only, with no movement, for more than 2 minutes 30 seconds | 0: no flag, 1: flag |
LongStay_Flag | 1 when presence continues for more than 8 minutes | 0: no flag, 1: flag |
Kardian Health Insights
For care providers and partners building their own services on real-time and summary data. One plan with the full feature set, API always included, and richer real-time fields such as awakeness, sleep flags, POBC, and 5-minute averages.
REST API
One plan. Every data point.
Insights includes the REST API in every subscription. Each region has its own server and documentation page; please use the one where your account is registered.
| Region | REST API documentation |
|---|---|
| US | XK Insights Public API, US |
| Korea and Japan | XK Insights Public API, Korea and Japan |
WebSocket API
Richer real-time data. Including awakeness.
Insights delivers real-time data through Socket.IO, with richer fields than the Kardian Dashboard, including awakeness, sleep flags, POBC, 5-minute averages, and Z-scores. The connection flow in the US and in Korea and Japan is the same as the Kardian WebSocket above: get a token, connect with socket.io-client, send joinRoom with the building identifier, then listen with socket.onAny or socket.on(serialNumber, ...).
Show the Insights WebSocket guide
Regional endpoints
| Region | Token endpoint (GET, header Authorization, query email) | WebSocket server |
|---|---|---|
| US | https://us-central1-xandar-kardian-production.cloudfunctions.net/api/token/external_auth_token | wss://realtime-data.xkcorp.com/realtimeSensorData |
| Korea and Japan | https://asia-northeast3-xandar-kardian-korea.cloudfunctions.net/api/token/external_auth_token | wss://realtime-socket-cr-56lv46iibq-du.a.run.app/realtimeSensorData |
Tokens are valid for one hour. In the US, the sample code in the Kardian Dashboard WebSocket guide (Platform 1) works as is. For Korea and Japan, replace the token URL and the server URL with the values above. Reconnection and security practices are the same as for the Kardian WebSocket.
Data parameters: Presence_vital (application 41)
Using HR and RR values. Use HR only when stability_HR is 80 or higher, and use the breathing rate (BR) only when stability_BR is 80 or higher. Values received with a stability score below 80 are not reliable enough and should not be used. The 5-minute averages (HR_5min, BR_5min) already apply this rule and can be used as is.
Insights sends all Professional-level fields, including POBC, sleep flags, awakeness, 5-minute averages, and Z-scores. If you are moving from the Kardian Dashboard, note that several field names differ from the Kardian WebSocket, for example movement instead of movement_index and duration_presence instead of dwelltime.
| Parameter | Meaning | Format |
|---|---|---|
start_date | Start time of the reading | |
createdAt | Time the record was created | |
application | Application number (41) | |
serial | Sensor serial number | 12-character string |
presence | Whether a person is present | -1: booting, 0: vacant, 1: occupied |
BR | Breathing rate per minute. Use only when stability_BR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured breathing rate |
HR | Heart rate per minute. Use only when stability_HR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured heart rate |
movement | Measured movement in the space | Floating number from 0 upward |
stability_BR | Breathing stability score. Higher means a more reliable breathing rate reading. Also controls whether waveform is sent. | 0 to 100 |
stability_HR | Heart rate stability score. Higher means a more reliable heart rate reading. | 0 to 100 |
stability_move | Stability of breathing and heart rate readings based on movement. Less movement gives a higher value. | 0 to 100 |
version | Radar firmware version | XXYYZZ: version XX.YY.ZZ |
dataCursor | Counter that increases by 10 per second | Integer, 0 or higher |
count_POBC_5min | Reserved | 0 to 288 |
count_POBC_day | Reserved | Integer, 0 or higher |
duration_presence | Duration of the most recent presence, in seconds | Floating number, 0 or higher |
amplitude_BR | Amplitude of the measured respiratory waveform | Float, 0 to 10 |
distance_BR | Distance at which breathing is detected | 0 to end range, in meters |
presence_region | Whether a person is present in the bed area | -1: booting, 0: vacant, 1: occupied |
POBC_BR | Deviation of the current breathing rate from recent history. Near 0 means little change; near -100 or 100 means significant change. | Float, -100 to 100 |
POBC_HR | Deviation of the current heart rate from recent history. Near 0 means little change; near -100 or 100 means significant change. | Float, -100 to 100 |
awakeness | Level of alertness. Above 0.88: awake (not asleep). Below 0.88: asleep, and the closer the value is to 0, the deeper the sleep. | Float, 0 to 1 |
auto_index | Reserved | |
duration_absence | Time since absence was first detected, in seconds | Floating number, 0 or higher |
duration_RRpoint_sustained | Reserved | |
flag_sleep | Sleep status | 0: awake, 1: asleep |
flag_moveduringsleep | Movement during sleep | 0: none, 1: movement detected during sleep |
flag_shallowbreathing | Shallow breathing during sleep | 0: none, 1: shallow breathing detected during sleep |
movement_5min | Average movement over the last 5 minutes | Floating number from 0 upward |
awakeness_5min | Average awakeness over the last 5 minutes. Interpreted the same way as awakeness (above 0.88 awake, below 0.88 asleep). | Float, 0 to 1 |
Z_BR_5min | Average Z_BR over the last 5 minutes | Floating number from 0 upward |
Z_HR_5min | Average Z_HR over the last 5 minutes | Floating number from 0 upward |
BR_5min | Average breathing rate over the last 5 minutes. Already calculated from readings with stability_BR of 80 or higher, so it can be used as is. | -1: no measurement due to large motion. Above 0: measured breathing rate |
HR_5min | Average heart rate over the last 5 minutes. Already calculated from readings with stability_HR of 80 or higher, so it can be used as is. | -1: no measurement due to large motion. Above 0: measured heart rate |
distance_BR_5min | Average distance_BR over the last 5 minutes | 0 to end range, in meters |
runtime_day | Days since the sensor was first activated | Integer, 0 or higher |
Z_BR | Z-score of the breathing rate: standard deviations from the recent mean | Floating number from 0 upward |
Z_HR | Z-score of the heart rate: standard deviations from the recent mean | Floating number from 0 upward |
waveform | Respiratory waveform showing inhalation and exhalation. Sent only when stability_BR is 80 or higher; otherwise the field is omitted. | 50 floating values covering the last 5 seconds, 10 per second |
device | Device information |
Data parameters: SUHO (application 46)
| Parameter | Meaning | Format |
|---|---|---|
start_date | Start time of the reading | |
createdAt | Time the record was created | |
application | Application number (46) | |
serial | Sensor serial number | 12-character string |
presence | Whether a person is present | -1: booting, 0: vacant, 1: occupied |
BR | Breathing rate per minute. Use only when stability_BR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured breathing rate |
HR | Heart rate per minute. Use only when stability_HR is 80 or higher. | -1: no measurement due to large motion. Above 0: measured heart rate |
movement | Measured movement in the space | Floating number from 0 upward |
stability_BR | Breathing stability score. Higher means a more reliable breathing rate reading. | 0 to 100 |
stability_HR | Heart rate stability score. Higher means a more reliable heart rate reading. | 0 to 100 |
stability_move | Stability of breathing and heart rate readings based on movement. Less movement gives a higher value. | 0 to 100 |
version | Radar firmware version | XXYYZZ: version XX.YY.ZZ |
dataCursor | Counter that increases by 10 per second | Integer, 0 or higher |
count_POBC_5min | Reserved | 0 to 288 |
count_POBC_day | Reserved | Integer, 0 or higher |
duration_presence | Duration of the most recent presence, in seconds | Floating number, 0 or higher |
amplitude_BR | Amplitude of the measured respiratory waveform | Float, 0 to 10 |
distance_BR | Distance at which breathing is detected | 0 to end range, in meters |
presence_region | Whether a person is present in the bed area | -1: booting, 0: vacant, 1: occupied |
flag_unconscious | 1 when there is breathing only, with no movement, for more than 2 minutes 30 seconds | 0: no flag, 1: flag |
flag_longstay | 1 when presence continues for more than 8 minutes | 0: no flag, 1: flag |
auto_index | Reserved | |
runtime_day | Days since the sensor was first activated | Integer, 0 or higher |
Getting started
Three steps. Then you are live.
- Confirm your platform and plan, and obtain your API key from your XK representative.
- Open the REST documentation for your platform and region, and try a simple read call to confirm access.
- Connect to the WebSocket API with a Socket.IO client and send
joinRoomwith your building identifier to receive real-time data.
For questions about the API or your plan, please contact your XK representative.