---
title: "Running Metrics API: Speed, Power, Stride Length and Running Form Data"
canonical: "https://aifitnessapi.com/data/running-metrics-api"
cluster: "Health Data"
primary_query: "running metrics api"
last_reviewed: "2026-10-18"
description: "Running speed, power and form in HealthKit, Wear OS, Health Connect and Bluetooth RSC: which platforms have stride, oscillation and ground contact time."
publisher: "AIFitnessAPI — independent, not sponsored"
cite_as: "\"Running Metrics API: Speed, Power, Stride Length and Running Form Data\", AIFitnessAPI, https://aifitnessapi.com/data/running-metrics-api"
---

# Running Metrics API: Speed, Power, Stride Length and Running Form Data

> Running form data is mostly an Apple and Wear OS story. HealthKit has five discrete running types from iOS 16.0, runningSpeed, runningPower, runningStrideLength, runningVerticalOscillation and runningGroundContactTime; Wear OS Health Services has SPEED, PACE and VERTICAL_RATIO with their statistics, and declares stride length, vertical oscillation and ground contact time as data types too. Health Connect has a general SpeedRecord and a PowerRecord that Google describes with cycling and rowing as examples, but no stride, oscillation or ground-contact record, and the Google Health API has no running speed or form data type. The Bluetooth RSC Measurement characteristic sends speed in 1/256 m/s and cadence per minute, plus stride length in centimeters and total distance when its flags say so.

