Skip to content
AF

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 APIGoogle Health APIGoogle’s description
Activity CaloriesActive Energy Burnedactive-energy-burnedRepresents 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 MinutesActive Zone Minutesactive-zone-minutes—
Contains changes to the user's activity levelsActivity Levelactivity-levelCaptures the user's activity level (such as sedentary or active) over a specific period of time.
ElevationAltitudealtitude—
Activity caloriesBMRBasal Energy Burnedbasal-energy-burnednot in the data-types tableThe calories burned due to Basal Metabolic Rate (BMR) over a specific period of time.
Blood GlucoseBlood Glucoseblood-glucose—
Body fatBody Fatbody-fat—
caloriesOut in each heart rate zoneCalories In Heart Rate Zonecalories-in-heart-rate-zone—
Temperature (Core)Core Body Temperaturecore-body-temperature—
HRV summaryDaily Heart Rate Variabilitydaily-heart-rate-variability—
SpO2 summaryDaily Oxygen Saturationdaily-oxygen-saturationA daily summary of blood oxygen saturation (SpO2) statistics calculated from validated sleep measurements.
Resting heart rateDaily Resting Heart Ratedaily-resting-heart-rate—
Skin temperatureDaily Sleep Temperature Derivationsdaily-sleep-temperature-derivations—
DistanceDistancedistance—
Electrocardiogram (ECG)Electrocardiogram (ECG)electrocardiogram—
Recorded activityExerciseexerciseRecorded workouts or exercise sessions, which include start/end times, activity types, and session metrics.
FloorsFloorsfloors—
FoodFoodfood—
Food Measurement UnitFood Measurement Unitfood-measurement-unit—
Heart RateHeart Rateheart-rate—
HRV IntradayHeart Rate Variabilityheart-rate-variability—
Irregular Rhythm Notifications (IRN)Irregular Rhythm Notificationirregular-rhythm-notification—
Food LogNutrition Lognutrition-log—
SpO2 IntradayOxygen Saturationoxygen-saturationReturns 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 runsRun VO2 Maxrun-vo2-max—
Activity time series minutes sedentarySedentary Periodsedentary-period—
SleepSleepsleep—
StepsStepssteps—
Activity time series swimming strokesSwim Lengths Dataswim-lengths-data—
Activity caloriesOutTotal Caloriestotal-caloriesThe complete number of calories burned by a user over a period of time, inclusive of basal metabolic rate and active energy burned.
VO2 Max valueVO2 Maxvo2-max—
WeightWeightweight—
  • 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-burned interval data type collection.”

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 scopeGoogle 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 TypeGoogle Health API
GET (Log | Summary | Daily Summary) where you are requesting a single day of datadailyRollup method with windowSize = 1 day
GET (Intraday) where you are requesting granular datalist method
GET (Time Series) by Date or IntervalrollUp or dailyRollUp method including a date range
GET (Log List)list method
CREATE & UPDATE Logspatch method
DELETE LogsbatchDelete method
GET Profileusers.getProfile returns the user's specific information
users.getSettings returns the user's units and timezones
UPDATE Profileusers.updateProfile modifies the user's specific information
users.updateSettings modifies the user's units and timezones
Get User IDusers.getIdentity returns the user's Fitbit legacy and Google user ID.
Get Devicesusers.pairedDevices returns the list of paired devices
Create Subscriptionsprojects.subscribers.subscriptions.create manually creates a subscription
Delete Subscriptionsprojects.subscribers.subscriptions.delete delete a subscription
Get Subscriptions Listprojects.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.

Note: Heart Rate Devices refers to wearable devices equipped with a heart rate sensor that actively track heart rate data. Non-Heart Rate Devices refers to devices without a heart rate sensor (such as pedometers), or where heart rate tracking is disabled or unavailable.
Activity levelHeart rate devicesNon-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:

  1. Retrieve the user's weight in grams from the weightGrams field in the Weight data type. Convert this to kilograms (divide by 1,000) or pounds (divide by 453.59237).
  2. Retrieve the user's height in millimeters from the heightMillimeters field in the Height data type. Convert this to meters (divide by 1,000) or inches (divide by 25.4).
  3. 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

The resulting BMI values correspond to the following categories:

Weight categoryBMI range
UnderweightUnder 18.5
Healthy weight18.5 to 24.9
Overweight25 to 29.9
Obese30 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:

  1. Retrieve the user's weight in grams from the weightGrams field in the Weight data type and convert to kilograms (divide by 1,000). To convert pounds to kilograms, divide by 2.2.
  2. Retrieve the user's height in millimeters from the heightMillimeters field in the Height data type and convert to centimeters (divide by 10). To convert inches to centimeters, multiply by 2.54.
  3. Retrieve the user's age in years from the age field in the Profile resource.
  4. 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.
  5. 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)

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 levelDescriptionMultiplier
SedentaryLittle or no exercise.BMR x 1.2
Lightly active1–3 days of exercise per week.BMR x 1.375
Moderately active3–5 days of exercise per week.BMR x 1.55
Very active6–7 days of exercise per week.BMR x 1.725
Extra activeVery 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

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.