Skip to content
AF

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.

PlatformEnumerationConstantsShare a nameNumbers
Apple HealthKitread 2026-10-18HKWorkoutActivityTypedeclared as enum HKWorkoutActivityType in Swift and enum HKWorkoutActivityType : NSUInteger; in Objective-C8453Apple's documentation prints no raw value for any case, so this reference carries none.
Android Health Connectread 2026-10-18ExerciseSessionRecord.EXERCISE_TYPE_*Int constants on the Jetpack ExerciseSessionRecord class6160The 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-18ExerciseTypeExerciseType objects, each with an int id and a name, on the Jetpack ExerciseType class8565The 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-17Exercise.exerciseTypestring enum values on the exercise data type's exerciseType field18275A 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.

NameHealthKitHealth ConnectWear OSGoogle Health API
BADMINTONbadmintonEXERCISE_TYPE_BADMINTON 2BADMINTON 2BADMINTON
BASEBALLbaseballEXERCISE_TYPE_BASEBALL 4BASEBALL 4BASEBALL
BASKETBALLbasketballEXERCISE_TYPE_BASKETBALL 5BASKETBALL 5BASKETBALL
BOXINGboxingEXERCISE_TYPE_BOXING 11BOXING 11BOXING
CRICKETcricketEXERCISE_TYPE_CRICKET 14CRICKET 14CRICKET
EllipticalellipticalEXERCISE_TYPE_ELLIPTICAL 25ELLIPTICAL 25ELLIPTICAL
FENCINGfencingEXERCISE_TYPE_FENCING 27FENCING 27FENCING
GOLFgolfEXERCISE_TYPE_GOLF 32GOLF 32GOLF
GYMNASTICSgymnasticsEXERCISE_TYPE_GYMNASTICS 34GYMNASTICS 34GYMNASTICS
HANDBALLhandballEXERCISE_TYPE_HANDBALL 35HANDBALL 35HANDBALL
HikinghikingEXERCISE_TYPE_HIKING 37HIKING 37HIKING
MARTIAL_ARTSmartialArtsEXERCISE_TYPE_MARTIAL_ARTS 44MARTIAL_ARTS 44MARTIAL_ARTS
PilatespilatesEXERCISE_TYPE_PILATES 48PILATES 48PILATES
RACQUETBALLracquetballEXERCISE_TYPE_RACQUETBALL 50RACQUETBALL 50RACQUETBALL
ROWINGrowingEXERCISE_TYPE_ROWING 53ROWING 53ROWING
RUGBYrugbyEXERCISE_TYPE_RUGBY 55RUGBY 57RUGBY
RunningrunningEXERCISE_TYPE_RUNNING 56RUNNING 55RUNNING
SAILINGsailingEXERCISE_TYPE_SAILING 58SAILING 58SAILING
SNOWBOARDINGsnowboardingEXERCISE_TYPE_SNOWBOARDING 62SNOWBOARDING 62SNOWBOARDING
SOCCERsoccerEXERCISE_TYPE_SOCCER 64SOCCER 64SOCCER
SOFTBALLsoftballEXERCISE_TYPE_SOFTBALL 65SOFTBALL 65SOFTBALL
SQUASHsquashEXERCISE_TYPE_SQUASH 66SQUASH 66SQUASH
TABLE_TENNIStableTennisEXERCISE_TYPE_TABLE_TENNIS 75TABLE_TENNIS 75TABLE_TENNIS
TENNIStennisEXERCISE_TYPE_TENNIS 76TENNIS 76TENNIS
VOLLEYBALLvolleyballEXERCISE_TYPE_VOLLEYBALL 78VOLLEYBALL 78VOLLEYBALL
WalkingwalkingEXERCISE_TYPE_WALKING 79WALKING 79WALKING
WATER_POLOwaterPoloEXERCISE_TYPE_WATER_POLO 80WATER_POLO 80WATER_POLO
YogayogaEXERCISE_TYPE_YOGA 83YOGA 83YOGA
BIKING–EXERCISE_TYPE_BIKING 8BIKING 8BIKING
BOOT_CAMP–EXERCISE_TYPE_BOOT_CAMP 10BOOT_CAMP 10BOOTCAMP
Calisthenics–EXERCISE_TYPE_CALISTHENICS 13CALISTHENICS 13CALISTHENICS
DANCING–EXERCISE_TYPE_DANCING 16DANCING 16DANCING
EXERCISE_CLASS–EXERCISE_TYPE_EXERCISE_CLASS 26EXERCISE_CLASS 26EXERCISE_CLASS
FOOTBALL_AMERICAN–EXERCISE_TYPE_FOOTBALL_AMERICAN 28FOOTBALL_AMERICAN 29FOOTBALL_AMERICAN
FOOTBALL_AUSTRALIAN–EXERCISE_TYPE_FOOTBALL_AUSTRALIAN 29FOOTBALL_AUSTRALIAN 30FOOTBALL_AUSTRALIAN
High intensity interval traininghighIntensityIntervalTrainingEXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING 36HIGH_INTENSITY_INTERVAL_TRAINING 36–
ICE_SKATING–EXERCISE_TYPE_ICE_SKATING 39ICE_SKATING 39ICE_SKATING
PARAGLIDING–EXERCISE_TYPE_PARAGLIDING 47PARA_GLIDING 47PARAGLIDING
ROCK_CLIMBING–EXERCISE_TYPE_ROCK_CLIMBING 51ROCK_CLIMBING 51ROCK_CLIMBING
ROWING_MACHINE–EXERCISE_TYPE_ROWING_MACHINE 54ROWING_MACHINE 54ROWING_MACHINE
SCUBA_DIVING–EXERCISE_TYPE_SCUBA_DIVING 59SCUBA_DIVING 59SCUBA_DIVING
SKATING–EXERCISE_TYPE_SKATING 60SKATING 60SKATING
SKIING–EXERCISE_TYPE_SKIING 61SKIING 61SKIING
SNOWSHOEING–EXERCISE_TYPE_SNOWSHOEING 63SNOWSHOEING 63SNOWSHOEING
Stair climbingstairClimbingEXERCISE_TYPE_STAIR_CLIMBING 68STAIR_CLIMBING 68–
STRENGTH_TRAINING–EXERCISE_TYPE_STRENGTH_TRAINING 70STRENGTH_TRAINING 70STRENGTH_TRAINING
STRETCHING–EXERCISE_TYPE_STRETCHING 71STRETCHING 71STRETCHING
SURFING–EXERCISE_TYPE_SURFING 72SURFING 72SURFING
SWIMMING_OPEN_WATER–EXERCISE_TYPE_SWIMMING_OPEN_WATER 73SWIMMING_OPEN_WATER 73SWIMMING_OPEN_WATER
SWIMMING_POOL–EXERCISE_TYPE_SWIMMING_POOL 74SWIMMING_POOL 74SWIMMING_POOL
WEIGHTLIFTING–EXERCISE_TYPE_WEIGHTLIFTING 81WEIGHTLIFTING 81WEIGHTLIFTING
ARCHERYarchery––ARCHERY
BACKPACKING––BACKPACKING 84BACKPACKING
BIKING_STATIONARY–EXERCISE_TYPE_BIKING_STATIONARY 9BIKING_STATIONARY 9–
BOWLINGbowling––BOWLING
CLIMBINGclimbing––CLIMBING
CORE_TRAININGcoreTraining––CORE_TRAINING
CROSS_COUNTRY_SKIINGcrossCountrySkiing–CROSS_COUNTRY_SKIING 91–
CROSS_TRAININGcrossTraining––CROSS_TRAINING
CURLINGcurling––CURLING
EQUESTRIAN_SPORTSequestrianSports––EQUESTRIAN_SPORTS
FISHINGfishing––FISHING
FITNESS_GAMINGfitnessGaming––FITNESS_GAMING
FRISBEE_DISC–EXERCISE_TYPE_FRISBEE_DISC 31FRISBEE_DISC 28–
FUNCTIONAL_STRENGTH_TRAININGfunctionalStrengthTraining––FUNCTIONAL_STRENGTH_TRAINING
GUIDED_BREATHING–EXERCISE_TYPE_GUIDED_BREATHING 33GUIDED_BREATHING 33–
HAND_CYCLINGhandCycling––HAND_CYCLING
HOCKEYhockey––HOCKEY
HUNTINGhunting––HUNTING
ICE_HOCKEY–EXERCISE_TYPE_ICE_HOCKEY 38ICE_HOCKEY 38–
JUMP_ROPEjumpRope–JUMP_ROPE 40–
KICKBOXINGkickboxing––KICKBOXING
LACROSSElacrosse––LACROSSE
ORIENTEERING––ORIENTEERING 86ORIENTEERING
OTHERother––OTHER
PADDLING–EXERCISE_TYPE_PADDLING 46PADDLING 46–
ROLLER_HOCKEY–EXERCISE_TYPE_ROLLER_HOCKEY 52ROLLER_HOCKEY 52–
ROLLER_SKATING––ROLLER_SKATING 89ROLLER_SKATING
RUNNING_TREADMILL–EXERCISE_TYPE_RUNNING_TREADMILL 57RUNNING_TREADMILL 56–
STAIR_CLIMBING_MACHINE–EXERCISE_TYPE_STAIR_CLIMBING_MACHINE 69STAIR_CLIMBING_MACHINE 69–
STEP_TRAININGstepTraining––STEP_TRAINING
SWIMMINGswimming––SWIMMING
TAI_CHItaiChi––TAI_CHI
TRACK_AND_FIELDtrackAndField––TRACK_AND_FIELD
WHEELCHAIR–EXERCISE_TYPE_WHEELCHAIR 82–WHEELCHAIR
WORKOUT––WORKOUT 82WORKOUT
WRESTLINGwrestling––WRESTLING

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 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.

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.swimming or HKWorkoutActivityType.other activity type, you must explain how your app calculates workout data when sensor information is not available. For more information, see the Human 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 ExerciseType based on its unique id. If the id doesn't map to an particular ExerciseType, then ExerciseType.UNKNOWN is 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 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.” (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.

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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.

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.

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.

Compiled by AIFitnessAPI from Apple’s and Google’s own documentation and source. The sources remain the authority.