- Canonical: https://aifitnessapi.com/data/running-metrics-api
- Last reviewed: 2026-10-18
- Publisher: AIFitnessAPI (https://aifitnessapi.com) — independent, not sponsored
- Cite as: "Running Metrics API: Speed, Power, Stride Length and Running Form Data", AIFitnessAPI, https://aifitnessapi.com/data/running-metrics-api

---

Running dynamics arrived on the platforms at different times and in different units, and only some of them made it into a shared store. A form feature that works on an Apple Watch can find nothing to read on Android, and a feature built on a Bluetooth foot pod reads values the phone stores never hold. The shape of the problem is in the table.

## What each platform has

| Metric | Apple HealthKit | Wear OS Health Services | Android Health Connect | Bluetooth RSC |
|---|---|---|---|---|
| Speed | [`runningSpeed`](/healthkit-identifiers/running-speed): distance per time | [`SPEED`](/wear-os-data-types/speed): meters per second | [`SpeedRecord`](/health-connect/speed-record): a Series of speed samples, aggregated as `Velocity` | Instantaneous Speed in 1/256 m/s |
| Pace | none | [`PACE`](/wear-os-data-types/pace): milliseconds per kilometer | none | none |
| Power | [`runningPower`](/healthkit-identifiers/running-power): power units | none | `PowerRecord`, described for cycling and rowing | none |
| Stride length | [`runningStrideLength`](/healthkit-identifiers/running-stride-length): length units | `STRIDE_LENGTH`: meters, no page here | none | Instantaneous Stride Length in centimeters, optional |
| Vertical oscillation | [`runningVerticalOscillation`](/healthkit-identifiers/running-vertical-oscillation): length units | `VERTICAL_OSCILLATION`: centimeters, no page here | none | none |
| Vertical ratio | none | [`VERTICAL_RATIO`](/wear-os-data-types/vertical-ratio) and [`VERTICAL_RATIO_STATS`](/wear-os-data-types/vertical-ratio-stats) | none | none |
| Ground contact time | [`runningGroundContactTime`](/healthkit-identifiers/running-ground-contact-time): time units | `GROUND_CONTACT_TIME`: milliseconds, no page here | none | none |
| Cadence | none for running | `STEPS_PER_MINUTE`, covered by the [step counting API](/data/step-counting-api) | `StepsCadenceRecord`, same guide | Instantaneous Cadence per minute |

Read from Apple's documentation on 2026-10-02, Google's Health Services reference on 2026-10-04, its Health Connect reference on 2026-10-03 and the Bluetooth SIG's files on 2026-10-17. Wear OS's stride length, vertical oscillation and ground contact time are rows on the [data-type table](/wear-os-data-types#type-stride_length) without pages of their own, because this site's thin-page rule holds them back.

The Google Health API has no running speed, power or form data type. Its exercise type carries a per-exercise summary with an average speed, an average pace and a `mobilityMetrics` field that Google says is "Only present in the advanced running exercises"; the discovery documents this site reads do not define that object's fields, and exercise data is outside this page's scope.

## Apple's five types

All five are discrete quantities available from iOS 16.0 and watchOS 9.0. Apple's descriptions:

- `runningSpeed` measures "the runner’s speed."
- `runningPower` measures "the rate of work required for the runner to maintain their speed."
- `runningStrideLength` measures "the distance covered by a single step while running."
- `runningVerticalOscillation` measures "pelvis vertical range of motion during a single running stride."
- `runningGroundContactTime` measures "the amount of time the runner’s foot is in contact with the ground while running."

Being discrete, each is averaged, or its minimum or maximum taken, in a statistics query; summing them gives a meaningless number.

## Units: the same quantity in four scales

- **Speed:** distance-per-time units you choose on iOS, meters per second on Wear OS, `Velocity` in Health Connect's aggregates, 1/256 meter per second on Bluetooth.
- **Pace:** only Wear OS has it, in milliseconds per kilometer, and Google notes it "Will be 0 if the user stops moving." A zero pace is a stop, not infinite speed.
- **Stride length:** meters on Wear OS, centimeters on Bluetooth, length units you choose on iOS. Google's Wear OS description, "Distance covered by a single step," matches Apple's single-step definition.
- **Vertical oscillation:** centimeters on Wear OS, which describes it as the distance "the center of mass moves up-and-down with each step"; Apple's is pelvis range of motion during a stride, in length units. The words differ as well as the units.
- **Ground contact time:** milliseconds as a `Long` on Wear OS, time units on iOS.

Wear OS's `VERTICAL_RATIO` is "Vertical oscillation / stride length." Google's example in the same reference reads: "a vertical oscillation of 5.0cm and stride length .8m (80 cm) would have a vertical ratio of 0.625." Five divided by eighty is 0.0625, so the example's figure is ten times the ratio its own definition gives. Check the scale of real values on a device before you display them.

## Speed is one type on Android and many on Apple

Health Connect's `SpeedRecord` "Captures the user's speed, e.g. during running or cycling," and Wear OS has one `SPEED`. HealthKit makes the activity part of the type: `runningSpeed`, [`cyclingSpeed`](/healthkit-identifiers/cycling-speed), [`walkingSpeed`](/healthkit-identifiers/walking-speed), [`rowingSpeed`](/healthkit-identifiers/rowing-speed), [`crossCountrySkiingSpeed`](/healthkit-identifiers/cross-country-skiing-speed), [`paddleSportsSpeed`](/healthkit-identifiers/paddle-sports-speed), [`stairAscentSpeed`](/healthkit-identifiers/stair-ascent-speed) and [`stairDescentSpeed`](/healthkit-identifiers/stair-descent-speed). One of them needs care: Apple's abstract for `paddleSportsSpeed` is the same sentence as for [`distancePaddleSports`](/healthkit-identifiers/distance-paddle-sports), and its stored sentence says the samples measure cumulative values, where every other speed type says discrete. The [cycling power API](/data/cycling-power-api) guide covers the cycling side.

## Bluetooth RSC

The [RSC Measurement 0x2A53](/bluetooth-fitness/rsc-measurement) characteristic always carries Instantaneous Speed, a `uint16` in 1/256 m/s, and Instantaneous Cadence, a `uint8` per minute. Flags bit 0 adds Instantaneous Stride Length, a `uint16` in centimeters, and bit 1 adds Total Distance, a `uint32` in tenths of a meter. Bit 2 is a walking-or-running status: 0 for walking, 1 for running. Our guide to [reading cycling power, cadence and speed sensors](/devices/cycling-sensors-power-cadence) lists it under the Running Speed and Cadence service 0x1814 and covers the subscription, the same pattern as the two cycling services.

## Traps

- **An Apple-only feature by default.** Stride, oscillation and ground contact have no Health Connect record, so an Android build reads them from Wear OS Health Services, or stride length alone from an RSC sensor, not from the store.
- **Oscillation is defined two ways.** Pelvis range of motion during a stride on Apple, center of mass with each step on Wear OS; do not compare across platforms.
- **Zero pace.** Filter it before averaging pace.
- **Units at the boundary.** Convert 1/256 m/s, milliseconds per kilometer and centimeters once, at ingestion.
- **Permissions.** Wear OS `SPEED` and `PACE` sit under `ACTIVITY_RECOGNITION` in Google's permissions table; the stride, oscillation, ground-contact and vertical-ratio types do not appear in that table at all.

## Before you ship

Re-read each type page before release; they regenerate from Apple's, Google's and the SIG's sources. Label every form metric with its platform's definition, test `VERTICAL_RATIO`'s scale on a device, and plan the Android path through Wear OS or Bluetooth rather than Health Connect.

## FAQ

### Does Health Connect have records for running stride length or ground contact time?

No. Google's Health Connect reference, read on 2026-10-03, has no stride length, vertical oscillation or ground contact time record. It has SpeedRecord, a Series of speed samples described as covering running or cycling, and PowerRecord, which Google describes with cycling and rowing as examples. On Wear OS, Health Services declares STRIDE_LENGTH, VERTICAL_OSCILLATION and GROUND_CONTACT_TIME as data types, each with a statistics counterpart.

[Permalink](https://aifitnessapi.com/data/running-metrics-api#faq-1)

### What unit is Wear OS pace in?

Milliseconds per kilometer. Google's Health Services reference describes PACE as pace at a specific point in time that will be 0 if the user stops moving and is otherwise in milliseconds per kilometer, delivered as a SampleDataPoint of Double, with PACE_STATS for the exercise. Filter zero values before averaging, because they mark stops, not a pace.

[Permalink](https://aifitnessapi.com/data/running-metrics-api#faq-2)

### Is vertical oscillation measured the same way on Apple Watch and Wear OS?

Not by the platforms' own definitions. Apple describes runningVerticalOscillation as pelvis vertical range of motion during a single running stride, stored in length units. Google describes Wear OS VERTICAL_OSCILLATION as the distance the center of mass moves up and down with each step, in centimeters. One is per stride and the other per step, so label each value with its source rather than comparing them.

[Permalink](https://aifitnessapi.com/data/running-metrics-api#faq-3)

### Which iOS version added HealthKit running power and stride length?

iOS 16.0, with watchOS 9.0. Apple's availability data gives the same versions for all five running types: runningSpeed, runningPower, runningStrideLength, runningVerticalOscillation and runningGroundContactTime. Each is a discrete quantity, so an HKStatisticsQuery averages it or takes its minimum or maximum rather than summing it.

[Permalink](https://aifitnessapi.com/data/running-metrics-api#faq-4)
