Xandar KardianAPI Guide

Kardian Dashboard and Kardian Health Insights

Your data, your systems. One guide for both platforms.

Xandar Kardian offers two platforms, the Kardian Dashboard and Kardian Health Insights. Each provides a REST API and a real-time WebSocket (Socket.IO) API. This guide shows which documentation applies to you and what data each one includes.

Platforms

Two platforms. Same sensors.

Kardian DashboardKardian Health Insights
Designed forCare facilities using PointClickCare (PCC), and remote patient monitoring in the USCare providers and partners building their own services on real-time and summary data
PlansLite, Standard, Professional, each with an API Only optionOne plan with the full feature set
PCC integrationIncludedNot available
APIREST API, plus WebSocket on Standard and ProfessionalREST API and WebSocket always included
Real-time dataHR, 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
RegionsUSUS, Korea and Japan
Platform 1 of 2

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.

PlanREST API documentationWebSocket API
Lite, Lite API OnlyXK Public API, LiteNot included
Standard, Standard API OnlyXK Public API, Standard and ProfessionalIncluded (see below)
Professional, Professional API OnlyXK Public API, Standard and ProfessionalIncluded, 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.

LiteStandardProfessional
Daily summary (REST)Daily HR and RR averages, daily POBC for HR and RRSame as LiteSame as Lite
Daily sleep (REST)Not includedDaily sleep score and sleep durationDaily sleep score and sleep duration
Averaged vital signs (REST)Not included5-minute HR, RR, and movement index averages, presence dwell timesSame as Standard
Alerts (REST webhooks)Not includedReal-time and daily alert webhooks, presence statusSame as Standard
Real-time and raw data (WebSocket)Not includedHR, RR, presence, movement index, stability scores, raw dataStandard data, plus the respiratory waveform
Account management (REST)Account, buildings, residents, patients, rooms (read)Full management: buildings, gateways, devices, residents, patients, roomsSame 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 groupLiteStandard and Professional
AccountIncludedIncluded, plus dashboard login token
Buildings, residents, patients, roomsReadRead, create, and update
Gateways and devicesNot includedRead, create, update, connection status, data collection on and off
Daily metrics (/sensorslog/daily-metrics/{serialNumber})Included, without sleep dataIncluded, with sleep score and duration
Daily reports, including PointClickCare (PCC) variantsNot includedIncluded
5-minute HR, RR, and movement index averagesNot includedIncluded
Presence dwell times and alertsNot includedIncluded

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.

URLhttps://us-central1-xandar-kardian-production.cloudfunctions.net/api/token/external_auth_token
MethodGET
HeaderAuthorization: your API key
Query parameteremail: 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 disconnect and 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.

ParameterMeaningFormat
applicationApplication number (41)
start_dateStart time of the reading
createdAtTime the record was created
serialSensor serial number12-character string
presenceWhether a person is present-1: booting, 0: vacant, 1: occupied
BRBreathing rate per minute. Use only when stability_BR is 80 or higher.-1: no measurement due to large motion. Above 0: measured breathing rate
HRHeart 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_indexMeasured movement in the spaceFloating number from 0 upward
stability_BRBreathing stability score. Higher means a more reliable breathing rate reading. Also controls whether waveform is sent.0 to 100
stability_HRHeart rate stability score. Higher means a more reliable heart rate reading.0 to 100
stability_moveStability of breathing and heart rate readings based on movement. Less movement gives a higher value.0 to 100
versionRadar firmware versionXXYYZZ: version XX.YY.ZZ
dwelltimeDuration of the most recent presence, in secondsFloating number, 0 or higher
Amplitude_BRReserved
Distance_BRDistance at which breathing is detected0 to end range, in meters
Variance_HRReserved
Variance_BRReserved
Region_PresenceWhether a person is present in the bed area-1: booting, 0: vacant, 1: occupied
dataCursorCounter that increases by 10 per secondInteger, 0 or higher
waveformRespiratory 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)

ParameterMeaningFormat
applicationApplication number (46)
start_dateStart time of the reading
createdAtTime the record was created
serialSensor serial number12-character string
presenceWhether a person is present-1: booting, 0: vacant, 1: occupied
BRBreathing rate per minute. Use only when stability_BR is 80 or higher.-1: no measurement due to large motion. Above 0: measured breathing rate
HRHeart 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_indexMeasured movement in the spaceFloating number from 0 upward
stability_BRBreathing stability score. Higher means a more reliable breathing rate reading.0 to 100
stability_HRHeart rate stability score. Higher means a more reliable heart rate reading.0 to 100
stability_moveStability of breathing and heart rate readings based on movement. Less movement gives a higher value.0 to 100
versionRadar firmware versionXXYYZZ: version XX.YY.ZZ
dwelltimeDuration of the most recent presence, in secondsFloating number, 0 or higher
Amplitude_BRReserved
Distance_BRDistance at which breathing is detected0 to end range, in meters
Variance_HRReserved
Variance_BRReserved
Region_PresenceWhether a person is present in the bed area-1: booting, 0: vacant, 1: occupied
dataCursorCounter that increases by 10 per secondInteger, 0 or higher
USD_Alert_Flag1 when there is breathing only, with no movement, for more than 2 minutes 30 seconds0: no flag, 1: flag
LongStay_Flag1 when presence continues for more than 8 minutes0: no flag, 1: flag
Platform 2 of 2

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.

