Fitbit Web API to Google Health API: Google’s mapping tables
Read from Google’s documentation on 2026-10-17 · discovery document revision 20261014 · Google’s API-specifications page last updated 2026-09-22
Google’s Fitbit migration API specification maps 32 Fitbit Web API data types to Google Health API dataType ids, 15 Fitbit scopes to Google Health API scopes and 13 Fitbit endpoint types to Google Health API methods. 31 of the mapped data types are in Google’s data-types table; basal-energy-burned is not. Its Calculations section says how SpO2 filtering, activity levels, sedentary minutes, BMI and BMR differ from the Fitbit Web API.
Data types
Google’s table, row for row: the Fitbit Web API data type as Google names it, the Google Health API data type (linked where it has a page here), and Google’s description where the row has one.
| Fitbit Web API | Google Health API | Google’s description |
|---|---|---|
| Activity Calories | Active Energy Burnedactive-energy-burned | Represents the calories burned during active periods, inclusive of BMR for those periods. In the Google Health API, this can be reconstructed by adding BMR to the active-energy-burned data type (which tracks activity-only burn, excluding basal rate). |
| Active Zone Minutes | Active Zone Minutesactive-zone-minutes | — |
| Contains changes to the user's activity levels | Activity Levelactivity-level | Captures the user's activity level (such as sedentary or active) over a specific period of time. |
| Elevation | Altitudealtitude | — |
Activity caloriesBMR | Basal Energy Burnedbasal-energy-burnednot in the data-types table | The calories burned due to Basal Metabolic Rate (BMR) over a specific period of time. |
| Blood Glucose | Blood Glucoseblood-glucose | — |
| Body fat | Body Fatbody-fat | — |
caloriesOut in each heart rate zone | Calories In Heart Rate Zonecalories-in-heart-rate-zone | — |
| Temperature (Core) | Core Body Temperaturecore-body-temperature | — |
| HRV summary | Daily Heart Rate Variabilitydaily-heart-rate-variability | — |
| SpO2 summary | Daily Oxygen Saturationdaily-oxygen-saturation | A daily summary of blood oxygen saturation (SpO2) statistics calculated from validated sleep measurements. |
| Resting heart rate | Daily Resting Heart Ratedaily-resting-heart-rate | — |
| Skin temperature | Daily Sleep Temperature Derivationsdaily-sleep-temperature-derivations | — |
| Distance | Distancedistance | — |
| Electrocardiogram (ECG) | Electrocardiogram (ECG)electrocardiogram | — |
| Recorded activity | Exerciseexercise | Recorded workouts or exercise sessions, which include start/end times, activity types, and session metrics. |
| Floors | Floorsfloors | — |
| Food | Foodfood | — |
| Food Measurement Unit | Food Measurement Unitfood-measurement-unit | — |
| Heart Rate | Heart Rateheart-rate | — |
| HRV Intraday | Heart Rate Variabilityheart-rate-variability | — |
| Irregular Rhythm Notifications (IRN) | Irregular Rhythm Notificationirregular-rhythm-notification | — |
| Food Log | Nutrition Lognutrition-log | — |
| SpO2 Intraday | Oxygen Saturationoxygen-saturation | Returns only validated minute-level SpO2 measurements and excludes readings flagged as invalid due to motion artifacts or low sensor confidence. Because the Fitbit Web API only excluded the 50% sentinel value, the Google Health API returns fewer data points for the same time range. For details, see Oxygen saturation filtering. |
| VO2 Max value when the user runs | Run VO2 Maxrun-vo2-max | — |
| Activity time series minutes sedentary | Sedentary Periodsedentary-period | — |
| Sleep | Sleepsleep | — |
| Steps | Stepssteps | — |
| Activity time series swimming strokes | Swim Lengths Dataswim-lengths-data | — |
Activity caloriesOut | Total Caloriestotal-calories | The complete number of calories burned by a user over a period of time, inclusive of basal metabolic rate and active energy burned. |
| VO2 Max value | VO2 Maxvo2-max | — |
| Weight | Weightweight | — |
Mapped type missing from the data-types table
Google's Fitbit mapping table maps "Activity
caloriesBMR" to basal-energy-burned, which the data-types table does not list; the v4 discovery document does have DataPoint.basalEnergyBurned.- Google's Fitbit migration API specifications: “Activity
caloriesBMR” - Google's Fitbit migration API specifications: “basal-energy-burned”
- Google's Fitbit migration API specifications: “The calories burned due to Basal Metabolic Rate (BMR) over a specific period of time.”
- the v4 discovery document: “Optional. Data for points in the
basal-energy-burnedinterval data type collection.”
- Google's Fitbit migration API specifications: “Activity
Scopes
Google’s Fitbit Web API → Google Health API scope table. Every Google Health API scope here is the suffix of a URL under https://www.googleapis.com/auth/googlehealth; every scope with its consent text.
| Fitbit Web API scope | Google Health API scopes |
|---|---|
activity | .activity_and_fitness.readonly, .activity_and_fitness.writeonly |
blood_glucose | .health_metrics_and_measurements.readonly, .health_metrics_and_measurements.writeonly |
cardio_fitness | .activity_and_fitness.readonly, .activity_and_fitness.writeonly |
electrocardiogram | .ecg.readonly |
heartrate | .health_metrics_and_measurements.readonly, .health_metrics_and_measurements.writeonly |
irregular_rhythm_notifications | .irn.readonly |
location | .location.readonly |
nutrition | .nutrition.readonly, .nutrition.writeonly |
oxygen_saturation | .health_metrics_and_measurements.readonly, .health_metrics_and_measurements.writeonly |
profile | .profile.readonly, .profile.writeonly |
respiratory_rate | .health_metrics_and_measurements.readonly, .health_metrics_and_measurements.writeonly |
settings | .settings.readonly, .settings.writeonly |
sleep | .sleep.readonly, .sleep.writeonly |
temperature | .health_metrics_and_measurements.readonly, .health_metrics_and_measurements.writeonly |
weight | .health_metrics_and_measurements.readonly, .health_metrics_and_measurements.writeonly |
Endpoints
Google’s endpoint conventions
The REST endpoints adopt a consistent syntax for all data types.
- Service Endpoint: The base HTTP URL changes to https://health.googleapis.com.
- Endpoint Syntax: The Google Health API supports a limited number of endpoints, which can be used by most of the supported data types. This provides consistent syntax for all data types and makes the endpoints easier to use.
- User Identifier: Either the user ID or me should be specified in the endpoint syntax. When using me, the user ID is inferred from the access token.
Example: Here's an example of the GET Profile endpoint called using the Google Health API
GET https://health.googleapis.com/v4/users/me/profile
Endpoint mappings
See Google Health API data types table for a list of data types available and the API methods they support.
| Fitbit Web API Endpoint Type | Google Health API |
|---|---|
| GET (Log | Summary | Daily Summary) where you are requesting a single day of data | dailyRollup method with windowSize = 1 day |
| GET (Intraday) where you are requesting granular data | list method |
| GET (Time Series) by Date or Interval | rollUp or dailyRollUp method including a date range |
| GET (Log List) | list method |
| CREATE & UPDATE Logs | patch method |
| DELETE Logs | batchDelete method |
| GET Profile | users.getProfile returns the user's specific informationusers.getSettings returns the user's units and timezones |
| UPDATE Profile | users.updateProfile modifies the user's specific informationusers.updateSettings modifies the user's units and timezones |
| Get User ID | users.getIdentity returns the user's Fitbit legacy and Google user ID. |
| Get Devices | users.pairedDevices returns the list of paired devices |
| Create Subscriptions | projects.subscribers.subscriptions.create manually creates a subscription |
| Delete Subscriptions | projects.subscribers.subscriptions.delete delete a subscription |
| Get Subscriptions List | projects.subscribers.subscriptions.list lists all subscriptions |
Quoted from Google's Fitbit migration API specifications, last updated 2026-09-22, read 2026-10-17.
Each data type’s methods and documented path templates are on its page, starting from the methods overview.
Calculations that changed
Google’s Calculations section, verbatim.
Oxygen saturation filtering
When querying minute-level blood oxygen saturation (oxygen-saturation), the Google Health API applies stricter data validity filtering than the legacy Fitbit Web API:
- The legacy Fitbit Web API (v1 and v3) only excluded SpO2 samples with a sentinel value of 50%.
- The Google Health API (v4) excludes all SpO2 samples flagged as invalid by the validation algorithm. A minute is marked invalid when arm movement or a loose wrist fit makes the optical sensor signal unreliable, when the confidence score drops under 50%, during the 3 minutes immediately before and after an invalid reading, or when a valid stretch lasts less than 4 consecutive minutes.
Because the Google Health API removes all invalid measurements rather than only the 50% sentinel value, it returns fewer oxygen-saturation data points than the Fitbit Web API for the same time range, and gaps in minute-by-minute coverage are expected. The returned minute-level readings align with the validated data points used to compute the user's daily-oxygen-saturation sleep summary. For more information, see Minute-level SpO2 filtering and data validity.
Quoted from Google's Fitbit migration API specifications, last updated 2026-09-22, read 2026-10-17.
Activity level, METs, and step thresholds
In the Google Health API, a user's minute-by-minute activity level is derived from their Metabolic Equivalent of Task (MET) and step count.
| Activity level | Heart rate devices | Non-heart rate devices |
|---|---|---|
| Sedentary | ≤ 1.5 METs | ≤ 1.5 METs |
| Lightly Active | > 1.5 METs and ≤ 4.2 METs | > 1.5 METs and ≤ 3.5 METs |
| Moderately Active | > 4.2 METs and < 6.0 METs (unless conditions for Very Active are met) | > 3.5 METs and < 6.0 METs (unless conditions for Very Active are met) |
| Very Active | ≥ 6.0 METs, or ≥ 5.0 METs with a step rate of 150 steps per minute or more | ≥ 6.0 METs, or ≥ 5.0 METs with a step rate of 150 steps per minute or more |
Active minutes consist of combined MODERATELY_ACTIVE and VERY_ACTIVE minutes. However, a highly active minute is only credited if it occurs during a continuous streak of at least 10 minutes, allowing at most 2-minute gaps of lower activity.
Quoted from Google's Fitbit migration API specifications, last updated 2026-09-22, read 2026-10-17.
Sedentary minutes and sleep
Sedentary minutes don't include sleep time. In daily rollups, sedentary minutes are calculated by subtracting sleep minutes and active minutes (lightly active, moderately active, and very active) from the total minutes in the day (1,440 minutes):
Sedentary Minutes = 1440 - Sleep Minutes - Lightly Active Minutes - Moderately Active Minutes - Very Active Minutes
Quoted from Google's Fitbit migration API specifications, last updated 2026-09-22, read 2026-10-17.
Body Mass Index (BMI)
Because the Google Health API does not expose a built-in BMI data type, applications must calculate Body Mass Index client-side using height and weight records:
- Retrieve the user's weight in grams from the
weightGramsfield in the Weight data type. Convert this to kilograms (divide by 1,000) or pounds (divide by 453.59237). - Retrieve the user's height in millimeters from the
heightMillimetersfield in the Height data type. Convert this to meters (divide by 1,000) or inches (divide by 25.4). - Use one of the following formulas to calculate the BMI value:
- Metric formula:
BMI = weight (kg) / [height (m)]^2 - Imperial formula:
BMI = (weight (lbs) / [height (in)]^2) * 703
- Metric formula:
The resulting BMI values correspond to the following categories:
| Weight category | BMI range |
|---|---|
| Underweight | Under 18.5 |
| Healthy weight | 18.5 to 24.9 |
| Overweight | 25 to 29.9 |
| Obese | 30 or higher |
Quoted from Google's Fitbit migration API specifications, last updated 2026-09-22, read 2026-10-17.
Basal Metabolic Rate (BMR)
Basal Metabolic Rate (BMR) is the minimum number of calories required for basic bodily functions at rest. Because the Google Health API does not expose a built-in BMR data type, applications must calculate it client-side using the Harris-Benedict formula. See the Harris–Benedict equation article on Wikipedia to learn more.
To perform this calculation:
- Retrieve the user's weight in grams from the
weightGramsfield in the Weight data type and convert to kilograms (divide by 1,000). To convert pounds to kilograms, divide by 2.2. - Retrieve the user's height in millimeters from the
heightMillimetersfield in the Height data type and convert to centimeters (divide by 10). To convert inches to centimeters, multiply by 2.54. - Retrieve the user's age in years from the
agefield in the Profile resource. - Retrieve the biological sex independently (for example, by prompting the user or maintaining it in your own database), as the Google Health API does not expose this field.
- Use one of the following formulas based on the user's biological sex:
- Men:
BMR = 66 + (13.7 x weight_kg) + (5 x height_cm) - (6.8 x age_years) - Women:
BMR = 655 + (9.6 x weight_kg) + (1.8 x height_cm) - (4.7 x age_years)
- Men:
Total Daily Energy Expenditure (TDEE)
Total Daily Energy Expenditure (TDEE) is an estimation of the total number of calories a person burns in a day, which accounts for both BMR and physical activity. To estimate the user's TDEE, multiply the BMR value by an activity factor corresponding to their lifestyle:
| Activity level | Description | Multiplier |
|---|---|---|
| Sedentary | Little or no exercise. | BMR x 1.2 |
| Lightly active | 1–3 days of exercise per week. | BMR x 1.375 |
| Moderately active | 3–5 days of exercise per week. | BMR x 1.55 |
| Very active | 6–7 days of exercise per week. | BMR x 1.725 |
| Extra active | Very hard exercise or physical job. | BMR x 1.9 |
Quoted from Google's Fitbit migration API specifications, last updated 2026-09-22, read 2026-10-17.
The migration itself — re-consent, identity mapping, dual-linking, backfill — step by step: migrating from the Fitbit Web API to the Google Health API. The deadlines: the Fitbit Web API retirement.
Questions
How do Fitbit Web API scopes map to Google Health API scopes?
Google's migration specification maps 15 Fitbit Web API scopes: activity to .activity_and_fitness.readonly and .activity_and_fitness.writeonly; blood_glucose to .health_metrics_and_measurements.readonly and .health_metrics_and_measurements.writeonly; cardio_fitness to .activity_and_fitness.readonly and .activity_and_fitness.writeonly; electrocardiogram to .ecg.readonly; heartrate to .health_metrics_and_measurements.readonly and .health_metrics_and_measurements.writeonly; irregular_rhythm_notifications to .irn.readonly; location to .location.readonly; nutrition to .nutrition.readonly and .nutrition.writeonly; oxygen_saturation to .health_metrics_and_measurements.readonly and .health_metrics_and_measurements.writeonly; profile to .profile.readonly and .profile.writeonly; respiratory_rate to .health_metrics_and_measurements.readonly and .health_metrics_and_measurements.writeonly; settings to .settings.readonly and .settings.writeonly; sleep to .sleep.readonly and .sleep.writeonly; temperature to .health_metrics_and_measurements.readonly and .health_metrics_and_measurements.writeonly; weight to .health_metrics_and_measurements.readonly and .health_metrics_and_measurements.writeonly. Each Google scope is the suffix of a full URL under https://www.googleapis.com/auth/googlehealth.
Why does the Google Health API return fewer SpO2 readings than the Fitbit Web API?
Because of stricter filtering, per Google's migration specification: "Because the Google Health API removes all invalid measurements rather than only the 50% sentinel value, it returns fewer oxygen-saturation data points than the Fitbit Web API for the same time range, and gaps in minute-by-minute coverage are expected." The legacy Fitbit Web API (v1 and v3) only excluded SpO2 samples with a sentinel value of 50%.
How does the Google Health API count sedentary minutes?
Google's migration specification: "Sedentary minutes don't include sleep time." Its formula for daily rollups: Sedentary Minutes = 1440 - Sleep Minutes - Lightly Active Minutes - Moderately Active Minutes - Very Active Minutes
Does the Google Health API have a BMI or BMR data type?
Not according to Google's migration specification: "Because the Google Health API does not expose a built-in BMI data type, applications must calculate Body Mass Index client-side using height and weight records:" and "Because the Google Health API does not expose a built-in BMR data type, applications must calculate it client-side using the Harris-Benedict formula." It gives the formulas instead. One of its own mapping rows complicates that: Google's Fitbit mapping table maps "Activity caloriesBMR" to basal-energy-burned, which the data-types table does not list; the v4 discovery document does have DataPoint.basalEnergyBurned.
Which Google Health API method replaces the Fitbit Web API's intraday endpoints?
Google's endpoint-mapping table: GET (Intraday) where you are requesting granular data maps to the list method. The full table is on this page.
Sources checked
- API specifications — last updated 2026-09-22 · read 2026-10-17
- Google Health API data types — last updated 2026-10-06 · read 2026-10-17
- Google Health API discovery document (v4) — revision 20261014 · read 2026-10-17
Google’s text is quoted for identification; each guide page’s footer reads: “Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License.”. Generated from Google’s pages by scripts/fetch-google-health-api.mjs, not typed by hand; Google’s documentation remains the authority.