Google Health API reference: every data type, scope and method
Read from Google’s documentation on 2026-10-17 · discovery document revision 20261014 · Google’s data-types page last updated 2026-10-06
Google’s About page: “The Fitbit Web API has been improved and modernized to provide a more standardized, consistent, and scalable foundation for developer integrations, and is now called the Google Health API.” It replaces Fitbit authorization with Google OAuth 2.0, and Google’s data-types table listed 44 data types on 2026-10-17. Google’s timeline puts the end of support on September 30, 2026 and the API turn-off on October 30, 2026: “The Fitbit Web API will be turned off and will no longer function or sync data to or from Fitbit users.”
The Fitbit Web API turn-down
As Google’s About page states it:
September 30, 2026 — End of support
“Support for the Fitbit Web API ends. The API will continue to operate, but Google will no longer fix bugs or provide API support.”
October 30, 2026 — API turn-off
“The Fitbit Web API will be turned off and will no longer function or sync data to or from Fitbit users.”
Quoted from Google’s About page, last updated 2026-09-29, read 2026-10-17. What else is confirmed and what is only reported: the Fitbit Web API retirement page.
What changes from the Fitbit Web API
Each point in Google’s words, with the page it comes from.
- Google OAuth 2.0 replaces Fitbit authorization
- “Streamlined identity & security: Replace legacy Fitbit Authorization (FOT) with Google OAuth 2.0.” Google — About
- Restricted scopes and a review
- “All Google Health API scopes are categorized as Restricted, necessitating a privacy and security review for access.” Google — About
- “Most scopes for the Google Health API are restricted, which means you must complete verification before your app is publicly available.” Google — App verification
- Unverified apps are capped
- “If your app isn't verified, it's limited to 100 users.” Google — App verification
- Every user re-consents
- “Because of the switch to a new OAuth library, existing access and refresh tokens cannot be transferred, requiring users to re-consent to your updated integration.” Google — Migration guide
- A new user identifier
- “The legacy Fitbit Web API identifies accounts using a 6-character alphanumeric string (such as
A1B2C3), whereas the Google Health API utilizes ahealthUserIdformatted as a string of up to 63 digits & characters.” Google — Migration guide - “To bridge this gap without losing user context, developers can query the
getIdentityendpoint to get the Fitbit and Health user IDs.” Google — Migration guide - No dual-linking
- “Never allow a single user to have both a legacy Fitbit Web API connection and a Google Health API connection active simultaneously ("dual-linking").” Google — Migration guide
- Accounts must be linked first
- “A user must sign in to the Google Health mobile app to link Google Health to their Google Account before your app can sync data through the Google Health API.” Google — Migration guide
- A new base URL
- “Service Endpoint: The base HTTP URL changes to https://health.googleapis.com.” Google — API specifications
The two restricted-scope sentences do not say the same thing — “all” on the About page, “most” on the app-verification page — so this page quotes both and lists the difference with the other disagreements. Verification, the security assessment and the quotas in full: access and rate limits. The move itself, step by step: migrating from the Fitbit Web API to the Google Health API.
All 44 data types, by scope family
Grouped by the scope family Google’s table lists for each type (Google’s own scope ids, in the Scopes page’s order); within a family, in the table’s order. Operations are as the table prints them.
The exercise data type’s exerciseType values are listed one by one, beside the HealthKit, Health Connect and Wear OS constants of the same name, on Google Health API exercise types.
Activity and fitness 17
Scope family activity_and_fitness
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Active Energy Burnedactive-energy-burned | Interval | list, reconcile, rollup, dailyRollup | 1 minute | — |
| Active Minutesactive-minutes | Interval | list, reconcile, rollup, dailyRollup | 1 minute | webhooks |
| Active Zone Minutesactive-zone-minutes | Interval | list, reconcile, rollup, dailyRollup | 1 minute | webhooks |
| Activity Levelactivity-level | Interval | list, reconcile | — | webhooks · 2 flags |
| Altitudealtitude | Interval | list, reconcile, rollup, dailyRollup | 1 minute | webhooks · true zeros |
| Calories In Heart Rate Zonecalories-in-heart-rate-zone | Interval | rollup, dailyRollup | 1 minute | webhooks · 1 flag |
| Daily VO2 Maxdaily-vo2-max | Daily | list, reconcile | — | — |
| Distancedistance | Interval | list, reconcile, rollup, dailyRollup | 1 minute | webhooks · true zeros |
| Exerciseexercise | Session | list, get, reconcile, create, update, batchDelete | — | webhooks · 2 flags |
| Floorsfloors | Interval | reconcile, rollup, dailyRollup | 1 minute | webhooks · true zeros · 1 flag |
| Run VO2 Maxrun-vo2-max | Sample | list, reconcile, rollup, dailyRollup | — | webhooks |
| Sedentary Periodsedentary-period | Interval | list, reconcile, rollup, dailyRollup | — | webhooks |
| Stepssteps | Interval | list, reconcile, rollup, dailyRollup | 1 minute | webhooks · true zeros |
| Swim Lengths Dataswim-lengths-data | Interval | list, reconcile, rollup, dailyRollup | — | — |
| Time in Heart Rate Zonetime-in-heart-rate-zone | Interval | list, reconcile, rollup, dailyRollup | 1 minute | webhooks |
| Total Caloriestotal-calories | Interval | rollup, dailyRollup | 1 minute | true zeros · 2 flags |
| VO2 Maxvo2-max | Sample | list, reconcile | — | — |
ECG 1
Scope family ecg
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Electrocardiogram (ECG)electrocardiogram | Session | list | — | — |
Health metrics and measurements 16
Scope family health_metrics_and_measurements
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Blood Glucoseblood-glucose | Sample | list, get, reconcile, rollup, dailyRollup | — | webhooks |
| Body Fatbody-fat | Sample | list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | — | webhooks · 1 flag |
| Core Body Temperaturecore-body-temperature | Sample | list, get, reconcile, rollup, dailyRollup | — | — |
| Daily Heart Rate Variabilitydaily-heart-rate-variability | Daily | list, reconcile | — | webhooks · 1 flag |
| Daily Heart Rate Zonesdaily-heart-rate-zones | Daily | list, reconcile | — | webhooks |
| Daily Oxygen Saturationdaily-oxygen-saturation | Daily | list, reconcile | — | webhooks |
| Daily Respiratory Ratedaily-respiratory-rate | Daily | list, reconcile | — | webhooks |
| Daily Resting Heart Ratedaily-resting-heart-rate | Daily | list, reconcile | — | webhooks · 1 flag |
| Daily Sleep Temperature Derivationsdaily-sleep-temperature-derivations | Daily | list, reconcile | — | webhooks |
| Heart Rateheart-rate | Sample | list, reconcile, rollup, dailyRollup | 1 second | webhooks |
| Heart Rate Variabilityheart-rate-variability | Sample | list, reconcile | — | webhooks |
| Heightheight | Sample | list, get, reconcile, create, update, batchDelete | — | webhooks · 1 flag |
| Oxygen Saturationoxygen-saturation | Sample | list, reconcile | 1 minute | — |
| Respiratory Rate Sleep Summaryrespiratory-rate-sleep-summary | Sample | list, reconcile | — | webhooks |
| Skin Temperature Sensorsskin-temperature-sensors | Sample | list | — | v4beta · 1 flag |
| Weightweight | Sample | list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | — | webhooks · 1 flag |
Irregular rhythm notifications (IRN) 1
Scope family irn
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Irregular Rhythm Notificationirregular-rhythm-notification | Session | list | — | — |
Logged symptoms 1
Scope family logged_symptoms
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Symptomssymptoms | Sample | create, update, batchDelete | — | 1 flag |
Mindfulness 1
Scope family mindfulness
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Moodsmoods | Sample | create, update, batchDelete | — | 1 flag |
Nutrition 4
Scope family nutrition
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Foodfood | Food | list, get | — | 1 flag |
| Food Measurement Unitfood-measurement-unit | Food | list, get | — | 1 flag |
| Hydration Loghydration-log | Session | list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | — | webhooks · 2 flags |
| Nutrition Lognutrition-log | Session | list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | — | webhooks · 2 flags |
Reproductive health 2
Scope family reproductive_health
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Menstrual Periodmenstrual-period | Interval | create, update, batchDelete | — | 1 flag |
| Ovulation Testovulation-test | Sample | create, update, batchDelete | — | 1 flag |
Sleep 1
Scope family sleep
| Data type | Record type | Operations | Storage | Badges |
|---|---|---|---|---|
| Sleepsleep | Session | list, get, reconcile, create, update, batchDelete | — | webhooks · 1 flag |
Methods
The v4 discovery document (revision 20261014) defines 27 methods, 9 of them on users.dataTypes.dataPoints. The count is how many of the 44 table types list an operation that maps to the method.
| Method | Path template | Types | Google’s description |
|---|---|---|---|
batchDelete | POST v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints:batchDelete | 11 | Delete a batch of identifyable data points. |
create | POST v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints | 11 | Creates a single identifiable data point. |
dailyRollUp | POST v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints:dailyRollUp | 20 | Roll up data points over civil time intervals for supported data types. |
exportExerciseTcx | GET v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints/{dataPointsId}:exportExerciseTcx | 0 | Exports exercise data in TCX format. IMPORTANT: HTTP clients must append ?alt=media to the request URL to download the raw TCX file. |
get | GET v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints/{dataPointsId} | 11 | Get a single identifyable data point. |
list | GET v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints | 37 | Query user health and fitness data points. |
patch | PATCH v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints/{dataPointsId} | 11 | Updates a single identifiable data point. If a data point with the specified name is not found, the request will fail. |
reconcile | GET v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints:reconcile | 33 | Reconcile data points from multiple data sources into a single data stream. |
rollUp | POST v4/users/{usersId}/dataTypes/{dataTypesId}/dataPoints:rollUp | 20 | Roll up data points over physical time intervals for supported data types. |
Google’s data-types page on the rollup range: “A maximum query range of 14 days for calories-in-heart-rate-zone, heart-rate, active-minutes, and total-calories.” and “A maximum query range of 90 days for all other data types.” The table’s “update” has no method of that name; Google’s endpoint-mapping table points updates at patch, and each type that lists it carries a flag saying so.
The other 18 methods
projects.subscribers.create—POST v4/projects/{projectsId}/subscribers— Registers a new subscriber endpoint to receive notifications. A subscriber represents an application or service that wishes to receive data change notifications for users who have granted consent.projects.subscribers.delete—DELETE v4/projects/{projectsId}/subscribers/{subscribersId}— Deletes a subscriber registration. This will stop all notifications to the subscriber's endpoint.projects.subscribers.list—GET v4/projects/{projectsId}/subscribers— Lists all subscribers registered within the owned Google Cloud Project.projects.subscribers.patch—PATCH v4/projects/{projectsId}/subscribers/{subscribersId}— Updates the configuration of an existing subscriber, such as the endpoint URI or the data types it's interested in.projects.subscribers.subscriptions.create—POST v4/projects/{projectsId}/subscribers/{subscribersId}/subscriptions— Creates a subscription for a specific user to a specific subscriber. This method requires the subscriber to have aSubscriptionCreatePolicyset toMANUALfor the given data types.projects.subscribers.subscriptions.delete—DELETE v4/projects/{projectsId}/subscribers/{subscribersId}/subscriptions/{subscriptionsId}— Deletes a specific user subscription, stopping notifications for this user to this subscriber.projects.subscribers.subscriptions.list—GET v4/projects/{projectsId}/subscribers/{subscribersId}/subscriptions— Lists all active subscriptions for a given subscriber. This can be filtered, for example, by user or data type.projects.subscribers.subscriptions.patch—PATCH v4/projects/{projectsId}/subscribers/{subscribersId}/subscriptions/{subscriptionsId}— Updates the data types for an existing user subscription.shl.m.getShlManifest—POST v4/shl/m/{externalShlId}— Forward a manifest request for a given SHLshl.r.get—GET v4/shl/r/{externalShlId}/{resourceToken}— Forward a resource request for a given SHLusers.getIdentity—GET v4/users/{usersId}/identity— Gets the user's identity. It includes the legacy Fitbit user ID and the Google user ID and it can be used by migrating clients to map identifiers between the two systems.users.getIrnProfile—GET v4/users/{usersId}/irnProfile— Returns user's IRN Profile details.users.getProfile—GET v4/users/{usersId}/profile— Returns user Profile details.users.getSettings—GET v4/users/{usersId}/settings— Returns user settings details.users.updateProfile—PATCH v4/users/{usersId}/profile— Updates the user's profile details.users.updateSettings—PATCH v4/users/{usersId}/settings— Updates the user's settings details.users.pairedDevices.get—GET v4/users/{usersId}/pairedDevices/{pairedDevicesId}— Returns user's Device.users.pairedDevices.list—GET v4/users/{usersId}/pairedDevices— Returns the user's list of paired 1P trackers and smartwatches.
Rate limits
Google’s default quotas, as its rate-limits page prints them:
| Metric | Default limit | Google’s QPS impact analysis |
|---|---|---|
| Per project (daily) | 86.4M requests / day | ~1,000 QPS sustained |
| Per project (minutely) | 120,000 requests / minute | ~2,000 QPS burst |
| Per user (minutely) | 300 requests / minute | Standard: 5 QPS per user Unverified applications: Max 250 QPS total (capped at 100 users @ 2.5 QPS per user) |
“When your application exceeds an allocated rate limit, the API rejects the request and returns the error 429 Too Many Requests.” — Google’s rate-limits page, last updated 2026-05-18. Verification, quota increases and 429 handling.
Release history
The 8 dated entries in Google’s release notes, newest first, with the headings Google gives each.
New Beta Channel · New Data Type · New API Guide
New Scopes · New Data Types · Highlighted Documentation Updates
Updated migration guidance · New Promote Google Health page
Google Health Status Dashboard
Google Health API parity tool
New Scopes · Scope Name Changes · New Data Types · New Endpoints · Webhooks · Highlighted Documentation Updates
New Data Types · New Endpoints · Webhook Support · Additional features
Core features highlights · Supported Data Types · Key Endpoints for Interaction
Where Google’s pages disagree
Comparing the data-types table with the Scopes page, the Fitbit mapping tables, the webhooks guide, the release notes and the discovery documents finds 31 disagreements, across 20 data types and the scope lists. They are published as found; none is corrected here.
- Rollup missing from the table (4): activity-level, daily-heart-rate-variability, daily-resting-heart-rate
- Operation name differs (11): body-fat, exercise, height, hydration-log, menstrual-period, moods, nutrition-log, ovulation-test, sleep, symptoms, weight
- No v4 DataPoint field (3): calories-in-heart-rate-zone, skin-temperature-sensors, total-calories
- Method missing from the table (1): exercise
- Reference link points elsewhere (1): floors
- Scope missing from the discovery document (5): food, food-measurement-unit, hydration-log, nutrition-log
- Scope missing from the Scopes page (3)
- Mapped type missing from the data-types table (1)
- Release note and webhook pages differ (1): total-calories
- Restricted-scope wording differs (1)
The ones that concern no single data type
Scope missing from the Scopes page
The v4 discovery document defines .reproductive_health.readonly ("See your Google Health reproductive health data"); the Scopes page does not list it.
- the v4 discovery document: “https://www.googleapis.com/auth/googlehealth.reproductive_health.readonly”
- the v4 discovery document: “See your Google Health reproductive health data”
Scope missing from the Scopes page
The v4 discovery document defines .logged_symptoms.readonly ("See your Google Health logged symptoms data"); the Scopes page does not list it.
- the v4 discovery document: “https://www.googleapis.com/auth/googlehealth.logged_symptoms.readonly”
- the v4 discovery document: “See your Google Health logged symptoms data”
Scope missing from the Scopes page
The v4 discovery document defines .mindfulness.readonly ("See your Google Health mindfulness data"); the Scopes page does not list it.
- the v4 discovery document: “https://www.googleapis.com/auth/googlehealth.mindfulness.readonly”
- the v4 discovery document: “See your Google Health mindfulness data”
Scope missing from the discovery document
The Scopes page documents .nutrition.readonly ("See your Google Health nutrition data."); the v4 discovery document does not define it.
- Google's Scopes page: “.nutrition.readonly”
- Google's Scopes page: “See your Google Health nutrition data.”
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
Restricted-scope wording differs
Google's pages word the restricted-scope rule differently: About the Google Health API says "all"; App verification says "most".
- Google's About page: “All Google Health API scopes are categorized as Restricted, necessitating a privacy and security review for access.”
- Google's app-verification page: “Most scopes for the Google Health API are restricted, which means you must complete verification before your app is publicly available.”
Topics
- ScopesEvery scope Google documents, the data types each covers, the ones only the discovery document defines, and the Fitbit Web API scope each replaces.
- Fitbit Web API mappingGoogle's own tables: Fitbit Web API scopes, data types and endpoints to their Google Health API equivalents, plus the calculation rules that changed.
- Access and rate limitsOAuth app verification, the CASA security assessment, the 100-user cap on unverified apps, the default quotas and what to do on a 429.
- WebhooksSubscribers, endpoint verification, automatic and manual subscriptions, the notification payload, signatures and the 7-day retry window.
- Errors and troubleshootingEvery reason in Google's v4 error catalog, the troubleshooting tables by status code, and ACCOUNT_NOT_LINKED in full.
The Fitbit side, on this site
- Fitbit Web API retirementThe turn-off dates graded confirmed against reported, and the migration path by integration shape.
- Migrate to the Google Health APIThe move step by step: audit, new console and OAuth, endpoint mapping, re-consent in cohorts.
- Integrate the Fitbit APIHow the legacy Fitbit Web API integration is built, and what its successor changes.
- Fitbit API alternativesThe Google Health API against aggregators and single-device APIs, by use case.
- Fitbit API pricingWhat the Fitbit integration costs, and what is and is not public about its successor.
Questions
How many data types does the Google Health API have?
Google's data-types table listed 44 on 2026-10-17: 43 in the stable v4 channel and 1 tagged v4beta (skin-temperature-sensors), across 9 scope families. The v4 discovery document (revision 20261014) defines 44 fields on its DataPoint schema; not every table type has one, and not every field has a table row — the differences are published on this page as flags.
Where is the Google Health API discovery document?
At https://health.googleapis.com/$discovery/rest?version=v4, with the preview channel at https://health.googleapis.com/$discovery/rest?version=v4beta. Read on 2026-10-17, the v4 document ("Google Health API", revision 20261014) defined 27 methods and 151 schemas; the v4beta document (revision 20261014) defined 154 schemas, 3 of them (SkinTemperatureSensors, SensorData and SensorMetadata) not in v4. This reference is generated from both.
Which Google Health API data types can apps write to?
11 of the 44 list a write operation (create, update or batchDelete) in Google's data-types table: body-fat, exercise, height, hydration-log, menstrual-period, moods, nutrition-log, ovulation-test, sleep, symptoms and weight. The table lists no write operation for the other 33. Each writable type lists a .writeonly scope. Google's Scopes page: "Only configure "write" access (for example, using a writeonly scope) if you are sending data to Google Health."
What is the Google Health API base URL?
Google's Fitbit migration specification: "Service Endpoint: The base HTTP URL changes to https://health.googleapis.com." The v4 discovery document's rootUrl is https://health.googleapis.com/, and every method path in it starts with v4/.
Sources checked
- About the Google Health API — last updated 2026-09-29 · 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 Health API discovery document (v4beta) — revision 20261014 · read 2026-10-17
- Overview — last updated 2026-09-28 · read 2026-10-17
- App verification — last updated 2026-09-25 · read 2026-10-17
- API specifications — last updated 2026-09-22 · read 2026-10-17
- Quotas and Rate Limits — last updated 2026-05-18 · read 2026-10-17
- Webhook subscriptions — last updated 2026-09-24 · read 2026-10-17
- Scopes — last updated 2026-10-09 · read 2026-10-17
- Release notes — last updated 2026-10-09 · 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.