Workout types on HealthKit, Health Connect, Wear OS and the Google Health API
412 constants on 4 platforms · 87 crosswalk rows · 6 source conflicts · read from the sources on 2026-10-18
HealthKit has 84 HKWorkoutActivityType cases, Health Connect 61 ExerciseSessionRecord.EXERCISE_TYPE_* constants, Wear OS Health Services 85 ExerciseType constants and the Google Health API 182 Exercise.exerciseType values. None of the 9 Apple and Google pages read for this reference maps one list onto another, so its crosswalk joins two constants only when their names match once the EXERCISE_TYPE_ prefix, letter case and separators are removed: 87 rows, 28 of them on all four platforms. HKWorkoutActivityType.cycling and ExerciseSessionRecord.EXERCISE_TYPE_BIKING have different names, so they stay apart. Read from the sources on 2026-10-18.
The four enumerations
Each platform names the kind of workout with its own list, read here from that platform’s own pages. Each list page shows every constant with the source’s wording and the constants of the same name elsewhere.
| Platform | Enumeration | Constants | Share a name | Numbers |
|---|---|---|---|---|
| Apple HealthKitread 2026-10-18 | HKWorkoutActivityTypedeclared as enum HKWorkoutActivityType in Swift and enum HKWorkoutActivityType : NSUInteger; in Objective-C | 84 | 53 | Apple's documentation prints no raw value for any case, so this reference carries none. |
| Android Health Connectread 2026-10-18 | ExerciseSessionRecord.EXERCISE_TYPE_*Int constants on the Jetpack ExerciseSessionRecord class | 61 | 60 | The Jetpack reference prints every value; the platform API (android.health.connect, API level 34) numbers the same types differently in ExerciseSessionType, and the library converts between the two. |
| Wear OS Health Servicesread 2026-10-18 | ExerciseTypeExerciseType objects, each with an int id and a name, on the Jetpack ExerciseType class | 85 | 65 | The reference does not print the ids; the androidx source it links as View Source does, and the ids here are read from it. |
| Google Health APIread 2026-10-17 | Exercise.exerciseTypestring enum values on the exercise data type's exerciseType field | 182 | 75 | A REST enum: the value is the string itself. |
How two constants end up on the same row
Two constants share a crosswalk row only when their names are identical after removing a leading EXERCISE_TYPE_ (Health Connect's prefix, which the Google Health API also uses on EXERCISE_TYPE_UNSPECIFIED), lowercasing, and removing every character that is not a letter or a digit.
That is the only join. No row is made by meaning, so a row says the names match and nothing more: it does not say the platforms define the activity the same way, record the same metrics for it, or estimate its calories alike. The rule leaves HKWorkoutActivityType.cycling and ExerciseSessionRecord.EXERCISE_TYPE_BIKING, HKWorkoutActivityType.americanFootball and ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AMERICAN and HKWorkoutActivityType.pickleball and PICKELBALL on separate rows, because their names differ.
A second kind of row would hold mappings a source states, with the source’s own row as evidence. The pages read on 2026-10-18 state none; the search is listed below.
Crosswalk: the same name on two or more platforms (87)
28 rows join all four platforms, 23 join three and 36 join two. Each cell links to the constant’s row on its platform page; numbers are shown where the platform prints one.
Same name, different number
Health Connect and Wear OS Health Services both identify a type by an integer. 59 constants have the same name on both, and 6 of them carry different integers. Neither Google page says the two numberings are interchangeable.
| Health Connect (Jetpack value) | Wear OS (ExerciseType id) |
|---|---|
EXERCISE_TYPE_RUGBY = 55 | RUGBY = 57 |
EXERCISE_TYPE_RUNNING = 56 | RUNNING = 55 |
EXERCISE_TYPE_FOOTBALL_AMERICAN = 28 | FOOTBALL_AMERICAN = 29 |
EXERCISE_TYPE_FOOTBALL_AUSTRALIAN = 29 | FOOTBALL_AUSTRALIAN = 30 |
EXERCISE_TYPE_FRISBEE_DISC = 31 | FRISBEE_DISC = 28 |
EXERCISE_TYPE_RUNNING_TREADMILL = 57 | RUNNING_TREADMILL = 56 |
Health Connect also numbers its own types twice. The platform API (android.health.connect, API level 34) gives 61 of the 61 types a different integer from the Jetpack library’s ExerciseSessionRecord constants, and the library converts between the two; the Health Connect page lists both numbers for every type.
Constants with no same-name counterpart
A constant is unmatched when no other platform spells its name the same way under the rule. That is a fact about names, not a finding that the activity has no equivalent.
- Apple HealthKit: 31 of 84
- Android Health Connect: 1 of 61 (EXERCISE_TYPE_OTHER_WORKOUT)
- Wear OS Health Services: 20 of 85
- Google Health API: 107 of 182
What each platform says about a type it has no constant for
Each platform has a catch-all. These are the sources’ own words about it, quoted; nothing here is our advice.
Apple HealthKit: HKWorkoutActivityType.other
- “The constant for a workout that does not match any of the other workout activity types.” (Apple's page for each HKWorkoutActivityType case (84 JSON documents))
- “If your app uses the
HKWorkoutActivityType.swimmingorHKWorkoutActivityType.otheractivity type, you must explain how your app calculates workout data when sensor information is not available. For more information, see theHuman Interface Guidelines.” (Apple's page for each HKWorkoutActivityType case (84 JSON documents))
Android Health Connect: ExerciseSessionRecord.EXERCISE_TYPE_OTHER_WORKOUT
- “Can be used to represent any generic workout that does not fall into a specific category. Any unknown new value definition will also fall automatically into
EXERCISE_TYPE_OTHER_WORKOUT. Next Id: 84.” (ExerciseSessionRecord (Jetpack reference)) - “internal fun Int.toSdkExerciseSessionType(): Int { return PLATFORM_TO_SDK_EXERCISE_SESSION_TYPE[this] ?: ExerciseSessionRecord.EXERCISE_TYPE_OTHER_WORKOUT }” (IntDefMappings.kt (androidx source))
Wear OS Health Services: ExerciseType.UNKNOWN
- “UNKNOWN: The current exercise type of the user is unknown or not set.” (ExerciseType (Jetpack reference, Java))
- “fromId(id): Returns the
ExerciseTypebased on its uniqueid. If theiddoesn't map to an particularExerciseType, thenExerciseType.UNKNOWNis returned by default.” (ExerciseType (Jetpack reference, Java)) - “Each ExerciseType supports certain data types for metrics and for exercise goals. Check these capabilities at startup, because they can vary depending on the device. A device might not support a certain exercise type, or it might not support a specific function, such as auto-pause.” (Record an exercise with ExerciseClient)
Google Health API: OTHER
- “OTHER: Other type.” (Google Health API v4 discovery document (revision 20261014), as read for this site's Google Health API reference)
- “displayName: 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 onexercise_type(e.g., "Walking" forWALKING). Ifexercise_typeisOTHER, this field can contain the user's custom, free-form display name.” (Google Health API v4 discovery document (revision 20261014), as read for this site's Google Health API reference)
Mappings the sources state
None between two of the four enumerations. These 9 pages were read on 2026-10-18 looking for one; the generator refuses to publish if any of them grows a table row or list item that names constants of two enumerations, so a mapping published later is read by a person instead of missed.
- Health Connect data types · read 2026-10-18
- Develop Workout Experiences with Health Connect · read 2026-10-18
- Add exercise routes (Health Connect) · read 2026-10-18
- Training plans (Health Connect) · read 2026-10-18
- Fit migration guide · read 2026-10-18
- Health Services on Wear OS · read 2026-10-18
- Integrate a Wear OS module · read 2026-10-18
- Develop Workout Experiences with Google Health API · read 2026-10-18
- HKWorkoutActivityType · read 2026-10-18
In the Health Connect library source, two tables translate exercise types, and neither joins two of the four lists. IntDefMappings.kt converts each Jetpack constant to the platform API’s constant of the same type; that is Health Connect mapped to itself, shown per constant on the Health Connect page. ExerciseSessionRecord.kt also keeps EXERCISE_TYPE_STRING_TO_INT_MAP, 83 lowercase names mapped to EXERCISE_TYPE_ constants, marked @RestrictTo(RestrictTo.Scope.LIBRARY), so not an API an app may call. One line reads "para_gliding" to EXERCISE_TYPE_PARAGLIDING, // Historic typo in whs with para_gliding. Neither Google’s reference pages nor the source document the table as a mapping from Wear OS ExerciseType, so this reference joins nothing by it.
Where Google’s pages disagree, with each other or with themselves (6)
Found by checking the sources against each other, and each constant’s description against its name, while generating this reference. Each is published as found, with the texts concerned; none is corrected here.
- Listed by a guide, not by the referenceEXERCISE_TYPE_UNKNOWNGoogle's Health Connect data-types guide (last updated 2026-09-23) lists EXERCISE_TYPE_UNKNOWN under "Exercise types" in its ExerciseSessionRecord row, one of 62 names there; the Jetpack ExerciseSessionRecord reference does not define it, and neither does the androidx source.
- “EXERCISE_TYPE_UNKNOWN” (Health Connect data types)
- A description that reads like another constant'sEXERCISE_SEGMENT_TYPE_DUMBBELL_FRONT_RAISEGoogle's ExerciseSegment reference describes EXERCISE_SEGMENT_TYPE_DUMBBELL_FRONT_RAISE (15) as "Use this type for right arm dumbbell curl.", the words of the constant before it, EXERCISE_SEGMENT_TYPE_DUMBBELL_CURL_RIGHT_ARM (14), which it gives no description; the androidx source has the same comment above EXERCISE_SEGMENT_TYPE_DUMBBELL_FRONT_RAISE.
- “Use this type for right arm dumbbell curl.” (ExerciseSegment (Jetpack reference))
- “/** Use this type for right arm dumbbell curl. */ public const val EXERCISE_SEGMENT_TYPE_DUMBBELL_FRONT_RAISE: Int = 15” (ExerciseSegment.kt (androidx source))
- A description that reads like another constant'sEXERCISE_SEGMENT_TYPE_SINGLE_ARM_TRICEPS_EXTENSIONGoogle's ExerciseSegment reference describes EXERCISE_SEGMENT_TYPE_SINGLE_ARM_TRICEPS_EXTENSION (49) as "Use this type for shoulder press.", the words of the constant before it, EXERCISE_SEGMENT_TYPE_SHOULDER_PRESS (48), which it gives no description; the androidx source has the same comment above EXERCISE_SEGMENT_TYPE_SINGLE_ARM_TRICEPS_EXTENSION.
- “Use this type for shoulder press.” (ExerciseSegment (Jetpack reference))
- “/** Use this type for shoulder press. */ public const val EXERCISE_SEGMENT_TYPE_SINGLE_ARM_TRICEPS_EXTENSION: Int = 49” (ExerciseSegment.kt (androidx source))
- Deprecated on one API, not the otherEXERCISE_TYPE_GUIDED_BREATHINGThe platform API deprecates EXERCISE_SESSION_TYPE_GUIDED_BREATHING in API level 37; the Jetpack reference does not mark EXERCISE_TYPE_GUIDED_BREATHING, which the library converts to it, deprecated.
- “This constant was deprecated in API level 37. Use
MindfulnessSessionRecordof the corresponding typeMindfulnessSessionRecord.MINDFULNESS_SESSION_TYPE_BREATHING.” (ExerciseSessionType (Android platform reference)) - “ExerciseSessionRecord.EXERCISE_TYPE_GUIDED_BREATHING to @Suppress("DEPRECATION") PlatformExerciseSessionType.EXERCISE_SESSION_TYPE_GUIDED_BREATHING” (IntDefMappings.kt (androidx source))
- “This constant was deprecated in API level 37. Use
- Platform constant with no Jetpack counterpartEXERCISE_SESSION_TYPE_UNKNOWNThe platform ExerciseSessionType reference lists EXERCISE_SESSION_TYPE_UNKNOWN = 0; no Jetpack constant maps to it in IntDefMappings.kt, and the library's toSdkExerciseSessionType() turns an unmapped platform value into EXERCISE_TYPE_OTHER_WORKOUT.
- “Use this type if the type of the exercise session is not known.” (ExerciseSessionType (Android platform reference))
- “internal fun Int.toSdkExerciseSessionType(): Int { return PLATFORM_TO_SDK_EXERCISE_SESSION_TYPE[this] ?: ExerciseSessionRecord.EXERCISE_TYPE_OTHER_WORKOUT }” (IntDefMappings.kt (androidx source))
- Guide sample names a member the reference lacksExerciseSessionRecord.ExerciseType.RUNNING2 Health Connect guides' samples write exerciseType = ExerciseSessionRecord.ExerciseType.RUNNING; the ExerciseSessionRecord reference lists no ExerciseType member, and its constant is EXERCISE_TYPE_RUNNING = 56.
- “exerciseType = ExerciseSessionRecord.ExerciseType.RUNNING” (Add exercise routes (Health Connect))
- “exerciseType = ExerciseSessionRecord.ExerciseType.RUNNING” (Training plans (Health Connect))
- “const val EXERCISE_TYPE_RUNNING = 56: Int” (ExerciseSessionRecord (Jetpack reference))
Activities with a page of their own (9)
A crosswalk row gets a page of its own only when it joins at least 3 platforms and the sources state at least 2 things about the activity beyond its names: Apple's discussion or deprecation note on the HealthKit case, the Health Connect library's segment table naming the session type, a Jetpack or Wear OS reference description, or a platform deprecation. Names, numbers, one-line abstracts and availability do not count.
- Elliptical4 platforms · 2 facts from the sources
- Hiking4 platforms · 2 facts from the sources
- Pilates4 platforms · 2 facts from the sources
- Running4 platforms · 2 facts from the sources
- Walking4 platforms · 2 facts from the sources
- Yoga4 platforms · 2 facts from the sources
- Calisthenics3 platforms · 2 facts from the sources
- High intensity interval training3 platforms · 2 facts from the sources
- Stair climbing3 platforms · 2 facts from the sources
Download the crosswalk
One row per constant on each platform, with its number where printed, the source’s description, the crosswalk key and the same-name constants elsewhere, under CC BY 4.0: workout-types-crosswalk-2026.json and workout-types-crosswalk-2026.csv, listed with the other open datasets.
The platform pages: HKWorkoutActivityType · ExerciseSessionRecord.EXERCISE_TYPE_* · ExerciseType · Exercise.exerciseType. Row anchors follow one pattern, so /workout-types/health-connect#t-exercise_type_running lands on a constant.
Questions
Is there an official mapping between HealthKit workout types and Health Connect exercise types?
Not on any page this reference read. Apple documents 84 HKWorkoutActivityType cases and Google 61 ExerciseSessionRecord constants, and none of the 9 Apple and Google pages checked on 2026-10-18 maps one list onto the other. Going by names alone, 30 of the HealthKit cases match a Health Connect constant once the EXERCISE_TYPE_ prefix, case and separators are removed; the rest have no same-name counterpart.
Can a Wear OS ExerciseType id be stored as a Health Connect exercise type value?
Not by number. 59 constants have the same name on both, and 6 of them carry different integers: RUGBY is 55 on Health Connect and 57 on Wear OS; RUNNING is 56 on Health Connect and 55 on Wear OS; FOOTBALL_AMERICAN is 28 on Health Connect and 29 on Wear OS. Neither Google page says the two numberings are interchangeable; the names line up, the numbers do not.
Why does a Health Connect exercise type have two different integer values?
Health Connect has two APIs. The Jetpack library's ExerciseSessionRecord constants and the platform API's ExerciseSessionType constants (API level 34) number the same types differently: 61 of 61 pairs differ, for example EXERCISE_TYPE_RUNNING is 56 in the library and EXERCISE_SESSION_TYPE_RUNNING is 33 on the platform. The library converts between them in IntDefMappings.kt, with toPlatformExerciseSessionType() one way and toSdkExerciseSessionType() the other.
Which platform has the most workout types: HealthKit, Health Connect, Wear OS or the Google Health API?
In the sources as read for this reference (the Google Health API's on 2026-10-17, the others on 2026-10-18): the Google Health API's exerciseType enum has 182 values (one of them EXERCISE_TYPE_UNSPECIFIED), Wear OS Health Services 85 public ExerciseType constants, HealthKit 84 HKWorkoutActivityType cases and Health Connect 61 EXERCISE_TYPE_ constants. 107 of the Google Health API values match no other platform's names.
Sources (22)
Read by scripts/fetch-workout-types.mjs, which refuses to publish when a count differs from the last verified read or a normalisation would put two constants of one platform on one row. GitHub files are read on the branch shown; the hash is SHA-256 of the bytes served.
- HKWorkoutActivityType · read 2026-10-18 · sha256 b3e6bf7bd9d5
- ExerciseSessionRecord (Jetpack reference) · read 2026-10-18 · page last updated 2026-08-26 · sha256 21ca77ecf582
- ExerciseSegment (Jetpack reference) · read 2026-10-18 · page last updated 2026-08-26 · sha256 355facabc40c
- ExerciseSessionType (Android platform reference) · read 2026-10-18 · page last updated 2026-08-03 · sha256 7dd4604a4779
- ExerciseSessionRecord.kt (androidx source) · androidx/androidx, branch androidx-main · read 2026-10-18 · sha256 0c1f0af31734
- ExerciseSegment.kt (androidx source) · androidx/androidx, branch androidx-main · read 2026-10-18 · sha256 60a01a3fdec0
- IntDefMappings.kt (androidx source) · androidx/androidx, branch androidx-main · read 2026-10-18 · sha256 12aa0de76928
- ExerciseType (Jetpack reference, Java) · read 2026-10-18 · page last updated 2026-08-06 · sha256 aecc422742e2
- ExerciseType (Jetpack reference, Kotlin) · read 2026-10-18 · page last updated 2026-08-06 · sha256 336edaebf601
- ExerciseType.kt (androidx source) · androidx/androidx, branch androidx-main · read 2026-10-18 · sha256 4878a5203cdc
- Record an exercise with ExerciseClient · read 2026-10-18 · page last updated 2026-09-23 · sha256 cea0071de227
- Health Connect data types · read 2026-10-18 · page last updated 2026-09-23 · sha256 ce27cdcefeec
- Develop Workout Experiences with Health Connect · read 2026-10-18 · page last updated 2026-09-23 · sha256 8e2b3b54b514
- Add exercise routes (Health Connect) · read 2026-10-18 · page last updated 2026-09-23 · sha256 1bfc55957da5
- Training plans (Health Connect) · read 2026-10-18 · page last updated 2026-09-23 · sha256 886cce594b9f
- Fit migration guide · read 2026-10-18 · page last updated 2026-09-10 · sha256 73fe00d608b6
- Health Services on Wear OS · read 2026-10-18 · page last updated 2026-09-22 · sha256 9c06426c82bc
- Integrate a Wear OS module · read 2026-10-18 · page last updated 2026-09-22 · sha256 a7ee84d17b6b
- Develop Workout Experiences with Google Health API · read 2026-10-18 · page last updated 2026-10-09 · sha256 e2b2109251de
- Apple's page for each HKWorkoutActivityType case (84 JSON documents) · read 2026-10-18 · sha256 91c341579aea
- Apple's HealthKit documentation JSON, as read for this site's HealthKit identifier reference · read 2026-10-02 · sha256 1713010fe143
- Google Health API v4 discovery document (revision 20261014), as read for this site's Google Health API reference · read 2026-10-17 · sha256 00201907bf42
Compiled by AIFitnessAPI from Apple’s and Google’s own documentation and source. The sources remain the authority.