HealthKit ↔ Health Connect: The Data-Type Reference
If you’re building the same health feature on iOS and Android, you need the matching type on each platform — and to know where they quietly disagree. Here are 10 common metrics side by side, checked against Apple’s and Google’s own docs.
| Metric | Apple HealthKit (iOS) | Health Connect (Android) |
|---|---|---|
| Heart rate | HKQuantityTypeIdentifier.heartRate, .restingHeartRate | HeartRateRecord, RestingHeartRateRecordWatch out: Both expose samples plus a separate resting value — don't derive resting yourself. |
| HRV | HKQuantityTypeIdentifier.heartRateVariabilitySDNN | HeartRateVariabilityRmssdRecordWatch out: The big one: Apple stores SDNN, Health Connect stores RMSSD. They are different measures and are not interconvertible — do not normalize one into the other. |
| VO2 max | HKQuantityTypeIdentifier.vo2Max | Vo2MaxRecordWatch out: An estimate on both platforms, not a lab measurement. Health Connect tags a measurement method. |
| Blood oxygen | HKQuantityTypeIdentifier.oxygenSaturation | OxygenSaturationRecordWatch out: The type existing doesn't mean data exists — SpO2 is device-gated, and Apple Watch availability in the US has been subject to litigation. Verify current status. |
| Sleep | HKCategoryTypeIdentifier.sleepAnalysis (values: inBed, awake, asleepCore, asleepDeep, asleepREM, asleepUnspecified) | SleepSessionRecord (carries stages)Watch out: Stage vocabularies differ and stages are estimated, not measured. Apple's .asleep is deprecated in favour of the specific stages. |
| Steps | HKQuantityTypeIdentifier.stepCount (CMPedometer for live counts) | StepsRecord, StepsCadenceRecordWatch out: De-duplicate: phone and watch both write steps. On Android, from the June 2026 update on-device steps are attributed to a per-device Synthetic Package Name — read it via getCurrentDeviceDataSource(), never hardcode it. |
| Workouts | HKWorkout (HKWorkoutBuilder) | ExerciseSessionRecord, PlannedExerciseSessionRecordWatch out: Activity-type taxonomies differ between platforms — map them explicitly rather than by name. |
| GPS route | HKWorkoutRoute (array of CLLocation), HKWorkoutRouteQuery | ExerciseRoute with ExerciseRoute.LocationWatch out: Health Connect gates routes behind their own permission (READ_EXERCISE_ROUTES) and restricts background reads of other apps' routes. |
| Calories | HKQuantityTypeIdentifier.activeEnergyBurned, .basalEnergyBurned | ActiveCaloriesBurnedRecord, TotalCaloriesBurnedRecordWatch out: Modelled estimates, not measurements. Note the asymmetry: Apple splits active/basal, Android offers active and total — don't add active to total. |
| Body composition | HKQuantityTypeIdentifier.bodyMass, .bodyFatPercentage, .leanBodyMass, .bodyMassIndex | WeightRecord, BodyFatRecord, LeanBodyMassRecord, BoneMassRecord, BodyWaterMassRecord, BasalMetabolicRateRecordWatch out: The store holds it, but something has to write it — usually a smart scale or manual entry. Body fat is a bioimpedance estimate. |
Apple HealthKit
- On-device on iPhone and Apple Watch — there is no cloud or server endpoint to call.
- Authorization is per data type, requested with requestAuthorization(toShare:read:).
- Your app cannot tell whether a read permission was granted or denied — a denied read simply returns only the samples your own app wrote. Design for empty results.
- Gate availability on HKHealthStore.isHealthDataAvailable().
Android Health Connect
- On-device too — the client library talks to the Health Connect APK over IPC, not to a server.
- Read windows are limited: Android 14+ allows 30 days of other apps' data (unlimited for your own); Android 13 and lower caps all reads at 30 days.
- From the June 2026 update, on-device steps carry a device-specific Synthetic Package Name instead of the generic "android" origin. Filter for both to catch historical and new records.
Sources
Every row above was checked against Apple’s and Google’s own documentation as of 2026. Type identifiers change — confirm against the live docs before you build.
The three things that actually bite
HRV is not one metric.Apple gives you SDNN, Health Connect gives you RMSSD. They’re computed differently and don’t convert, so a single normalized “hrv” column in your database will silently mix two incompatible measures. Keep the platform and measure with the value — the HRV guide goes deeper.
Neither store has a server API. Both are on-device, so there’s no backend integration to write — your app reads locally and syncs. Teams routinely plan a server-to-server integration and discover this late.
Permission and presence are different problems. On iOS you cannot tell whether a read was denied or simply had no data. On Android, read windows are capped, routes need their own permission, and from the June 2026 update on-device steps carry a per-device synthetic package name you must resolve at runtime rather than hardcode.
Where to go next
Setting one up? The HealthKit and Health Connect integration guides walk the wiring. Deciding between them — or whether you need both — is covered in HealthKit vs Health Connect and, if you’re adding a second platform, adding Android to a HealthKit app. For what each metric means and whether it’s measured or estimated, see health data by metric.
Why only these two platforms?
Because these are the rows we could verify. A reference table is only worth publishing if its cells are actually checked against primary sources, and every entry above comes from Apple’s or Google’s own documentation. We’d rather ship a narrow table you can trust than a wide one padded with guesses. For cloud providers, the per-metric guides and head-to-head comparisons cover what each one exposes.
Frequently asked questions
- Can I map HealthKit HRV to Health Connect HRV?
- Not directly. Apple stores heart-rate variability as SDNN (HKQuantityTypeIdentifier.heartRateVariabilitySDNN) while Health Connect stores RMSSD (HeartRateVariabilityRmssdRecord). SDNN and RMSSD are different calculations over the interval series and are not interconvertible, so treating them as one normalized 'HRV' field will produce values that aren't comparable between your iOS and Android users. Store the platform and the measure alongside the number.
- Can I read HealthKit or Health Connect from my server?
- No. Both are on-device stores, not cloud APIs — there is no server endpoint to call. Your app reads them on the device with the user's permission and syncs to your backend itself. If you need server-to-server access to user health data, you need a cloud provider API or a health-data aggregator instead.
- Does a type existing mean the data will be there?
- No, and this trips up a lot of integrations. These types are containers — something still has to write to them. Blood oxygen needs a device that measures SpO2, body composition usually needs a smart scale or manual entry, and on iOS a denied read permission is indistinguishable from an empty result, because HealthKit deliberately doesn't tell your app that read access was refused. Always design for the empty case.
A free reference from AIFitnessAPI. Independent and not sponsored — please cite or link if you find it useful.