Exercise: the Google Health API exercise data type
Read from Google’s documentation on 2026-10-17 · discovery document revision 20261014 · Google’s data-types page last updated 2026-10-06
Exercise (exercise) is a Session data type in the Google Health API. Google's data-types table lists list, get, reconcile, create, update and batchDelete for it under the .activity_and_fitness.readonly and .activity_and_fitness.writeonly scopes. The table marks it with webhook support. Google's Fitbit migration table maps the Fitbit Web API's Recorded activity data to it.
Exercise at a glance
From the Exercise row of Google’s data-types table, joined to the discovery document’s DataPoint schema.
- Display name
- Exercise
- dataType (in endpoint URLs)
exercise- filter parameter
exerciseGoogle: “The identifier separated by underscores (for example,active_minutes) used as the value for thedataTypefilter parameter in daily rollup and rollup requests.”- Record type
- Session — Google: “Represents a continuous block of recording, such as a workout or an electrocardiogram (ECG) session.”
- Storage resolution
- not stated in Google’s table
- Webhook support
- Yes · automatic-subscription token WEBHOOK_DATA_TYPE_EXERCISE
- True zeros support
- Not marked in Google’s table
- Channel
- v4
- DataPoint field
DataPoint.exercise→ExerciseIts description: “Optional. Data for points in theexercisesession data type collection.”- Compatible devices
- 28 in Google’s table
Operations and request paths
The operations Google’s table lists for exercise, each matched to its users.dataTypes.dataPoints method in the discovery document. The path is the documented path template (the method’s flatPath on https://health.googleapis.com/) with {dataTypesId} filled in as exercise. Google on {user}: “The {user} can be either the alias me or the authenticated user's numeric Health User ID (retrieved via GetIdentity).”
| Table lists | Method | Documented path template |
|---|---|---|
list | list | GET https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints |
get | get | GET https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints/{dataPointsId} |
reconcile | reconcile | GET https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints:reconcile |
create | create | POST https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints |
update | patchvia Google’s endpoint-mapping table (flagged below) | PATCH https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints/{dataPointsId} |
batchDelete | batchDelete | POST https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints:batchDelete |
Every method, and how many of the data types list it: the methods overview.
Scopes
The scopes Google’s table lists for exercise, as full URLs, with the consent text Google’s Scopes page gives each. Every Google Health API scope.
| Scope | Access | Google’s permission text |
|---|---|---|
https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly | read | See your Google Health activity and fitness data. |
https://www.googleapis.com/auth/googlehealth.activity_and_fitness.writeonly | write | Add activity and fitness data to Google Health, and edit or delete the data it adds. |
Fields of Exercise
The schema the discovery document gives DataPoint.exercise, required fields first. Types are as the discovery document states them; the label is the word Google’s description opens with. The schemas its fields refer to follow, one level deep.
Exercise — Google: “An exercise that stores information about a physical activity.”
| Field | Type | Google’s description |
|---|---|---|
displayNameRequired | string | Required. The localized, human-readable name of the exercise. For all exercise types other than OTHER, the system ignores client input and overrides this field with a generated name based on exercise_type (e.g., "Walking" for WALKING). If exercise_type is OTHER, this field can contain the user's custom, free-form display name. |
exerciseTypeRequired | string | Required. The type of activity performed during an exercise.
|
intervalRequired | SessionTimeInterval | Required. Observed exercise interval |
metricsSummaryRequired | MetricsSummary | Required. Summary metrics for this exercise ( ) |
activeDurationOptional | string/google-duration | Optional. Duration excluding pauses. |
createTimeOutput only | string/google-datetime | Output only. Represents the timestamp of the creation of the exercise. |
exerciseEventsOptional | array<ExerciseEvent> | Optional. Exercise events that happen during an exercise, such as pause & restarts. |
exerciseMetadataOptional | ExerciseMetadata | Optional. Additional exercise metadata. |
notesOptional | string | Optional. Standard free-form notes captured at manual logging. |
splitsOptional | array<SplitSummary> | Optional. The default split is 1 km or 1 mile. - if the movement distance is less than the default, then there are no splits - if the movement distance is greater than or equal to the default, then we have splits |
splitSummariesOptional | array<SplitSummary> | Optional. Laps or splits recorded within an exercise. Laps could be split based on distance or other criteria (duration, etc.) Laps should not be overlapping with each other. |
updateTimeOutput only | string/google-datetime | Output only. This is the timestamp of the last update to the exercise. |
SessionTimeInterval
Google: “Represents a time interval of session data point, which bundles multiple observed metrics together.”
| Field | Type | Google’s description |
|---|---|---|
endTimeRequired | string/google-datetime | Required. The end time of the observed session. |
endUtcOffsetRequired | string/google-duration | Required. The offset of the user's local time at the end of the session relative to the Coordinated Universal Time (UTC). |
startTimeRequired | string/google-datetime | Required. The start time of the observed session. |
startUtcOffsetRequired | string/google-duration | Required. The offset of the user's local time at the start of the session relative to the Coordinated Universal Time (UTC). |
civilEndTimeOutput only | CivilDateTime | Output only. Session end time in civil time in the timezone the subject is in at the end of the session. |
civilStartTimeOutput only | CivilDateTime | Output only. Session start time in civil time in the timezone the subject is in at the start of the session. |
MetricsSummary
Google: “Summary metrics for an exercise.”
| Field | Type | Google’s description |
|---|---|---|
activeZoneMinutesOptional | string/int64 | Optional. Total active zone minutes for the exercise. |
averageHeartRateBeatsPerMinuteOptional | string/int64 | Optional. Average heart rate during the exercise. |
averagePaceSecondsPerMeterOptional | number/double | Optional. Average pace in seconds per meter. |
averageSpeedMillimetersPerSecondOptional | number/double | Optional. Average speed in millimeters per second. |
caloriesKcalOptional | number/double | Optional. Total calories burned by the user during the exercise. |
distanceMillimetersOptional | number/double | Optional. Total distance covered by the user during the exercise. |
elevationGainMillimetersOptional | number/double | Optional. Total elevation gain during the exercise. |
heartRateZoneDurationsOptional | TimeInHeartRateZones | Optional. Time spent in each heart rate zone. |
mobilityMetricsOptional | MobilityMetrics | Optional. Mobility workouts specific metrics. Only present in the advanced running exercises. |
runVo2MaxOptional | number/double | Optional. Run VO2 max value for the exercise. Only present in the running exercises at the top level as in the summary of the whole exercise. |
stepsOptional | string/int64 | Optional. Total steps taken during the exercise. |
totalSwimLengthsOptional | number/double | Optional. Number of full pool lengths completed during the exercise. Only present in the swimming exercises at the top level as in the summary of the whole exercise. |
ExerciseEvent
Google: “Represents instantaneous events that happen during an exercise, such as start, stop, pause, split.”
| Field | Type | Google’s description |
|---|---|---|
eventTimeRequired | string/google-datetime | Required. Exercise event time |
eventUtcOffsetRequired | string/google-duration | Required. Exercise event time offset from UTC |
exerciseEventTypeRequired | string | Required. The type of the event, such as start, stop, pause, resume.
|
ExerciseMetadata
Google: “Additional exercise metadata.”
| Field | Type | Google’s description |
|---|---|---|
hasGpsOptional | boolean | Optional. Whether the exercise had GPS tracking. |
poolLengthMillimetersOptional | string/int64 | Optional. Pool length in millimeters. Only present in the swimming exercises. |
SplitSummary
Google: “Represents splits or laps recorded within an exercise. Lap events partition a workout into segments based on criteria like distance, time, or calories.”
| Field | Type | Google’s description |
|---|---|---|
endTimeRequired | string/google-datetime | Required. Lap end time |
endUtcOffsetRequired | string/google-duration | Required. Lap end time offset from UTC |
metricsSummaryRequired | MetricsSummary | Required. Summary metrics for this split. |
splitTypeRequired | string | Required. Method used to split the exercise laps. Users may manually mark the lap as complete even if the tracking is automatic.
|
startTimeRequired | string/google-datetime | Required. Lap start time |
startUtcOffsetRequired | string/google-duration | Required. Lap start time offset from UTC |
activeDurationOutput only | string/google-duration | Output only. Lap time excluding the pauses. |
Fitbit Web API predecessor
Google’s Fitbit Web API → Google Health API data-type table maps Recorded activity to exercise. Google’s note: “Recorded workouts or exercise sessions, which include start/end times, activity types, and session metrics.”
Fitbit Web API scopes Google maps to exercise’s scopes: activity, cardio_fitness.
Google’s full Fitbit Web API mapping tables · the migration playbook
Where Google’s guides name exercise
- “Variable page sizes: Capping limits depend on the endpoint and data type. For most data types, page sizes are capped at a maximum of 10,000. However, for certain data types like
exerciseandsleep, the default and maximum page size is capped at 25. For example, if a client requests all sleep data for the past 10 years, the API will still return only 25 sleep sessions on the first page.”Google's endpoints guide, “Query historical data”
Where Google’s pages disagree
Published as found, with the texts that disagree; nothing here is corrected by us.
Operation name differs
The table lists "update" for exercise, but the discovery document has no method named update; Google's endpoint-mapping table points updates at patch.
- Google's Fitbit migration API specifications: “CREATE & UPDATE Logs”
- Google's Fitbit migration API specifications: “
patchmethod” - the v4 discovery document: “Updates a single identifiable data point. If a data point with the specified
nameis not found, the request will fail.”
Method missing from the table
The discovery document's exportExerciseTcx method is documented for exercise, but the table's operations for exercise do not list it.
- the v4 discovery document: “Exports exercise data in TCX format. IMPORTANT: HTTP clients must append
?alt=mediato the request URL to download the raw TCX file.” - Google's data-types page: “list, get, reconcile, create, update, batchDelete”
- the v4 discovery document: “Exports exercise data in TCX format. IMPORTANT: HTTP clients must append
Compatible devices
The 28 devices Google’s table lists as able to record and sync exercise.
- Fitbit Air
- Fitbit Alta
- Fitbit Alta HR
- Fitbit Blaze
- Fitbit Charge 2
- Fitbit Charge 3
- Fitbit Charge 4
- Fitbit Charge 5
- Fitbit Charge 6
- Fitbit Flex 2
- Fitbit Inspire
- Fitbit Inspire 2
- Fitbit Inspire 3
- Fitbit Inspire HR
- Fitbit Ionic
- Fitbit Luxe
- Fitbit MobileTrack
- Pixel Watch
- Pixel Watch 2
- Pixel Watch 3
- Pixel Watch 4
- Fitbit Sense
- Fitbit Sense 2
- Fitbit Versa
- Fitbit Versa 2
- Fitbit Versa 3
- Fitbit Versa 4
- Fitbit Versa Lite
Google’s documentation
Related on this site
- Workout Detection API: Get Recorded Workout Sessions — the metric across platforms and vendors
- Google Health API webhooks
- Verification and rate limits
- The Fitbit Web API turn-off
Questions
Which OAuth scopes does the Google Health API exercise data type need?
Google's data-types table (read 2026-10-17) lists https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly and https://www.googleapis.com/auth/googlehealth.activity_and_fitness.writeonly for exercise. The Scopes page's consent text: .activity_and_fitness.readonly, "See your Google Health activity and fitness data."; .activity_and_fitness.writeonly, "Add activity and fitness data to Google Health, and edit or delete the data it adds."
Can apps write exercise data to the Google Health API?
Yes. Google's data-types table lists create, update and batchDelete for exercise. create is POST https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints. The table's "update" has no method of that name in the discovery document; Google's endpoint-mapping table points updates at patch, which is PATCH https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints/{dataPointsId}. batchDelete is POST https://health.googleapis.com/v4/users/{usersId}/dataTypes/exercise/dataPoints:batchDelete. Writes need https://www.googleapis.com/auth/googlehealth.activity_and_fitness.writeonly.
How do you aggregate exercise data with the Google Health API?
Not with rollUp or dailyRollUp, going by Google's data-types table: it lists only list, get, reconcile, create, update and batchDelete for exercise. Read the data points with list (or reconcile, where listed) and compute any summary yourself.
What did the Google Health API exercise data type replace in the Fitbit Web API?
Google's Fitbit Web API migration table maps the Fitbit Web API's "Recorded activity" to exercise. Google's note on the row: "Recorded workouts or exercise sessions, which include start/end times, activity types, and session metrics." The Fitbit Web API scopes Google maps to its scopes: activity and cardio_fitness.
Other activity and fitness data types
Sources checked
- 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
- Scopes — last updated 2026-10-09 · read 2026-10-17
- API specifications — last updated 2026-09-22 · 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.