9 HealthKit Lab and Test Result Types
9 identifiers · read from Apple’s documentation on 2026-08-28
Apple files nine identifiers under Lab and test results, and the group is the best evidence in HealthKit that these headings are editorial. All nine are quantity types. Eight date to iOS 8.0 and one, insulinDelivery, to 11.0, which makes it the oldest and most static group on this page: its newest member arrived in iOS 11.0.
Read the membership and the heading stops fitting. bloodGlucose, forcedExpiratoryVolume1, forcedVitalCapacity, and peakExpiratoryFlowRate are recognisably clinical measurements. insulinDelivery and inhalerUsage are records of treatment rather than results of a test. electrodermalActivity measures skin conductance. And numberOfTimesFallen counts how many times the user fell, which is not a lab value by any reading, and would sit more naturally beside the gait identifiers. If you are building a taxonomy on top of Apple's group names, this is the group that breaks it. Query by identifier, not by heading.
The aggregation split is where the group differs from most: six identifiers state discrete and three state cumulative. The cumulative three are inhalerUsage, which measures the number of puffs taken from an inhaler, insulinDelivery, which measures the amount of insulin delivered, and numberOfTimesFallen. All three are totals over a window, so a query returning one number for a day is doing exactly what it should. The other six are readings at a moment. Getting this backwards inside a single group is easier than getting it backwards across the framework, because one rollup job written for "lab results" will run over all nine. The sum-or-average split covers how quietly that fails.
Unit families here are more varied than the count of nine suggests: conductance, count, international, mass/volume, percent, volume, and volume/time. Seven families for nine identifiers. insulinDelivery sits under international, a family of its own that no generic mass or volume conversion applies to. bloodGlucose is mass/volume, and the dataset records the family rather than a canonical unit, which is the correct level of detail: the unit is something you specify when you read, and it is the one field in a glucose integration nobody should be inferring. The blood glucose API reference covers what that looks like on each platform. forcedExpiratoryVolume1 and forcedVitalCapacity are both volume while peakExpiratoryFlowRate is volume/time, so the three spirometry measurements are three separate identifiers with nothing in the store binding them into one result.
Documentation depth is inverted from what you would expect. Four identifiers, the two spirometry volumes plus peakExpiratoryFlowRate and inhalerUsage, carry fifteen words of discussion each. insulinDelivery carries sixteen. numberOfTimesFallen, the member that fits the heading least, carries 142, the most in the group by a distance.
No identifier in this group has an Android counterpart verified in this site's cross-platform matrix. All nine are Apple-only until a mapping is verified.
One thing this page will not do is tell you what any of these values means. A glucose reading, a spirometry result, and an insulin dose all have clinical interpretations, and none of them belong in an integration reference. What does belong here is the handling consequence: data of this kind changes your obligations, not only your schema. Read is fitness data PHI before you decide where these samples get stored and who on your team can query them.
Every count, unit family, aggregation style, and availability version above was parsed from Apple's developer documentation on 2026-08-28. The complete per-identifier table sits on the identifier reference.
The 9 identifiers in lab and test results
Every field is joined from Apple’s documentation. Aggregation style and unit family are the two Apple states only in prose — where its wording does not state one, this table says so rather than guessing. Android names appear only where the mapping is verified on both platforms.
| Identifier | What it is | Aggregate | Unit | iOS | Android |
|---|---|---|---|---|---|
| bloodGlucoseHKQuantityTypeIdentifierBloodGlucose | A quantity sample type that measures the user’s blood glucose level. | .discreteAverage | mass/volume | 8.0 | not verified |
| electrodermalActivityHKQuantityTypeIdentifierElectrodermalActivity | A quantity sample type that measures electrodermal activity. | .discreteAverage | conductance | 8.0 | not verified |
| forcedExpiratoryVolume1HKQuantityTypeIdentifierForcedExpiratoryVolume1 | A quantity sample type that measures the amount of air that can be forcibly exhaled from the lungs during the first second of a forced exhalation. | .discreteAverage | volume | 8.0 | not verified |
| forcedVitalCapacityHKQuantityTypeIdentifierForcedVitalCapacity | A quantity sample type that measures the amount of air that can be forcibly exhaled from the lungs after taking the deepest breath possible. | .discreteAverage | volume | 8.0 | not verified |
| inhalerUsageHKQuantityTypeIdentifierInhalerUsage | A quantity sample type that measures the number of puffs the user takes from their inhaler. | .cumulativeSum | count | 8.0 | not verified |
| insulinDeliveryHKQuantityTypeIdentifierInsulinDelivery | A quantity sample that measures the amount of insulin delivered. | .cumulativeSum | international | 11.0 | not verified |
| numberOfTimesFallenHKQuantityTypeIdentifierNumberOfTimesFallen | A quantity sample type that measures the number of times the user fell. | .cumulativeSum | count | 8.0 | not verified |
| peakExpiratoryFlowRateHKQuantityTypeIdentifierPeakExpiratoryFlowRate | A quantity sample type that measures the user’s maximum flow rate generated during a forceful exhalation. | .discreteAverage | volume/time | 8.0 | not verified |
| peripheralPerfusionIndexHKQuantityTypeIdentifierPeripheralPerfusionIndex | A quantity sample type that measures the user’s peripheral perfusion index. | .discreteAverage | percent | 8.0 | not verified |
What will bite you
One group, two aggregation styles. Six identifiers are discrete and three are cumulative. A single rollup written against the group as a whole will be wrong for inhalerUsage, insulinDelivery, and numberOfTimesFallen, or wrong for the other six, depending on which way it was written. Nothing raises an error either way, because once the samples are rows in your database no column remembers which kind of quantity it holds. Branch per identifier.
numberOfTimesFallen is hiding here. It counts falls, it is cumulative, and it lives under a heading nobody searches when building anything gait-related. Two consequences follow. If you are enumerating fall data, searching the mobility group will not find it. And if you are enumerating this group for a clinical-data policy, you will pull in a type that is not a lab result at all.
The unit family is not a unit. bloodGlucose is recorded as mass/volume and peakExpiratoryFlowRate as volume/time. Those are dimensions, not the units the value will arrive in. A read specifies its unit, and a value rendered against an assumed one can be wrong by a large factor while still looking plausible on a chart. Store the unit you asked for alongside the number.
Nothing is verified on Android. No identifier in this group has a confirmed Health Connect counterpart in the matrix, so any feature resting on this group is single-platform until that changes.
Questions
- Which HealthKit types are in the lab and test results group?
- Nine quantity types: bloodGlucose, electrodermalActivity, forcedExpiratoryVolume1, forcedVitalCapacity, peakExpiratoryFlowRate, peripheralPerfusionIndex, inhalerUsage, insulinDelivery, and numberOfTimesFallen. Eight of them shipped in iOS 8.0 and insulinDelivery followed in iOS 11.0. There are no category types in the group, so every member carries a unit family and a stated aggregation style, and seven unit families cover the nine identifiers.
- Why is numberOfTimesFallen filed under lab results?
- Apple's group headings are editorial rather than structural, and this is the clearest example. A count of falls is not a test result, and it would sit more naturally with the gait identifiers. The practical lesson is to query the dataset by identifier rather than trusting a heading to define a category for you.
- Are lab and test result types cumulative or discrete?
- Both, which is what makes the group awkward. Six state discrete aggregation and three state cumulative: inhaler usage, insulin delivery, and number of times fallen. A rollup that treats the whole group one way is wrong for part of it, and neither mistake raises an error once the samples are in your own database.
All 9 identifiers above were read from Apple’s documentation on 2026-08-28. See the full 240-identifier table for every group at once, or the datasets for the same data as JSON and CSV. Apple’s abstracts are quoted for identification; the grouping, the aggregation split and the cross-platform mapping are AIFitnessAPI’s.