The Google Health API tracks user steps and activity data using the `steps`
interval data type. Steps count represents a fundamental measure of daily
physical activity, helping developers track fitness progress, calculate energy
expenditure, and build user-facing daily activity summaries.

Understand how to read and structure steps count metrics in your
application to deliver the best experience for your users.

## Supported data types

The API supports the following data type for tracking step counts:

<br />

| Data type | Available operations | Scope |
|---|---|---|
| **[Steps](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#steps)** **dataType:** `steps` **filter parameter:** `steps` **Record type:** [Interval](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#ObservationTimeInterval) **Storage resolution:**1 minute [Webhook support](https://developers.google.com/health/webhooks.md.txt) [True zeros support](https://developers.google.com/health/data-presence-and-true-zeros) [Steps guide](https://developers.google.com/health/data-types/steps.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - Fitbit Alta - Fitbit Alta HR - Fitbit Blaze - Fitbit Charge 2 - Fitbit Charge 3 - Fitbit Charge 4 - Fitbit Charge 5 - [Fitbit Charge 6](https://store.google.com/product/fitbit_charge_6) - [Fitbit Edge](https://store.google.com/product/google_fitbit_edge) - Fitbit Flex 2 - Fitbit Inspire - Fitbit Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Inspire HR - Fitbit Ionic - Fitbit Luxe - Fitbit MobileTrack - Pixel Watch - Pixel Watch 2 - [Pixel Watch 3](https://store.google.com/product/pixel_watch_3) - [Pixel Watch 4](https://store.google.com/product/pixel_watch_4) - Fitbit Sense - [Fitbit Sense 2](https://store.google.com/product/fitbit_sense_2) - Fitbit Versa - Fitbit Versa 2 - Fitbit Versa 3 - [Fitbit Versa 4](https://store.google.com/product/fitbit_versa_4) - Fitbit Versa Lite | list, reconcile, rollup, dailyRollup | `.activity_and_fitness.readonly` `.activity_and_fitness.writeonly` |
[*Table: Google Health API Steps data types*]

<br />

## Guidelines

When integrating steps tracking into your app, follow these design and
implementation guidelines.

### Speed and pace calculation

The Google Health API uses standard formulas to calculate speed and pace:

- Speed = `distance / time(hour)`
- Pace = `time(seconds) / distance`

The `Accept-Language` header specified in the request determines the unit of
distance.

### Daily overview

To aggregate daily step counts accurately under travel, time zone changes, or
daylight savings, don't perform client-side duration calculations. Instead,
query the `dailyRollUp` endpoint which reconciles physical data gaps
automatically using the UTC offsets. The rollup returns a `StepsRollupValue`
containing the `countSum` field, representing the total accumulated steps for
the requested day. For details, see
[Aggregate across calendar days](https://developers.google.com/health/aggregate-data.md.txt#aggregate-by-day) in
the Aggregate data guide.

### Drawing user interfaces (Reconciliation)

When building user interface elements to display step data, use the `reconcile`
endpoint. If multiple data sources (such as a smartwatch and a mobile phone)
have recorded steps at the same time, the `reconcile` endpoint resolves
conflicts and merges the streams to return a single, reconciled data stream.

For information on handling overlapping intervals from connected device syncs
and timestamp mutability, see the
[Data management guide](https://developers.google.com/health/data-management.md.txt#interval-timestamps).

### Intraday tracking and histograms

To display detailed user activity throughout the day
(such as charts and graphs):

- **Hourly or minute step histograms:** Query the `rollUp` endpoint, specifying the duration (such as `60s` for 1 minute or `3600s` for 1 hour) using the `windowSize` parameter. Because step data is recorded in 1-minute (`60s`) intervals, set `windowSize` to at least `60s`. Requests with sub-minute window sizes (such as `10s` or `30s`) don't slice individual minute totals, placing the full minute's count into the first matching sub-bucket. For details, see [Rollup window and storage
  resolution](https://developers.google.com/health/aggregate-data#rollup-window-storage-resolution).
- **All step records:** Use the `list` endpoint to fetch the most granular, raw step records.

The `rollUp`, `dailyRollUp`, and `reconcile` endpoints accept the
`dataSourceFamily` parameter, allowing you to filter data from specific source
groups. For more details and usage examples, see the
[Filter by data source family](https://developers.google.com/health/filters.md.txt#filter-by-data-source)
section of the Filter data guide.

### Sync using webhooks

Subscribe to the `steps` data type collection to get notified when new step
data is imported or synchronized. Rather than polling REST endpoints, update
client-side dashboards dynamically in response to these webhook
notifications. For details on how to set up subscriptions, see
[Webhook subscriptions](https://developers.google.com/health/webhooks.md.txt).