# Garmin Connect API Endpoints and Go Structs This document provides a comprehensive overview of all Garmin Connect API endpoints accessible through the Garth library, along with corresponding Go structs for JSON response handling. ## Base URLs - **Connect API**: `https://connectapi.{domain}` - **SSO**: `https://sso.{domain}` - **Domain**: `garmin.com` (or `garmin.cn` for China) ## Authentication Endpoints ### OAuth1 Token Request - **Endpoint**: `GET /oauth-service/oauth/preauthorized` - **Query Parameters**: `ticket`, `login-url`, `accepts-mfa-tokens=true` - **Purpose**: Get OAuth1 token after SSO login ```go type OAuth1TokenResponse struct { OAuthToken string `json:"oauth_token"` OAuthTokenSecret string `json:"oauth_token_secret"` MFAToken string `json:"mfa_token,omitempty"` } ``` ### OAuth2 Token Exchange - **Endpoint**: `POST /oauth-service/oauth/exchange/user/2.0` - **Purpose**: Exchange OAuth1 token for OAuth2 access token ```go type OAuth2TokenResponse struct { Scope string `json:"scope"` JTI string `json:"jti"` TokenType string `json:"token_type"` AccessToken string `json:"access_token"` RefreshToken string `json:"refresh_token"` ExpiresIn int `json:"expires_in"` ExpiresAt int `json:"expires_at"` RefreshTokenExpiresIn int `json:"refresh_token_expires_in"` RefreshTokenExpiresAt int `json:"refresh_token_expires_at"` } ``` ## User Profile Endpoints ### Social Profile - **Endpoint**: `GET /userprofile-service/socialProfile` - **Purpose**: Get user's social profile information ```go type UserProfile struct { ID int `json:"id"` ProfileID int `json:"profileId"` GarminGUID string `json:"garminGuid"` DisplayName string `json:"displayName"` FullName string `json:"fullName"` UserName string `json:"userName"` ProfileImageType *string `json:"profileImageType"` ProfileImageURLLarge *string `json:"profileImageUrlLarge"` ProfileImageURLMedium *string `json:"profileImageUrlMedium"` ProfileImageURLSmall *string `json:"profileImageUrlSmall"` Location *string `json:"location"` FacebookURL *string `json:"facebookUrl"` TwitterURL *string `json:"twitterUrl"` PersonalWebsite *string `json:"personalWebsite"` Motivation *string `json:"motivation"` Bio *string `json:"bio"` PrimaryActivity *string `json:"primaryActivity"` FavoriteActivityTypes []string `json:"favoriteActivityTypes"` RunningTrainingSpeed float64 `json:"runningTrainingSpeed"` CyclingTrainingSpeed float64 `json:"cyclingTrainingSpeed"` FavoriteCyclingActivityTypes []string `json:"favoriteCyclingActivityTypes"` CyclingClassification *string `json:"cyclingClassification"` CyclingMaxAvgPower float64 `json:"cyclingMaxAvgPower"` SwimmingTrainingSpeed float64 `json:"swimmingTrainingSpeed"` ProfileVisibility string `json:"profileVisibility"` ActivityStartVisibility string `json:"activityStartVisibility"` ActivityMapVisibility string `json:"activityMapVisibility"` CourseVisibility string `json:"courseVisibility"` ActivityHeartRateVisibility string `json:"activityHeartRateVisibility"` ActivityPowerVisibility string `json:"activityPowerVisibility"` BadgeVisibility string `json:"badgeVisibility"` ShowAge bool `json:"showAge"` ShowWeight bool `json:"showWeight"` ShowHeight bool `json:"showHeight"` ShowWeightClass bool `json:"showWeightClass"` ShowAgeRange bool `json:"showAgeRange"` ShowGender bool `json:"showGender"` ShowActivityClass bool `json:"showActivityClass"` ShowVO2Max bool `json:"showVo2Max"` ShowPersonalRecords bool `json:"showPersonalRecords"` ShowLast12Months bool `json:"showLast12Months"` ShowLifetimeTotals bool `json:"showLifetimeTotals"` ShowUpcomingEvents bool `json:"showUpcomingEvents"` ShowRecentFavorites bool `json:"showRecentFavorites"` ShowRecentDevice bool `json:"showRecentDevice"` ShowRecentGear bool `json:"showRecentGear"` ShowBadges bool `json:"showBadges"` OtherActivity *string `json:"otherActivity"` OtherPrimaryActivity *string `json:"otherPrimaryActivity"` OtherMotivation *string `json:"otherMotivation"` UserRoles []string `json:"userRoles"` NameApproved bool `json:"nameApproved"` UserProfileFullName string `json:"userProfileFullName"` MakeGolfScorecardsPrivate bool `json:"makeGolfScorecardsPrivate"` AllowGolfLiveScoring bool `json:"allowGolfLiveScoring"` AllowGolfScoringByConnections bool `json:"allowGolfScoringByConnections"` UserLevel int `json:"userLevel"` UserPoint int `json:"userPoint"` LevelUpdateDate string `json:"levelUpdateDate"` LevelIsViewed bool `json:"levelIsViewed"` LevelPointThreshold int `json:"levelPointThreshold"` UserPointOffset int `json:"userPointOffset"` UserPro bool `json:"userPro"` } ``` ### User Settings - **Endpoint**: `GET /userprofile-service/userprofile/user-settings` - **Purpose**: Get user's account and device settings ```go type PowerFormat struct { FormatID int `json:"formatId"` FormatKey string `json:"formatKey"` MinFraction int `json:"minFraction"` MaxFraction int `json:"maxFraction"` GroupingUsed bool `json:"groupingUsed"` DisplayFormat *string `json:"displayFormat"` } type FirstDayOfWeek struct { DayID int `json:"dayId"` DayName string `json:"dayName"` SortOrder int `json:"sortOrder"` IsPossibleFirstDay bool `json:"isPossibleFirstDay"` } type WeatherLocation struct { UseFixedLocation *bool `json:"useFixedLocation"` Latitude *float64 `json:"latitude"` Longitude *float64 `json:"longitude"` LocationName *string `json:"locationName"` ISOCountryCode *string `json:"isoCountryCode"` PostalCode *string `json:"postalCode"` } type HydrationContainer struct { Volume *float64 `json:"volume"` Name *string `json:"name"` Type *string `json:"type"` } type UserData struct { Gender string `json:"gender"` Weight float64 `json:"weight"` Height float64 `json:"height"` TimeFormat string `json:"timeFormat"` BirthDate string `json:"birthDate"` MeasurementSystem string `json:"measurementSystem"` ActivityLevel *string `json:"activityLevel"` Handedness string `json:"handedness"` PowerFormat PowerFormat `json:"powerFormat"` HeartRateFormat PowerFormat `json:"heartRateFormat"` FirstDayOfWeek FirstDayOfWeek `json:"firstDayOfWeek"` VO2MaxRunning *float64 `json:"vo2MaxRunning"` VO2MaxCycling *float64 `json:"vo2MaxCycling"` LactateThresholdSpeed *float64 `json:"lactateThresholdSpeed"` LactateThresholdHeartRate *float64 `json:"lactateThresholdHeartRate"` DiveNumber *int `json:"diveNumber"` IntensityMinutesCalcMethod string `json:"intensityMinutesCalcMethod"` ModerateIntensityMinutesHRZone int `json:"moderateIntensityMinutesHrZone"` VigorousIntensityMinutesHRZone int `json:"vigorousIntensityMinutesHrZone"` HydrationMeasurementUnit string `json:"hydrationMeasurementUnit"` HydrationContainers []HydrationContainer `json:"hydrationContainers"` HydrationAutoGoalEnabled bool `json:"hydrationAutoGoalEnabled"` FirstbeatMaxStressScore *float64 `json:"firstbeatMaxStressScore"` FirstbeatCyclingLTTimestamp *int `json:"firstbeatCyclingLtTimestamp"` FirstbeatRunningLTTimestamp *int `json:"firstbeatRunningLtTimestamp"` ThresholdHeartRateAutoDetected bool `json:"thresholdHeartRateAutoDetected"` FTPAutoDetected *bool `json:"ftpAutoDetected"` TrainingStatusPausedDate *string `json:"trainingStatusPausedDate"` WeatherLocation *WeatherLocation `json:"weatherLocation"` GolfDistanceUnit *string `json:"golfDistanceUnit"` GolfElevationUnit *string `json:"golfElevationUnit"` GolfSpeedUnit *string `json:"golfSpeedUnit"` ExternalBottomTime *float64 `json:"externalBottomTime"` } type UserSleep struct { SleepTime int `json:"sleepTime"` DefaultSleepTime bool `json:"defaultSleepTime"` WakeTime int `json:"wakeTime"` DefaultWakeTime bool `json:"defaultWakeTime"` } type UserSleepWindow struct { SleepWindowFrequency string `json:"sleepWindowFrequency"` StartSleepTimeSecondsFromMidnight int `json:"startSleepTimeSecondsFromMidnight"` EndSleepTimeSecondsFromMidnight int `json:"endSleepTimeSecondsFromMidnight"` } type UserSettings struct { ID int `json:"id"` UserData UserData `json:"userData"` UserSleep UserSleep `json:"userSleep"` ConnectDate *string `json:"connectDate"` SourceType *string `json:"sourceType"` UserSleepWindows []UserSleepWindow `json:"userSleepWindows,omitempty"` } ``` ## Wellness & Health Data Endpoints ### Daily Sleep Data - **Endpoint**: `GET /wellness-service/wellness/dailySleepData/{username}` - **Query Parameters**: `date`, `nonSleepBufferMinutes` - **Purpose**: Get detailed sleep data for a specific date ```go type Score struct { QualifierKey string `json:"qualifierKey"` OptimalStart *float64 `json:"optimalStart"` OptimalEnd *float64 `json:"optimalEnd"` Value *int `json:"value"` IdealStartInSeconds *float64 `json:"idealStartInSeconds"` IdealEndInSeconds *float64 `json:"idealEndInSeconds"` } type SleepScores struct { TotalDuration Score `json:"totalDuration"` Stress Score `json:"stress"` AwakeCount Score `json:"awakeCount"` Overall Score `json:"overall"` REMPercentage Score `json:"remPercentage"` Restlessness Score `json:"restlessness"` LightPercentage Score `json:"lightPercentage"` DeepPercentage Score `json:"deepPercentage"` } type DailySleepDTO struct { ID int `json:"id"` UserProfilePK int `json:"userProfilePk"` CalendarDate string `json:"calendarDate"` SleepTimeSeconds int `json:"sleepTimeSeconds"` NapTimeSeconds int `json:"napTimeSeconds"` SleepWindowConfirmed bool `json:"sleepWindowConfirmed"` SleepWindowConfirmationType string `json:"sleepWindowConfirmationType"` SleepStartTimestampGMT int64 `json:"sleepStartTimestampGmt"` SleepEndTimestampGMT int64 `json:"sleepEndTimestampGmt"` SleepStartTimestampLocal int64 `json:"sleepStartTimestampLocal"` SleepEndTimestampLocal int64 `json:"sleepEndTimestampLocal"` DeviceREMCapable bool `json:"deviceRemCapable"` Retro bool `json:"retro"` UnmeasurableSleepSeconds *int `json:"unmeasurableSleepSeconds"` DeepSleepSeconds *int `json:"deepSleepSeconds"` LightSleepSeconds *int `json:"lightSleepSeconds"` REMSleepSeconds *int `json:"remSleepSeconds"` AwakeSleepSeconds *int `json:"awakeSleepSeconds"` SleepFromDevice *bool `json:"sleepFromDevice"` SleepVersion *int `json:"sleepVersion"` AwakeCount *int `json:"awakeCount"` SleepScores *SleepScores `json:"sleepScores"` AutoSleepStartTimestampGMT *int64 `json:"autoSleepStartTimestampGmt"` AutoSleepEndTimestampGMT *int64 `json:"autoSleepEndTimestampGmt"` SleepQualityTypePK *int `json:"sleepQualityTypePk"` SleepResultTypePK *int `json:"sleepResultTypePk"` AverageSPO2Value *float64 `json:"averageSpO2Value"` LowestSPO2Value *int `json:"lowestSpO2Value"` HighestSPO2Value *int `json:"highestSpO2Value"` AverageSPO2HRSleep *float64 `json:"averageSpO2HrSleep"` AverageRespirationValue *float64 `json:"averageRespirationValue"` LowestRespirationValue *float64 `json:"lowestRespirationValue"` HighestRespirationValue *float64 `json:"highestRespirationValue"` AvgSleepStress *float64 `json:"avgSleepStress"` AgeGroup *string `json:"ageGroup"` SleepScoreFeedback *string `json:"sleepScoreFeedback"` SleepScoreInsight *string `json:"sleepScoreInsight"` } type SleepMovement struct { StartGMT string `json:"startGmt"` EndGMT string `json:"endGmt"` ActivityLevel float64 `json:"activityLevel"` } type SleepData struct { DailySleepDTO *DailySleepDTO `json:"dailySleepDto"` SleepMovement []SleepMovement `json:"sleepMovement"` REMSleepData interface{} `json:"remSleepData"` SleepLevels interface{} `json:"sleepLevels"` SleepRestlessMoments interface{} `json:"sleepRestlessMoments"` RestlessMomentsCount interface{} `json:"restlessMomentsCount"` WellnessSpO2SleepSummaryDTO interface{} `json:"wellnessSpO2SleepSummaryDTO"` WellnessEpochSPO2DataDTOList interface{} `json:"wellnessEpochSPO2DataDTOList"` WellnessEpochRespirationDataDTOList interface{} `json:"wellnessEpochRespirationDataDTOList"` SleepStress interface{} `json:"sleepStress"` } ``` ### Daily Stress Data - **Endpoint**: `GET /wellness-service/wellness/dailyStress/{date}` - **Purpose**: Get Body Battery and stress data for a specific date ```go type DailyBodyBatteryStress struct { UserProfilePK int `json:"userProfilePk"` CalendarDate string `json:"calendarDate"` StartTimestampGMT string `json:"startTimestampGmt"` EndTimestampGMT string `json:"endTimestampGmt"` StartTimestampLocal string `json:"startTimestampLocal"` EndTimestampLocal string `json:"endTimestampLocal"` MaxStressLevel int `json:"maxStressLevel"` AvgStressLevel int `json:"avgStressLevel"` StressChartValueOffset int `json:"stressChartValueOffset"` StressChartYAxisOrigin int `json:"stressChartYAxisOrigin"` StressValuesArray [][]int `json:"stressValuesArray"` BodyBatteryValuesArray [][]interface{} `json:"bodyBatteryValuesArray"` } ``` ### Body Battery Events - **Endpoint**: `GET /wellness-service/wellness/bodyBattery/events/{date}` - **Purpose**: Get Body Battery events (sleep events) for a specific date ```go type BodyBatteryEvent struct { EventType string `json:"eventType"` EventStartTimeGMT string `json:"eventStartTimeGmt"` TimezoneOffset int `json:"timezoneOffset"` DurationInMilliseconds int `json:"durationInMilliseconds"` BodyBatteryImpact int `json:"bodyBatteryImpact"` FeedbackType string `json:"feedbackType"` ShortFeedback string `json:"shortFeedback"` } type BodyBatteryData struct { Event *BodyBatteryEvent `json:"event"` ActivityName *string `json:"activityName"` ActivityType *string `json:"activityType"` ActivityID *string `json:"activityId"` AverageStress *float64 `json:"averageStress"` StressValuesArray [][]int `json:"stressValuesArray"` BodyBatteryValuesArray [][]interface{} `json:"bodyBatteryValuesArray"` } ``` ### HRV Data - **Endpoint**: `GET /hrv-service/hrv/{date}` - **Purpose**: Get detailed HRV data for a specific date ```go type HRVBaseline struct { LowUpper int `json:"lowUpper"` BalancedLow int `json:"balancedLow"` BalancedUpper int `json:"balancedUpper"` MarkerValue float64 `json:"markerValue"` } type HRVSummary struct { CalendarDate string `json:"calendarDate"` WeeklyAvg int `json:"weeklyAvg"` LastNightAvg *int `json:"lastNightAvg"` LastNight5MinHigh int `json:"lastNight5MinHigh"` Baseline HRVBaseline `json:"baseline"` Status string `json:"status"` FeedbackPhrase string `json:"feedbackPhrase"` CreateTimeStamp string `json:"createTimeStamp"` } type HRVReading struct { HRVValue int `json:"hrvValue"` ReadingTimeGMT string `json:"readingTimeGmt"` ReadingTimeLocal string `json:"readingTimeLocal"` } type HRVData struct { UserProfilePK int `json:"userProfilePk"` HRVSummary HRVSummary `json:"hrvSummary"` HRVReadings []HRVReading `json:"hrvReadings"` StartTimestampGMT string `json:"startTimestampGmt"` EndTimestampGMT string `json:"endTimestampGmt"` StartTimestampLocal string `json:"startTimestampLocal"` EndTimestampLocal string `json:"endTimestampLocal"` SleepStartTimestampGMT string `json:"sleepStartTimestampGmt"` SleepEndTimestampGMT string `json:"sleepEndTimestampGmt"` SleepStartTimestampLocal string `json:"sleepStartTimestampLocal"` SleepEndTimestampLocal string `json:"sleepEndTimestampLocal"` } ``` ### Weight Data - **Endpoint**: `GET /weight-service/weight/dayview/{date}` (single day) - **Endpoint**: `GET /weight-service/weight/range/{start}/{end}?includeAll=true` (date range) - **Purpose**: Get weight measurements and body composition data ```go type WeightData struct { SamplePK int64 `json:"samplePk"` CalendarDate string `json:"calendarDate"` Weight int `json:"weight"` // in grams SourceType string `json:"sourceType"` WeightDelta float64 `json:"weightDelta"` TimestampGMT int64 `json:"timestampGmt"` Date int64 `json:"date"` BMI *float64 `json:"bmi"` BodyFat *float64 `json:"bodyFat"` BodyWater *float64 `json:"bodyWater"` BoneMass *int `json:"boneMass"` // in grams MuscleMass *int `json:"muscleMass"` // in grams PhysiqueRating *float64 `json:"physiqueRating"` VisceralFat *float64 `json:"visceralFat"` MetabolicAge *int `json:"metabolicAge"` } type WeightResponse struct { DateWeightList []WeightData `json:"dateWeightList"` } type WeightSummary struct { AllWeightMetrics []WeightData `json:"allWeightMetrics"` } type WeightRangeResponse struct { DailyWeightSummaries []WeightSummary `json:"dailyWeightSummaries"` } ``` ## Stats Endpoints ### Daily Steps - **Endpoint**: `GET /usersummary-service/stats/steps/daily/{start}/{end}` - **Purpose**: Get daily step counts and distances ```go type DailySteps struct { CalendarDate string `json:"calendarDate"` TotalSteps *int `json:"totalSteps"` TotalDistance *int `json:"totalDistance"` StepGoal int `json:"stepGoal"` } ``` ### Weekly Steps - **Endpoint**: `GET /usersummary-service/stats/steps/weekly/{end}/{period}` - **Purpose**: Get weekly step summaries ```go type WeeklySteps struct { CalendarDate string `json:"calendarDate"` TotalSteps int `json:"totalSteps"` AverageSteps float64 `json:"averageSteps"` AverageDistance float64 `json:"averageDistance"` TotalDistance float64 `json:"totalDistance"` WellnessDataDaysCount int `json:"wellnessDataDaysCount"` } ``` ### Daily Stress - **Endpoint**: `GET /usersummary-service/stats/stress/daily/{start}/{end}` - **Purpose**: Get daily stress level summaries ```go type DailyStress struct { CalendarDate string `json:"calendarDate"` OverallStressLevel int `json:"overallStressLevel"` RestStressDuration *int `json:"restStressDuration"` LowStressDuration *int `json:"lowStressDuration"` MediumStressDuration *int `json:"mediumStressDuration"` HighStressDuration *int `json:"highStressDuration"` } ``` ### Weekly Stress - **Endpoint**: `GET /usersummary-service/stats/stress/weekly/{end}/{period}` - **Purpose**: Get weekly stress level summaries ```go type WeeklyStress struct { CalendarDate string `json:"calendarDate"` Value int `json:"value"` } ``` ### Daily Intensity Minutes - **Endpoint**: `GET /usersummary-service/stats/im/daily/{start}/{end}` - **Purpose**: Get daily intensity minutes ```go type DailyIntensityMinutes struct { CalendarDate string `json:"calendarDate"` WeeklyGoal int `json:"weeklyGoal"` ModerateValue *int `json:"moderateValue"` VigorousValue *int `json:"vigorousValue"` } ``` ### Weekly Intensity Minutes - **Endpoint**: `GET /usersummary-service/stats/im/weekly/{start}/{end}` - **Purpose**: Get weekly intensity minutes ```go type WeeklyIntensityMinutes struct { CalendarDate string `json:"calendarDate"` WeeklyGoal int `json:"weeklyGoal"` ModerateValue *int `json:"moderateValue"` VigorousValue *int `json:"vigorousValue"` } ``` ### Daily Sleep Score - **Endpoint**: `GET /wellness-service/stats/daily/sleep/score/{start}/{end}` - **Purpose**: Get daily sleep quality scores ```go type DailySleep struct { CalendarDate string `json:"calendarDate"` Value *int `json:"value"` } ``` ### Daily HRV - **Endpoint**: `GET /hrv-service/hrv/daily/{start}/{end}` - **Purpose**: Get daily HRV summaries ```go type DailyHRV struct { CalendarDate string `json:"calendarDate"` WeeklyAvg *int `json:"weeklyAvg"` LastNightAvg *int `json:"lastNightAvg"` LastNight5MinHigh *int `json:"lastNight5MinHigh"` Baseline *HRVBaseline `json:"baseline"` Status string `json:"status"` FeedbackPhrase string `json:"feedbackPhrase"` CreateTimeStamp string `json:"createTimeStamp"` } ``` ### Daily Hydration - **Endpoint**: `GET /usersummary-service/stats/hydration/daily/{start}/{end}` - **Purpose**: Get daily hydration data ```go type DailyHydration struct { CalendarDate string `json:"calendarDate"` ValueInML float64 `json:"valueInMl"` GoalInML float64 `json:"goalInMl"` } ``` ## File Upload/Download Endpoints ### Upload Activity - **Endpoint**: `POST /upload-service/upload` - **Content-Type**: `multipart/form-data` - **Purpose**: Upload FIT files or other activity data ```go type UploadResponse struct { DetailedImportResult struct { UploadID int64 `json:"uploadId"` UploadUUID struct { UUID string `json:"uuid"` } `json:"uploadUuid"` Owner int `json:"owner"` FileSize int `json:"fileSize"` ProcessingTime int `json:"processingTime"` CreationDate string `json:"creationDate"` IPAddress *string `json:"ipAddress"` FileName string `json:"fileName"` Report *string `json:"report"` Successes []interface{} `json:"successes"` Failures []interface{} `json:"failures"` } `json:"detailedImportResult"` } ``` ### Download Activity - **Endpoint**: `GET /download-service/files/activity/{activityId}` - **Purpose**: Download activity data in various formats - **Returns**: Binary data (FIT, GPX, TCX, etc.) ## SSO Endpoints ### SSO Embed - **Endpoint**: `GET /sso/embed` - **Query Parameters**: Various SSO parameters - **Purpose**: Initialize SSO session ### SSO Sign In - **Endpoint**: `GET /sso/signin` - **Endpoint**: `POST /sso/signin` - **Purpose**: Authenticate user credentials ### MFA Verification - **Endpoint**: `POST /sso/verifyMFA/loginEnterMfaCode` - **Purpose**: Verify multi-factor authentication code ## Common Response Patterns ### Error Response ```go type ErrorResponse struct { Message string `json:"message"` Code string `json:"code,omitempty"` } ``` ### Paginated Response Pattern Many endpoints support pagination with these common patterns: - Date ranges: `{start}/{end}` - Period-based: `{end}/{period}` - Page size limits vary by endpoint (typically 28-52 items) ### Stats Response with Values Some stats endpoints return data in this nested format: ```go type StatsResponse struct { CalendarDate string `json:"calendarDate"` Values map[string]interface{} `json:"values"` } ``` ## Authentication Headers All API requests require: - `Authorization: Bearer {oauth2_access_token}` - `User-Agent: GCM-iOS-5.7.2.1` (or similar) ## Additional Endpoints and Data Types ### Activity Data Endpoints Based on the codebase structure, there are likely additional activity-related endpoints that follow these patterns: #### Activity List - **Endpoint**: `GET /activitylist-service/activities/search/activities` - **Purpose**: Search and list user activities ```go type ActivitySummary struct { ActivityID int64 `json:"activityId"` ActivityName string `json:"activityName"` Description *string `json:"description"` StartTimeLocal string `json:"startTimeLocal"` StartTimeGMT string `json:"startTimeGMT"` ActivityType struct { TypeID int `json:"typeId"` TypeKey string `json:"typeKey"` ParentTypeID *int `json:"parentTypeId"` } `json:"activityType"` EventType struct { TypeID int `json:"typeId"` TypeKey string `json:"typeKey"` } `json:"eventType"` Distance *float64 `json:"distance"` Duration *float64 `json:"duration"` ElapsedDuration *float64 `json:"elapsedDuration"` MovingDuration *float64 `json:"movingDuration"` ElevationGain *float64 `json:"elevationGain"` ElevationLoss *float64 `json:"elevationLoss"` AverageSpeed *float64 `json:"averageSpeed"` MaxSpeed *float64 `json:"maxSpeed"` StartLatitude *float64 `json:"startLatitude"` StartLongitude *float64 `json:"startLongitude"` HasPolyline bool `json:"hasPolyline"` OwnerID int `json:"ownerId"` Calories *float64 `json:"calories"` BMRCalories *float64 `json:"bmrCalories"` AverageHR *int `json:"averageHR"` MaxHR *int `json:"maxHR"` AverageRunCadence *float64 `json:"averageRunCadence"` MaxRunCadence *float64 `json:"maxRunCadence"` } type ActivitySearchResponse struct { Activities []ActivitySummary `json:"activities"` } ``` #### Activity Details - **Endpoint**: `GET /activity-service/activity/{activityId}` - **Purpose**: Get detailed information about a specific activity ```go type ActivityDetails struct { ActivityID int64 `json:"activityId"` ActivityName string `json:"activityName"` Description *string `json:"description"` StartTimeLocal string `json:"startTimeLocal"` StartTimeGMT string `json:"startTimeGMT"` ActivityType struct { TypeID int `json:"typeId"` TypeKey string `json:"typeKey"` ParentTypeID *int `json:"parentTypeId"` IsHidden bool `json:"isHidden"` Restricted bool `json:"restricted"` TrailRun bool `json:"trailRun"` } `json:"activityType"` Distance *float64 `json:"distance"` Duration *float64 `json:"duration"` ElapsedDuration *float64 `json:"elapsedDuration"` MovingDuration *float64 `json:"movingDuration"` ElevationGain *float64 `json:"elevationGain"` ElevationLoss *float64 `json:"elevationLoss"` MinElevation *float64 `json:"minElevation"` MaxElevation *float64 `json:"maxElevation"` AverageSpeed *float64 `json:"averageSpeed"` MaxSpeed *float64 `json:"maxSpeed"` Calories *float64 `json:"calories"` BMRCalories *float64 `json:"bmrCalories"` AverageHR *int `json:"averageHR"` MaxHR *int `json:"maxHR"` AverageRunCadence *float64 `json:"averageRunCadence"` MaxRunCadence *float64 `json:"maxRunCadence"` AverageBikeCadence *float64 `json:"averageBikeCadence"` MaxBikeCadence *float64 `json:"maxBikeCadence"` AveragePower *float64 `json:"averagePower"` MaxPower *float64 `json:"maxPower"` NormalizedPower *float64 `json:"normalizedPower"` TrainingStressScore *float64 `json:"trainingStressScore"` IntensityFactor *float64 `json:"intensityFactor"` LeftRightBalance *struct { Left float64 `json:"left"` Right float64 `json:"right"` } `json:"leftRightBalance"` AvgStrokes *float64 `json:"avgStrokes"` AvgStrokeDistance *float64 `json:"avgStrokeDistance"` PoolLength *float64 `json:"poolLength"` StrokesLengthType *string `json:"strokesLengthType"` ActivityTrainingLoad *float64 `json:"activityTrainingLoad"` Weather *struct { Temp *float64 `json:"temp"` ApparentTemp *float64 `json:"apparentTemp"` DewPoint *float64 `json:"dewPoint"` RelativeHumidity *int `json:"relativeHumidity"` WindDirection *int `json:"windDirection"` WindSpeed *float64 `json:"windSpeed"` PressureAltimeter *float64 `json:"pressureAltimeter"` WeatherCondition *string `json:"weatherCondition"` } `json:"weather"` SplitSummaries []struct { SplitType string `json:"splitType"` SplitIndex int `json:"splitIndex"` StartTimeGMT string `json:"startTimeGMT"` Distance float64 `json:"distance"` Duration float64 `json:"duration"` MovingDuration *float64 `json:"movingDuration"` ElevationChange *float64 `json:"elevationChange"` AverageSpeed *float64 `json:"averageSpeed"` MaxSpeed *float64 `json:"maxSpeed"` AverageHR *int `json:"averageHR"` MaxHR *int `json:"maxHR"` AveragePower *float64 `json:"averagePower"` MaxPower *float64 `json:"maxPower"` Calories *float64 `json:"calories"` } `json:"splitSummaries"` } ``` ### Device Management Endpoints #### Device List - **Endpoint**: `GET /device-service/deviceregistration/devices` - **Purpose**: Get list of user's registered devices ```go type Device struct { DeviceID int64 `json:"deviceId"` DeviceTypePK int `json:"deviceTypePk"` DeviceTypeID int `json:"deviceTypeId"` DeviceVersionPK int `json:"deviceVersionPk"` ApplicationVersions []struct { ApplicationTypePK int `json:"applicationTypePk"` VersionString string `json:"versionString"` ApplicationKey string `json:"applicationKey"` } `json:"applicationVersions"` LastSyncTimeStamp *string `json:"lastSyncTimeStamp"` ImageURL string `json:"imageUrl"` DeviceRegistrationDate string `json:"deviceRegistrationDate"` DeviceSettingsURL *string `json:"deviceSettingsUrl"` DisplayName string `json:"displayName"` PartNumber string `json:"partNumber"` SoftwareVersionString string `json:"softwareVersionString"` UnitID string `json:"unitId"` PrimaryDevice bool `json:"primaryDevice"` } type DeviceListResponse struct { Devices []Device `json:"devices"` } ``` ### Social/Community Endpoints #### Social Profile - **Endpoint**: `GET /userprofile-service/socialProfile/{profileId}` - **Purpose**: Get public profile information for other users #### Connections/Friends - **Endpoint**: `GET /userprofile-service/connection-service/connections` - **Purpose**: Get user's connections/friends list ```go type Connection struct { ProfileID int `json:"profileId"` UserProfileID int `json:"userProfileId"` DisplayName string `json:"displayName"` FullName *string `json:"fullName"` ProfileImageURL *string `json:"profileImageUrl"` Location *string `json:"location"` ConnectionDate string `json:"connectionDate"` UserPro bool `json:"userPro"` } type ConnectionsResponse struct { Connections []Connection `json:"connections"` } ``` ### Nutrition/Hydration Endpoints #### Log Hydration - **Endpoint**: `POST /wellness-service/wellness/hydrationLog` - **Purpose**: Log hydration intake ```go type HydrationLogRequest struct { CalendarDate string `json:"calendarDate"` ValueInML float64 `json:"valueInMl"` TimestampGMT int64 `json:"timestampGmt"` } type HydrationLogResponse struct { Success bool `json:"success"` Message string `json:"message,omitempty"` } ``` ### Goals and Badges Endpoints #### User Goals - **Endpoint**: `GET /userprofile-service/userprofile/personal-information/goals` - **Purpose**: Get user's fitness goals ```go type Goals struct { WeeklyStepGoal *int `json:"weeklyStepGoal"` WeeklyIntensityMinutes *int `json:"weeklyIntensityMinutes"` WeeklyFloorsClimbedGoal *int `json:"weeklyFloorsClimbedGoal"` WeeklyWorkoutGoal *int `json:"weeklyWorkoutGoal"` DailyHydrationGoal *float64 `json:"dailyHydrationGoal"` WeightGoal *struct { Weight float64 `json:"weight"` TargetDate string `json:"targetDate"` GoalType string `json:"goalType"` } `json:"weightGoal"` } ``` #### Badges - **Endpoint**: `GET /badge-service/badges/{profileId}` - **Purpose**: Get user's earned badges ```go type Badge struct { BadgeKey string `json:"badgeKey"` BadgeTypeID int `json:"badgeTypeId"` BadgeTypeName string `json:"badgeTypeName"` BadgePoints int `json:"badgePoints"` EarnedDate string `json:"earnedDate"` BadgeImageURL string `json:"badgeImageUrl"` ViewableBy []string `json:"viewableBy"` BadgeCategory string `json:"badgeCategory"` AssociatedGoal *string `json:"associatedGoal"` } type BadgesResponse struct { Badges []Badge `json:"badges"` } ``` ## Wellness Insights and Trends ### Wellness Dashboard - **Endpoint**: `GET /wellness-service/wellness/wellness-dashboard/{date}` - **Purpose**: Get comprehensive wellness dashboard data ```go type WellnessDashboard struct { CalendarDate string `json:"calendarDate"` StepsData *struct { TotalSteps int `json:"totalSteps"` StepGoal int `json:"stepGoal"` PercentGoal int `json:"percentGoal"` } `json:"stepsData"` IntensityMinutes *struct { WeeklyGoal int `json:"weeklyGoal"` ModerateMinutes int `json:"moderateMinutes"` VigorousMinutes int `json:"vigorousMinutes"` TotalMinutes int `json:"totalMinutes"` PercentGoal int `json:"percentGoal"` } `json:"intensityMinutes"` FloorsClimbed *struct { FloorsClimbed int `json:"floorsClimbed"` GoalFloors int `json:"goalFloors"` PercentGoal int `json:"percentGoal"` } `json:"floorsClimbed"` CaloriesData *struct { TotalCalories int `json:"totalCalories"` ActiveCalories int `json:"activeCalories"` BMRCalories int `json:"bmrCalories"` CaloriesGoal int `json:"caloriesGoal"` } `json:"caloriesData"` } ``` ## Training and Performance ### Training Status - **Endpoint**: `GET /metrics-service/metrics/training-status/{profileId}` - **Purpose**: Get training status and load information ```go type TrainingStatus struct { TrainingStatusKey string `json:"trainingStatusKey"` LoadRatio *float64 `json:"loadRatio"` TrainingLoad *float64 `json:"trainingLoad"` TrainingLoadFocus *string `json:"trainingLoadFocus"` TrainingEffectLabel *string `json:"trainingEffectLabel"` AnaerobicTrainingEffect *float64 `json:"anaerobicTrainingEffect"` AerobicTrainingEffect *float64 `json:"aerobicTrainingEffect"` TrainingEffectMessage *string `json:"trainingEffectMessage"` FitnessLevel *string `json:"fitnessLevel"` RecoveryTime *int `json:"recoveryTime"` RecoveryInfo *string `json:"recoveryInfo"` } ``` ### VO2 Max - **Endpoint**: `GET /metrics-service/metrics/vo2max/{profileId}` - **Purpose**: Get VO2 Max measurements and trends ```go type VO2Max struct { ActivityType string `json:"activityType"` VO2MaxValue *float64 `json:"vo2MaxValue"` FitnessAge *int `json:"fitnessAge"` FitnessLevel string `json:"fitnessLevel"` LastMeasurement string `json:"lastMeasurement"` Generic *float64 `json:"generic"` Running *float64 `json:"running"` Cycling *float64 `json:"cycling"` } ``` ## Golf Endpoints ### Golf Scorecard - **Endpoint**: `GET /golf-service/golf/scorecard/{scorecardId}` - **Purpose**: Get golf scorecard details ```go type GolfScorecard struct { ScorecardID int64 `json:"scorecardId"` CourseID int `json:"courseId"` CourseName string `json:"courseName"` PlayedDate string `json:"playedDate"` TotalScore int `json:"totalScore"` TotalStrokes int `json:"totalStrokes"` CoursePar int `json:"coursePar"` CourseRating float64 `json:"courseRating"` CourseSlope int `json:"courseSlope"` HandicapIndex *float64 `json:"handicapIndex"` PlayingHandicap *int `json:"playingHandicap"` NetScore *int `json:"netScore"` Holes []struct { HoleNumber int `json:"holeNumber"` Par int `json:"par"` Strokes int `json:"strokes"` HoleHandicap int `json:"holeHandicap"` Distance int `json:"distance"` Score int `json:"score"` NetStrokes *int `json:"netStrokes"` } `json:"holes"` } ``` ## Pagination and Limits ### Common Pagination Parameters - `limit`: Number of items per page (varies by endpoint) - `start`: Start index or date - `end`: End index or date ### Rate Limiting The API implements rate limiting. Common limits observed: - OAuth token requests: Limited per hour - Data requests: Typically allow reasonable polling intervals - File uploads: Size and frequency restrictions ## Error Codes and Handling ### Common HTTP Status Codes - `200`: Success - `204`: No Content (successful request with no data) - `400`: Bad Request - `401`: Unauthorized (token expired/invalid) - `403`: Forbidden (insufficient permissions) - `404`: Not Found - `429`: Too Many Requests (rate limited) - `500`: Internal Server Error ### Error Response Format ```go type APIError struct { HTTPStatusCode int `json:"httpStatusCode,omitempty"` HTTPStatus string `json:"httpStatus,omitempty"` RequestURL string `json:"requestUrl,omitempty"` ErrorMessage string `json:"errorMessage"` ValidationErrors []struct { PropertyName string `json:"propertyName"` Message string `json:"message"` } `json:"validationErrors,omitempty"` } ``` ## Data Synchronization ### Sync Status - **Endpoint**: `GET /device-service/deviceservice/device-info/sync-status` - **Purpose**: Check device synchronization status ```go type SyncStatus struct { LastSyncTime *string `json:"lastSyncTime"` SyncInProgress bool `json:"syncInProgress"` PendingDataTypes []struct { DataType string `json:"dataType"` RecordCount int `json:"recordCount"` LastUpdate string `json:"lastUpdate"` } `json:"pendingDataTypes"` } ``` ## Time Zones and Localization ### Supported Date Formats - ISO 8601: `YYYY-MM-DD` - ISO 8601 with time: `YYYY-MM-DDTHH:MM:SS.sssZ` - Unix timestamp (milliseconds) ### Timezone Handling All endpoints return both GMT and local timestamps where applicable: - `timestampGmt`: UTC timestamp - `timestampLocal`: Local timezone timestamp - Timezone offset information included for conversion This comprehensive documentation covers all the major endpoints and data structures available through the Garmin Connect API as implemented in the Garth library.