RegionREST API documentation
USXK Insights Public API, US
Korea and JapanXK 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

RegionToken endpoint (GET, header Authorization, query email)WebSocket server
UShttps://us-central1-xandar-kardian-production.cloudfunctions.net/api/token/external_auth_tokenwss://realtime-data.xkcorp.com/realtimeSensorData
Korea and Japanhttps://asia-northeast3-xandar-kardian-korea.cloudfunctions.net/api/token/external_auth_tokenwss://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.

ParameterMeaningFormat
start_dateStart time of the reading
createdAtTime the record was created
applicationApplication number (41)
serialSensor serial number12-character string
presenceWhether a person is present-1: booting, 0: vacant, 1: occupied
BRBreathing rate per minute. Use only when stability_BR is 80 or higher.-1: no measurement due to large motion. Above 0: measured breathing rate
HRHeart rate per minute. Use only when stability_HR is 80 or higher.-1: no measurement due to large motion. Above 0: measured heart rate
movementMeasured movement in the spaceFloating number from 0 upward
stability_BRBreathing stability score. Higher means a more reliable breathing rate reading. Also controls whether waveform is sent.0 to 100
stability_HRHeart rate stability score. Higher means a more reliable heart rate reading.0 to 100
stability_moveStability of breathing and heart rate readings based on movement. Less movement gives a higher value.0 to 100
versionRadar firmware versionXXYYZZ: version XX.YY.ZZ
dataCursorCounter that increases by 10 per secondInteger, 0 or higher
count_POBC_5minReserved0 to 288
count_POBC_dayReservedInteger, 0 or higher
duration_presenceDuration of the most recent presence, in secondsFloating number, 0 or higher
amplitude_BRAmplitude of the measured respiratory waveformFloat, 0 to 10
distance_BRDistance at which breathing is detected0 to end range, in meters
presence_regionWhether a person is present in the bed area-1: booting, 0: vacant, 1: occupied
POBC_BRDeviation 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_HRDeviation of the current heart rate from recent history. Near 0 means little change; near -100 or 100 means significant change.Float, -100 to 100
awakenessLevel 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_indexReserved
duration_absenceTime since absence was first detected, in secondsFloating number, 0 or higher
duration_RRpoint_sustainedReserved
flag_sleepSleep status0: awake, 1: asleep
flag_moveduringsleepMovement during sleep0: none, 1: movement detected during sleep
flag_shallowbreathingShallow breathing during sleep0: none, 1: shallow breathing detected during sleep
movement_5minAverage movement over the last 5 minutesFloating number from 0 upward
awakeness_5minAverage 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_5minAverage Z_BR over the last 5 minutesFloating number from 0 upward
Z_HR_5minAverage Z_HR over the last 5 minutesFloating number from 0 upward
BR_5minAverage 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_5minAverage 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_5minAverage distance_BR over the last 5 minutes0 to end range, in meters
runtime_dayDays since the sensor was first activatedInteger, 0 or higher
Z_BRZ-score of the breathing rate: standard deviations from the recent meanFloating number from 0 upward
Z_HRZ-score of the heart rate: standard deviations from the recent meanFloating number from 0 upward
waveformRespiratory 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
deviceDevice information

Data parameters: SUHO (application 46)

ParameterMeaningFormat
start_dateStart time of the reading
createdAtTime the record was created
applicationApplication number (46)
serialSensor serial number12-character string
presenceWhether a person is present-1: booting, 0: vacant, 1: occupied
BRBreathing rate per minute. Use only when stability_BR is 80 or higher.-1: no measurement due to large motion. Above 0: measured breathing rate
HRHeart rate per minute. Use only when stability_HR is 80 or higher.-1: no measurement due to large motion. Above 0: measured heart rate
movementMeasured movement in the spaceFloating number from 0 upward
stability_BRBreathing stability score. Higher means a more reliable breathing rate reading.0 to 100
stability_HRHeart rate stability score. Higher means a more reliable heart rate reading.0 to 100
stability_moveStability of breathing and heart rate readings based on movement. Less movement gives a higher value.0 to 100
versionRadar firmware versionXXYYZZ: version XX.YY.ZZ
dataCursorCounter that increases by 10 per secondInteger, 0 or higher
count_POBC_5minReserved0 to 288
count_POBC_dayReservedInteger, 0 or higher
duration_presenceDuration of the most recent presence, in secondsFloating number, 0 or higher
amplitude_BRAmplitude of the measured respiratory waveformFloat, 0 to 10
distance_BRDistance at which breathing is detected0 to end range, in meters
presence_regionWhether a person is present in the bed area-1: booting, 0: vacant, 1: occupied
flag_unconscious1 when there is breathing only, with no movement, for more than 2 minutes 30 seconds0: no flag, 1: flag
flag_longstay1 when presence continues for more than 8 minutes0: no flag, 1: flag
auto_indexReserved
runtime_dayDays since the sensor was first activatedInteger, 0 or higher

Getting started

Three steps. Then you are live.

  1. Confirm your platform and plan, and obtain your API key from your XK representative.
  2. Open the REST documentation for your platform and region, and try a simple read call to confirm access.
  3. Connect to the WebSocket API with a Socket.IO client and send joinRoom with your building identifier to receive real-time data.

For questions about the API or your plan, please contact your XK representative.