The Google Health API tracks user vitals and physiological health metrics, such as
heart rate, oxygen saturation, blood glucose, core body temperature, daily sleep
temperature derivations, and skin temperature sensors.

Understand how to read and request user authorization for vitals data in your
application to deliver the best experience for your users.

## Supported data types

The API supports the following data types for tracking vitals and health
metrics:

<br />

| Data type | Available operations | Scope |
|---|---|---|
| **[Blood Glucose](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#bloodglucose)** **dataType:** `blood-glucose` **filter parameter:** `blood_glucose` **Record type:** [Sample](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#ObservationSampleTime) [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) | list, get, reconcile, rollup, dailyRollup | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Core Body Temperature](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#corebodytemperature)** **dataType:** `core-body-temperature` **filter parameter:** `core_body_temperature` **Record type:** [Sample](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#ObservationSampleTime) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) | list, get, reconcile, rollup, dailyRollup | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Daily Heart Rate Variability](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#dailyheartratevariability)** **dataType:** `daily-heart-rate-variability` **filter parameter:** `daily_heart_rate_variability` **Record type:**Daily [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Sleep guide](https://developers.google.com/health/data-types/sleep.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Inspire HR - Fitbit Ionic - Fitbit Luxe - 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) | list, reconcile | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Daily Heart Rate Zones](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#dailyheartratezones)** **dataType:** `daily-heart-rate-zones` **filter parameter:** `daily_heart_rate_zones` **Record type:**Daily [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) | list, reconcile | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Daily Oxygen Saturation](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#dailyoxygensaturation)** **dataType:** `daily-oxygen-saturation` **filter parameter:** `daily_oxygen_saturation` **Record type:**Daily [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Sleep guide](https://developers.google.com/health/data-types/sleep.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Ionic - Fitbit Luxe - 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) | list, reconcile | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Daily Respiratory Rate](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#dailyrespiratoryrate)** **dataType:** `daily-respiratory-rate` **filter parameter:** `daily_respiratory_rate` **Record type:**Daily [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Sleep guide](https://developers.google.com/health/data-types/sleep.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Inspire HR - Fitbit Ionic - Fitbit Luxe - 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) | list, reconcile | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Daily Resting Heart Rate](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#dailyrestingheartrate)** **dataType:** `daily-resting-heart-rate` **filter parameter:** `daily_resting_heart_rate` **Record type:**Daily [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Inspire HR - Fitbit Ionic - Fitbit Luxe - 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 | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Daily Sleep Temperature Derivations](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#dailysleeptemperaturederivations)** **dataType:** `daily-sleep-temperature-derivations` **filter parameter:** `daily_sleep_temperature_derivations` **Record type:**Daily [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Sleep guide](https://developers.google.com/health/data-types/sleep.md.txt) [Skin Temperature guide](https://developers.google.com/health/data-types/skin-temperature.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Inspire HR - Fitbit Ionic - Fitbit Luxe - 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) | list, reconcile | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Electrocardiogram (ECG)](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#electrocardiogram)** **dataType:** `electrocardiogram` **filter parameter:** `electrocardiogram` **Record type:**Session [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) #### Compatible devices - Fitbit Charge 5 - [Fitbit Charge 6](https://store.google.com/product/fitbit_charge_6) - [Fitbit Edge](https://store.google.com/product/google_fitbit_edge) - 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) | list | `.ecg.readonly` |
| **[Heart Rate](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#heartrate)** **dataType:** `heart-rate` **filter parameter:** `heart_rate` **Record type:** [Sample](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#ObservationSampleTime) **Storage resolution:**1 second [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Inspire HR - Fitbit Ionic - Fitbit Luxe - 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 | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Heart Rate Variability](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#heartratevariability)** **dataType:** `heart-rate-variability` **filter parameter:** `heart_rate_variability` **Record type:** [Sample](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#ObservationSampleTime) [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Sleep guide](https://developers.google.com/health/data-types/sleep.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 | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Irregular Rhythm Notification](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#irregularrhythmnotification)** **dataType:** `irregular-rhythm-notification` **filter parameter:** `irregular_rhythm_notification` **Record type:**Session [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Luxe - 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 2 - Fitbit Versa 3 - [Fitbit Versa 4](https://store.google.com/product/fitbit_versa_4) - Fitbit Versa Lite | list | `.irn.readonly` |
| **[Oxygen Saturation](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#oxygensaturation)** **dataType:** `oxygen-saturation` **filter parameter:** `oxygen_saturation` **Record type:** [Sample](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#ObservationSampleTime) **Storage resolution:**1 minute [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Sleep guide](https://developers.google.com/health/data-types/sleep.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Ionic - Fitbit Luxe - 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) | list, reconcile | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Respiratory Rate Sleep Summary](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#respiratoryratesleepsummary)** **dataType:** `respiratory-rate-sleep-summary` **filter parameter:** `respiratory_rate_sleep_summary` **Record type:** [Sample](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints.md.txt#ObservationSampleTime) [Webhook support](https://developers.google.com/health/webhooks.md.txt) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Sleep guide](https://developers.google.com/health/data-types/sleep.md.txt) #### Compatible devices - [Fitbit Air](https://store.google.com/product/google_fitbit_air) - 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 Inspire 2 - [Fitbit Inspire 3](https://store.google.com/product/fitbit_inspire_3) - Fitbit Inspire HR - Fitbit Ionic - Fitbit Luxe - 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) | list, reconcile | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
| **[Skin Temperature Sensors](https://developers.google.com/health/reference/rest/v4beta/users.dataTypes.dataPoints.md.txt#skintemperaturesensors)** v4beta **dataType:** `skin-temperature-sensors` **filter parameter:** `skin_temperature_sensors` **Record type:** [Sample](https://developers.google.com/health/reference/rest/v4beta/users.dataTypes.dataPoints.md.txt#ObservationSampleTime) [Vitals guide](https://developers.google.com/health/data-types/vitals.md.txt) [Skin Temperature guide](https://developers.google.com/health/data-types/skin-temperature.md.txt) [Women's Health guide](https://developers.google.com/health/data-types/womens-health.md.txt) #### Compatible devices - [Fitbit Edge](https://store.google.com/product/google_fitbit_edge) - [Pixel Watch 4](https://store.google.com/product/pixel_watch_4) - [Pixel Watch 5](https://store.google.com/product/pixel_watch_5) | list | `.health_metrics_and_measurements.readonly` `.health_metrics_and_measurements.writeonly` |
[*Table: Google Health API Vitals data types*]

<br />

### Read-only requirements

Physiological vitals data types are populated by device sync or manual log
entries in the Fitbit mobile or web app, and are **read-only** through the
REST API (they cannot be written to or modified directly through Google Health
API endpoints).

The following sections provide technical details and REST representation formats
for vitals data.

## Heart rate and heart health

The API provides detailed intraday measurements and daily summary rollups for
heart rate metrics:

- **Heart Rate (`heart-rate`)** : Point-in-time heart rate measurements containing a `beatsPerMinute` count, along with the user's `motionContext` (such as `SEDENTARY` or `ACTIVE`) and `sensorLocation` (such as `WRIST` or `CHEST`).
- **Daily Resting Heart Rate (`daily-resting-heart-rate`)**: A daily baseline resting heart rate value.
- **Heart Rate Variability (`heart-rate-variability` and
  `daily-heart-rate-variability`)** : Records root mean square of successive differences (`rmssd`) in milliseconds to represent HRV.

### REST representation example

To query heart rate measurements, send a `GET` request to the `list` endpoint.

> [!NOTE]
> **Note:** The `list` endpoint returns records from all available data sources, which might contain overlapping intervals. If you want a single, consolidated, continuous stream of data, use the [`reconcile` endpoint](https://developers.google.com/health/reference/rest/v4/users.dataTypes.dataPoints/reconcile.md.txt)

The following example shows a single `heart-rate` data point from the
returned list:

### Request

```
GET https://health.googleapis.com/v4/users/me/dataTypes/heart-rate/dataPoints?startTime=2026-04-20T08:00:00Z&endTime=2026-04-20T08:05:00Z
Authorization: Bearer access-token
Accept: application/json
```

### Response

```
{
  "dataPoints": [
    {
      "name": "users/me/dataTypes/heart-rate/dataPoints/hr-123456789",
      "dataSource": {
        "recordingMethod": "ACTIVELY_MEASURED"
      },
      "heartRate": {
        "sampleTime": {
          "physicalTime": "2026-04-20T08:00:00Z",
          "utcOffset": "0s"
        },
        "beatsPerMinute": "72",
        "metadata": {
          "motionContext": "SEDENTARY",
          "sensorLocation": "WRIST"
        }
      }
    }
  ]
}
```

> [!NOTE]
> **Note:** In JSON responses, 64-bit integer values (like `beatsPerMinute`) are serialized as strings to preserve precision.

## Blood glucose

The `blood-glucose` data type represents the user's blood sugar levels. Blood
glucose points hold the concentration in milligrams per deciliter (`mg/dL`),
the meal or timing context, and specimen info.

### REST representation example

To query blood glucose measurements, send a `GET` request to the `list`
endpoint. The following example shows a single `blood-glucose` data point from
the returned list:

### Request

```
GET https://health.googleapis.com/v4/users/me/dataTypes/blood-glucose/dataPoints?startTime=2026-04-20T08:00:00Z&endTime=2026-04-20T09:00:00Z
Authorization: Bearer access-token
Accept: application/json
```

### Response

```
{
  "dataPoints": [
    {
      "name": "users/me/dataTypes/blood-glucose/dataPoints/bg-987654321",
      "dataSource": {
        "recordingMethod": "MANUALLY_ENTERED"
      },
      "bloodGlucose": {
        "sampleTime": {
          "physicalTime": "2026-04-20T08:30:00Z",
          "utcOffset": "-25200s"
        },
        "bloodGlucoseMilligramsPerDeciliter": 95.0,
        "measurementSource": "SELF_MONITORING_BLOOD_GLUCOSE",
        "mealType": "BREAKFAST",
        "measurementTiming": "AFTER_MEAL",
        "specimen": "CAPILLARY_BLOOD",
        "notes": "Post-breakfast fingerstick reading"
      }
    }
  ]
}
```

## Oxygen saturation

The API tracks blood oxygen levels using `oxygen-saturation` for intraday
sample values and `daily-oxygen-saturation` for daily summary statistics. The
percent concentration is expressed as a number from `0` to `100`.

### Minute-level SpO2 filtering and data validity

Compatible wearable devices use optical sensors on the back of the device to
estimate blood oxygen levels every minute while the user sleeps. When an
application queries `oxygen-saturation`, the Google Health API removes all invalid
minutes and returns only verified readings. Because invalid measurements are
excluded from responses, minute-level coverage can be sparse and timestamp gaps
are expected.

The validation algorithm marks a minute-level SpO2 reading as invalid and
excludes it if arm movement or a loose wrist fit makes the optical sensor
signal unreliable, or the measurement confidence score drops under 50%.

Filtering out invalid measurements protects data quality across your
application:

- Rolling over or shifting in bed can cause optical sensors to register sharp, artificial drops in oxygen levels, and removing those artifacts prevents false alarms and unrealistic readings.
- Applications receive dependable data directly from the API without needing to implement custom noise-filtering code.
- Minute-by-minute `oxygen-saturation` readings align with the user's `daily-oxygen-saturation` sleep summary, because both rely on the same validated data points.

> [!NOTE]
> **Note:** The legacy Fitbit Web API only excluded SpO2 samples with a 50% sentinel value, whereas the Google Health API filters out all invalid measurements. As a result, the Google Health API returns fewer `oxygen-saturation` data points for the same time range. For more information, see [Oxygen saturation
> filtering](https://developers.google.com/health/migration/api-specifications#oxygen-saturation-filtering) in the migration guide.

### REST representation example

To query oxygen saturation measurements, send a `GET` request to the `list`
endpoint. The following example shows a single `oxygen-saturation` data point
from the returned list:

### Request

```
GET https://health.googleapis.com/v4/users/me/dataTypes/oxygen-saturation/dataPoints?startTime=2026-04-20T03:00:00Z&endTime=2026-04-20T03:05:00Z
Authorization: Bearer access-token
Accept: application/json
```

### Response

```
{
  "dataPoints": [
    {
      "name": "users/me/dataTypes/oxygen-saturation/dataPoints/spo2-555555",
      "dataSource": {
        "recordingMethod": "ACTIVELY_MEASURED"
      },
      "oxygenSaturation": {
        "sampleTime": {
          "physicalTime": "2026-04-20T03:00:00Z",
          "utcOffset": "0s"
        },
        "percentage": 98.2
      }
    }
  ]
}
```

## Temperature

The API distinguishes between diagnostic internal body temperature and
peripheral wrist skin temperature trends:

- `core-body-temperature`: Records diagnostic internal organ temperature in Celsius from thermometer devices or manual logs, with the specific measurement site (such as `FOREHEAD`, `EAR`, or `ARMPIT`).
- `daily-sleep-temperature-derivations`: Daily rollups representing nocturnal temperature variations relative to the user's personal baseline.
- `skin-temperature-sensors` v4beta: Continuous minutely raw sensor measurements from dual-sensor hardware (Pixel Watch 4, Pixel Watch 5, and Fitbit Edge), providing paired internal device temperature and skin contact readings.

For complete guidance on sensor hardware architectures and interpreting
temperature deltas, see the
[Skin temperature guide](https://developers.google.com/health/data-types/skin-temperature.md.txt).

### REST representation example

To query core body temperature measurements, send a `GET` request to the `list`
endpoint. The following example shows a single `core-body-temperature` data
point from the returned list:

### Request

```
GET https://health.googleapis.com/v4/users/me/dataTypes/core-body-temperature/dataPoints?startTime=2026-04-20T22:00:00Z&endTime=2026-04-20T23:00:00Z
Authorization: Bearer access-token
Accept: application/json
```

### Response

```
{
  "dataPoints": [
    {
      "name": "users/me/dataTypes/core-body-temperature/dataPoints/cbt-666666",
      "dataSource": {
        "recordingMethod": "ACTIVELY_MEASURED"
      },
      "coreBodyTemperature": {
        "sampleTime": {
          "physicalTime": "2026-04-20T22:30:00Z",
          "utcOffset": "-18000s"
        },
        "temperatureCelsius": 36.8,
        "measurementLocation": "FOREHEAD"
      }
    }
  ]
}
```

## Electrocardiogram (ECG) and notifications

For devices with medical-grade sensors, the API exposes advanced heart health
data types:

- **Electrocardiogram (`electrocardiogram`)** : Single-lead ECG session results, containing a classification (`SINUS_RHYTHM`, `ATRIAL_FIBRILLATION`, `INCONCLUSIVE`), average heart rate, sampling frequency, and raw waveform voltage samples.
- **Irregular Rhythm Notification (`irregular-rhythm-notification`)**: Contextual alert events indicating signs of potential AFib detected during passive monitoring.

### REST representation example

To query electrocardiogram session data, send a `GET` request to the `list`
endpoint. The following example shows a single `electrocardiogram` data point
from the returned list:

### Request

```
GET https://health.googleapis.com/v4/users/me/dataTypes/electrocardiogram/dataPoints?startTime=2026-04-20T10:00:00Z&endTime=2026-04-20T10:05:00Z
Authorization: Bearer access-token
Accept: application/json
```

### Response

```
{
  "dataPoints": [
    {
      "name": "users/me/dataTypes/electrocardiogram/dataPoints/ecg-777777",
      "dataSource": {
        "recordingMethod": "ACTIVELY_MEASURED"
      },
      "electrocardiogram": {
        "interval": {
          "startTime": "2026-04-20T10:00:00Z",
          "startUtcOffset": "0s",
          "endTime": "2026-04-20T10:00:30Z",
          "endUtcOffset": "0s"
        },
        "resultClassification": "SINUS_RHYTHM",
        "beatsPerMinuteAvg": "70",
        "samplingFrequencyHertz": 250,
        "millivoltsScalingFactor": 1000,
        "leadNumber": 1,
        "waveformSamples": [
          -12, -8, 4, 18, 30, 42, 50, 48, 32, 10
        ]
      }
    }
  ]
}
```

## Guidelines

Use these guidelines when designing features with vitals and health
metrics:

- **Handle unit conversions**: Temperature values are provided in Celsius. Convert to Fahrenheit in your frontend code based on the user's localized preferences.
- **Manage webhook notifications**: Subscribe to webhook alerts for vitals to trigger backend analysis immediately after a user syncs new readings (such as heart rate or blood glucose).
- **Respect data sensitivity** : Ensure that your product clearly explains to users the clinical or wellness contexts for reading high-frequency physiological vitals. Explain why scopes like `health_metrics_and_measurements` or `ecg` are required before calling authorization prompts.