Develop Vitals and Health Metrics Experiences with the Google Health API

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

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:

Table: Google Health API Vitals data types
Data type
  dataType
  filter parameter
Available
operations
Scope
Blood Glucose
blood-glucose
blood_glucose
Record type: Sample
list, get, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Core Body Temperature
core-body-temperature
core_body_temperature
Record type: Sample
list, get, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Daily Heart Rate Variability
daily-heart-rate-variability
daily_heart_rate_variability
Record type: Daily

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Daily Heart Rate Zones
daily-heart-rate-zones
daily_heart_rate_zones
Record type: Daily
list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Daily Oxygen Saturation
daily-oxygen-saturation
daily_oxygen_saturation
Record type: Daily

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Daily Respiratory Rate
daily-respiratory-rate
daily_respiratory_rate
Record type: Daily

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Daily Resting Heart Rate
daily-resting-heart-rate
daily_resting_heart_rate
Record type: Daily

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Daily Sleep Temperature Derivations
daily-sleep-temperature-derivations
daily_sleep_temperature_derivations
Record type: Daily

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Electrocardiogram (ECG)
electrocardiogram
electrocardiogram
Record type: Session

Compatible devices

list .ecg.readonly
Heart Rate
heart-rate
heart_rate
Record type: Sample

Compatible devices

list, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Heart Rate Variability
heart-rate-variability
heart_rate_variability
Record type: Sample

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Irregular Rhythm Notification
irregular-rhythm-notification
irregular_rhythm_notification
Record type: Session
list .irn.readonly
Oxygen Saturation
oxygen-saturation
oxygen_saturation
Record type: Sample

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Respiratory Rate Sleep Summary
respiratory-rate-sleep-summary
respiratory_rate_sleep_summary
Record type: Sample

Compatible devices

list, reconcile .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly

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.

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"
        }
      }
    }
  ]
}

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 (SpO2)

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

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

Temperature tracking includes core body temperature metrics and overnight sleep skin temperature trends:

  • Core Body Temperature (core-body-temperature): Records internal organ temperature in Celsius, with the specific measurement site (such as ARMPIT, EAR, or FOREHEAD).
  • Sleep Temperature Derivations (daily-sleep-temperature-derivations): High-frequency skin temperature variances recorded overnight.

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
        ]
      }
    }
  ]
}

Scopes and authorization

To use the vitals and heart health data feature, your app must request the following OAuth scopes:

  • Read: https://www.googleapis.com/auth/googlehealth.ecg.readonly
  • Read: https://www.googleapis.com/auth/googlehealth.health_metrics_and_measurements.readonly
  • Write: https://www.googleapis.com/auth/googlehealth.health_metrics_and_measurements.writeonly
  • Read: https://www.googleapis.com/auth/googlehealth.irn.readonly

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.