Summaries
Summaries are daily aggregates computed by the SDK from the raw metrics. Each summary covers one day and holds both day-level totals — total steps, average heart rate — and a list of slots, which are periodic buckets within that day.
The slot length is set by slotsIntervalSecs when you initialise the Data SDK; see Data SDK configuration. With a 10-minute slot interval, a day's summary carries slots for 00:00–00:10, 00:10–00:20, and so on, each averaging the raw metrics in that window.
Reading summaries
Each summary has a repository on the Data SDK manager:
val manager = DataSdk.getInstance().getManager()
manager.stepsSummaryRepository.getByDate("2026-07-21") { summary ->
Log.d("Corsano-SDK", "Steps today: ${summary?.stepCount}")
}
| Model | Repository |
|---|---|
StepsSummaryModel | stepsSummaryRepository |
HeartRateSummaryModel | heartRateSummaryRepository |
RespirationSummaryModel | respirationSummaryRepository |
SpO2SummaryModel | spo2SummaryRepository |
TemperatureSummaryModel | temperatureSummaryRepository |
SleepSummaryModel | sleepSummaryRepository |
MetricBloodPressureSummary | bloodPressureSummaryRepository |
EmographySummaryModel | emographySummaryRepository |
Repository methods
Every summary repository exposes the same surface. Results arrive through a callback.
| Method | Parameters | Delivers |
|---|---|---|
getByDate(date, result) | date: String — "yyyy-MM-dd" | T? |
getByTimestampRange(start, end, result) | start: Long, end: Long | Array<T>? |
getAll(result) | — | Array<T>? |
deleteByDate(date, onSuccess, onError) | date: String | — |
deleteByTimestampRange(start, end, onSuccess, onError) | start: Long, end: Long | — |
deleteAll(onSuccess, onError) | — | — |
onSuccess and onError are optional. Note the difference from the metric repositories, which are keyed by timestamp: summaries are fetched by date string.
To be notified when a summary changes rather than polling for it, use the value updaters — see Data events.
Field conventions
serverDateis the primary key on every summary except blood pressure: the local day, formatted"yyyy-MM-dd".startTimestamp/endTimestampare UTC milliseconds, bounding the day — midnight of the day, and midnight of the day after.- Slot
timestampis UTC milliseconds; slotdateis the matching local time, formattedyyyy-MM-dd'T'HH:mm:ss.SSSXXX. uuidis present on most models but not used by the SDK.- Quality fields run 0–4, where 0 is unusable and 4 is very good. See Quality.
Steps
StepsSummaryModel
| Field | Type | Description |
|---|---|---|
serverDate | String | Local day, primary key |
stepCount | Int | Total steps for the day |
stepDistance | Float | Distance in metres, estimated from the step count assuming a height of 175 cm |
stepCalories | Int | Total calories for the day (active + rest) in kcal |
goalStepPercentage | Int | Percentage against a 10 000-step goal. 3 000 steps gives 30 |
startTimestamp | Long | Midnight of the day, UTC ms |
endTimestamp | Long | Midnight of the following day, UTC ms |
stepsSlots | RealmList<StepsSlotModel> | Per-slot breakdown |
uuid | String | Not used |
moveEveryHour | Int | Deprecated — always zero |
workoutsCount | Int | Deprecated — always zero |
Note:
stepDistanceassumes a fixed 175 cm height rather than the height on the user profile, andgoalStepPercentageis computed against a fixed 10 000-step goal. Neither is configurable.
StepsSlotModel
| Field | Type | Description |
|---|---|---|
timestamp | Long | Slot start, UTC ms, primary key |
date | String | Local date of the slot |
stepCount | Int | Steps in the slot |
energyExp | Double | Energy expenditure in kcal (active + passive) |
speed | Double? | Speed in m/s |
activityType | Int? | 0 UNSPECIFIED, 1 OTHER, 2 WALK, 4 RUN, 6 CYCLE, 7 REST |
Heart rate
HeartRateSummaryModel
| Field | Type | Description |
|---|---|---|
serverDate | String | Local day, primary key |
avgDailyHeartRate | Int | Average heart rate across the day |
maxDailyHeartRate | Int | Highest heart rate of the day |
restDailyHeartRate | Int | Resting heart rate of the day |
restHeartRateTime | Int | Minutes in the rest zone |
warmUpHeartRateTime | Int | Minutes in the warm-up zone |
fatBurnHeartRateTime | Int | Minutes in the fat-burn zone |
enduranceHeartRateTime | Int | Minutes in the endurance zone |
performanceHeartRateTime | Int | Minutes in the performance zone |
maxHeartRateTime | Int | Minutes in the maximum zone |
startTimestamp | Long | Midnight of the day, UTC ms |
endTimestamp | Long | Midnight of the following day, UTC ms |
heartRateSlots | RealmList<HeartRateSlotModel> | Per-slot breakdown |
synced | Boolean | Internal sync flag |
uuid | String | Not used |
allActiveTime | Int | Always zero — the SDK never populates it |
dailyPercent | Int? | Always null — the SDK never populates it |
Heart rate zones
The six *Time fields are durations in minutes, one per zone. Zone boundaries are derived from the wearer's age:
maxHeartRate = 220 - age
| Field | Heart rate range |
|---|---|
restHeartRateTime | below 50% of maxHeartRate |
warmUpHeartRateTime | 50% – 60% |
fatBurnHeartRateTime | 60% – 70% |
enduranceHeartRateTime | 70% – 80% |
performanceHeartRateTime | 80% – 90% |
maxHeartRateTime | above 90% |
Only raw metrics where the bracelet was worn and the heart rate quality was above 0 are counted; everything else is skipped. The age comes from the user profile, so set it — see User Profile.
Warning: The counted samples are divided by a fixed factor of 6 to convert them to minutes, which assumes raw metrics arrive every 10 seconds. The divisor does not adapt to the configured sampling rate, so these durations are only accurate on a 10-second interval. See Set Sampling rate.
HeartRateSlotModel
| Field | Type | Description |
|---|---|---|
timestamp | Long | Slot start, UTC ms, primary key |
date | String | Local date of the slot |
bpm | Int? | Average heart rate over the slot |
bpm_q | Int? | Average heart rate quality [0-4] |
Respiration
RespirationSummaryModel
| Field | Type | Description |
|---|---|---|
serverDate | String | Local day, primary key |
average | Float | Average respiration rate for the day, breaths/min |
slots | RealmList<RespirationSlotModel> | Per-slot breakdown |
startTimestamp | Long | Midnight of the day, UTC ms |
endTimestamp | Long | Midnight of the following day, UTC ms |
uuid | String | Not used |
RespirationSlotModel
| Field | Type | Description |
|---|---|---|
timestamp | Long | Slot start, UTC ms, primary key |
date | String | Local date of the slot |
rate | Float | Average respiration rate over the slot, breaths/min |
quality | Float | Average quality [0-4]. Note this is a Float, unlike most quality fields |
SpO2
SpO2SummaryModel
| Field | Type | Description |
|---|---|---|
serverDate | String | Local day, primary key |
average | Int | Average SpO2 for the day |
slots | RealmList<Spo2SlotModel> | Per-slot breakdown |
startTimestamp | Long | Midnight of the day, UTC ms |
endTimestamp | Long | Midnight of the following day, UTC ms |
uuid | String | Not used |
Spo2SlotModel
| Field | Type | Description |
|---|---|---|
timestamp | Long | Slot start, UTC ms, primary key |
date | String | Local date of the slot |
value | Int? | Average SpO2 over the slot |
quality | Int? | Average quality [0-4]. Values 103–106 carry a specific meaning — see Quality |
Temperature
TemperatureSummaryModel
| Field | Type | Description |
|---|---|---|
serverDate | String | Local day, primary key |
average1 | Float | Daily average of temp1 |
average2 | Float | Daily average of temp2 |
slots | RealmList<TemperatureSlotModel> | Per-slot breakdown |
startTimestamp | Long | Midnight of the day, UTC ms |
endTimestamp | Long | Midnight of the following day, UTC ms |
uuid | String | Not used |
TemperatureSlotModel
| Field | Type | Description |
|---|---|---|
timestamp | Long | Slot start, UTC ms, primary key |
date | String | Local date of the slot |
temp1 | Float | B2: core body temperature in °C |
temp2 | Float | B1: skin temperature in °C. On B2, skin temperature at night |
As with MetricTemperature, temp1 and temp2 mean different things depending on the bracelet.
Sleep
SleepSummaryModel
Unlike the other summaries, a sleep summary covers a night, not a calendar day. Its serverDate is the day the sleep session ended.
| Field | Type | Description |
|---|---|---|
serverDate | String | Day the sleep session ended, primary key |
date | Date | The same day as a Date object |
sleepDuration | Int | Total sleep in seconds — REM + light + deep. Excludes awake time |
remTime | Int | Seconds in REM sleep |
lightTime | Int | Seconds in light sleep |
deepTime | Int | Seconds in deep sleep |
awakeTime | Int | Seconds awake during the session |
sleepNeedDuration | Int | Target sleep in seconds |
performance | Int | sleepDuration / sleepNeedDuration × 100, as a percentage |
tranquility | Int | Number of wake-ups during the night, not a score |
goalSleepPercentage | Int | Percentage of the sleep goal reached |
startTimestamp | Long? | First slot of the session, UTC ms |
endTimestamp | Long? | Last slot of the session, UTC ms |
sleepSlots | RealmList<SleepSlotModel> | Per-slot sleep states |
slotDurationSeconds | Int | Computed: seconds covered by one slot, derived from the first two slots |
uuid | String | Not used |
Note: Despite its name,
tranquilityis a count of wake-ups. A higher value means a more disturbed night, not a calmer one.
Warning:
sleepNeedDurationis currently hard-coded to 7 hours (25 200 seconds). ThesleepGoalMinutes,sleepCatchUpMinutesandsleepIntensityMinutesvalues in Sleep Settings are not applied to it, soperformanceandgoalSleepPercentageare computed against 7 hours regardless of what you configure.
For how sessions are detected and processed, see Sleep processing.
SleepSlotModel
| Field | Type | Description |
|---|---|---|
timestamp | Long | Slot start, UTC ms, primary key |
startDate | String | Local start time of the slot |
endDate | String | Local end time of the slot |
sleepState | Int | Raw state value |
sleepType | SleepType | Computed: sleepState mapped to the enum below |
enum class SleepType(var value: Int) {
NONE(0),
AWAKE(1),
LIGHT(2),
DEEP(3),
REM(4)
}
Prefer reading sleepType over sleepState — the numeric values are not in a natural order, so comparing sleepState directly is misleading.
Blood pressure
Produced by NIBP. See NIBP for calibration and measurement.
MetricBloodPressureSummary
| Field | Type | Description |
|---|---|---|
startTimestamp | Long | Start of the period, UTC ms — primary key |
endTimestamp | Long | End of the period, UTC ms |
serverDate | String | Local day |
averageSys | Int? | Average systolic pressure |
averageDia | Int? | Average diastolic pressure |
maxDaySys | Int? | Highest systolic reading of the day |
maxDayDia | Int? | Highest diastolic reading of the day |
minDaySys | Int? | Lowest systolic reading of the day |
minDayDia | Int? | Lowest diastolic reading of the day |
slots | RealmList<MetricBloodPressureSummarySlot> | Per-slot breakdown |
Note: This is the one summary whose primary key is
startTimestamprather thanserverDate, and it carries nouuid. Its slot interval is governed bynibpSlotsIntervalSecs, which defaults to 2 hours with a 30-minute minimum — not byslotsIntervalSecs.
MetricBloodPressureSummarySlot
| Field | Type | Description |
|---|---|---|
startTimestamp | Long | Slot start, UTC ms, primary key |
endTimestamp | Long | Slot end, UTC ms |
date | String | Local start time of the slot |
endDate | String | Local end time of the slot |
systolicPressure | Int? | Systolic pressure for the slot |
diastolicPressure | Int? | Diastolic pressure for the slot |
EmographySummaryModel (B2 only)
EmoGraphy — also called EDA or stress data. Only produced when EmoGraphy is enabled; see Stress data.
| Field | Type | Description |
|---|---|---|
serverDate | String | Local day, primary key |
stressLevelSkinConductanceAvg | Int | Daily average stress level from skin conductance [0-1000] |
slots | RealmList<EmographySlotModel> | Per-slot breakdown |
startTimestamp | Long | Midnight of the day, UTC ms |
endTimestamp | Long | Midnight of the following day, UTC ms |
uuid | String | Not used |
Note: The day-level summary carries only the skin-conductance average. Cognitive zone values exist per slot only.
EmographySlotModel (B2 only)
| Field | Type | Description |
|---|---|---|
timestamp | Long | Slot start, UTC ms, primary key |
date | String | Local date of the slot |
cognitiveZone | Int | Cognitive zone [0-3]: 0 undefined, 1 under-stimulated, 2 balanced, 3 over-stimulated |
cognitiveZoneQ | Int | Quality of the cognitive zone [0-4] |
predictiveCZ | Int | Predicted cognitive zone [0-3] |
predictiveCZTransitionTime | Int | Minutes until the predicted transition [0-65535] |
czHour | Int | Cognitive zone one hour ahead [0-3] |
cortisolContribution | Long | Cortisol contribution |
stressLevelSkinConductance | Int | Stress level from skin conductance [0-1000] |
stressLevelSkinConductanceQ | Int | Quality of the skin conductance value [0-4] |
The slot fields mirror MetricEmography.