PHPackages                             alexoid/laravel-garmin - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. alexoid/laravel-garmin

ActiveLibrary[API Development](/categories/api)

alexoid/laravel-garmin
======================

PHP API wrapper for Garmin Connect with Laravel support

v1.0.0(2mo ago)04MITPHPPHP ^8.4CI passing

Since Mar 3Pushed 2mo agoCompare

[ Source](https://github.com/aIeXoid/laravel-garmin)[ Packagist](https://packagist.org/packages/alexoid/laravel-garmin)[ Docs](https://github.com/aIeXoid/laravel-garmin)[ RSS](/packages/alexoid-laravel-garmin/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (4)Versions (2)Used By (0)

[![Tests](https://github.com/aIeXoid/laravel-garmin/actions/workflows/ci.yml/badge.svg)](https://github.com/aIeXoid/laravel-garmin/actions)[![PHPStan](https://camo.githubusercontent.com/0729e562e10fac943b16dbb271b4af26488f779a33fc82cc3eef1e37a432c0b4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6c6576656c253230352d627269676874677265656e2e737667)](https://phpstan.org)[![PHP Version](https://camo.githubusercontent.com/6e44ad49e5307c87d1393389feb52ab61c99956e2e5f8c77177b2501f1d3d47f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345253344382e342d3838393242462e737667)](https://php.net)[![License: MIT](https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667)](LICENSE)[![Latest Version](https://camo.githubusercontent.com/e45a46a2ac36b65f821f408a378c197ba2dd88419d52f00dca2fbab88cb71e5c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f616c65786f69642f6c61726176656c2d6761726d696e2e737667)](https://packagist.org/packages/alexoid/laravel-garmin)[![Total Downloads](https://camo.githubusercontent.com/02fc88865fb644f4049da32a2a5a49f2c760eeb51c0ecc2099c65ac36ae9725c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f616c65786f69642f6c61726176656c2d6761726d696e2e737667)](https://packagist.org/packages/alexoid/laravel-garmin)

PHP: Garmin Connect
===================

[](#php-garmin-connect)

A comprehensive PHP API wrapper for Garmin Connect, providing access to health, fitness, and device data. Works standalone or with Laravel.

About
-----

[](#about)

This library enables developers to programmatically access Garmin Connect data including:

- **Health Metrics**: Heart rate, sleep, stress, body battery, SpO2, HRV, respiration
- **Activity Data**: Workouts, exercises, training status, performance metrics
- **Device Information**: Connected devices, settings, alarms, solar data
- **Goals &amp; Achievements**: Personal records, badges, challenges
- **Body Composition**: Weight tracking, blood pressure, hydration
- **Historical Data**: Trends, progress tracking, date range queries

Based on the Python [garminconnect](https://github.com/cyberjunky/python-garminconnect) library with OAuth authentication ported from [garth](https://github.com/matin/garth).

Requirements
------------

[](#requirements)

- PHP 8.4+
- ext-json
- [Guzzle](https://docs.guzzlephp.org/) ^7.5 (installed automatically)

Installation
------------

[](#installation)

```
composer require alexoid/laravel-garmin
```

Quick Start (Standalone)
------------------------

[](#quick-start-standalone)

```
use Alexoid\GarminConnect\GarminConnect;

// Login with credentials
$garmin = new GarminConnect(
    email: 'your@email.com',
    password: 'yourpassword',
);
$garmin->login('~/.garminconnect');

// Subsequent runs — tokens are reused automatically
$garmin = new GarminConnect();
$garmin->login('~/.garminconnect');

// Get data
$summary = $garmin->getUserSummary('2026-03-02');
echo "Steps: " . $summary['totalSteps'];

$hr = $garmin->getHeartRates('2026-03-02');
echo "Resting HR: " . $hr['restingHeartRate'];

$activities = $garmin->getActivities(0, 10);
```

MFA (Two-Factor Authentication)
-------------------------------

[](#mfa-two-factor-authentication)

If your account has MFA enabled, use the non-blocking mode:

```
$garmin = new GarminConnect(
    email: 'your@email.com',
    password: 'yourpassword',
    returnOnMfa: true,
);

[$status, $clientState] = $garmin->login();

if ($status === 'needs_mfa') {
    $mfaCode = readline('MFA code: '); // or get from your UI
    $garmin->resumeLogin($clientState, $mfaCode, '~/.garminconnect');
}

// Now authenticated
$summary = $garmin->getUserSummary(date('Y-m-d'));
```

Or use the blocking `MfaHandler` interface for CLI apps:

```
use Alexoid\GarminConnect\Auth\MfaHandler;

class CliMfaHandler implements MfaHandler
{
    public function promptMfaCode(): string
    {
        echo "Enter MFA code: ";
        return trim(fgets(STDIN));
    }
}

$garmin = new GarminConnect(
    email: 'your@email.com',
    password: 'yourpassword',
    mfaHandler: new CliMfaHandler(),
);
$garmin->login('~/.garminconnect');
```

Quick Start (Laravel)
---------------------

[](#quick-start-laravel)

Publish the config:

```
php artisan vendor:publish --tag=garminconnect-config
```

Set environment variables:

```
GARMIN_EMAIL=your@email.com
GARMIN_PASSWORD=yourpassword
GARMIN_DOMAIN=garmin.com
GARMIN_TOKEN_STORE=file
GARMIN_TOKEN_PATH=/path/to/tokens
```

Log in (handles MFA interactively):

```
php artisan garmin:login
```

Use the Facade:

```
use Alexoid\GarminConnect\Laravel\GarminConnect;

GarminConnect::login();

$stats = GarminConnect::getUserSummary(now()->format('Y-m-d'));
$hr = GarminConnect::getHeartRates(now()->format('Y-m-d'));
```

Token Storage
-------------

[](#token-storage)

Tokens are persisted so you don't need to re-authenticate on every request.

StoreClassUse CaseFile (default)`FileTokenStore`JSON files in `~/.garminconnect`Laravel Cache`LaravelCacheTokenStore`Redis, Memcached, etc.Null`NullTokenStore`In-memory only, no persistenceCustomImplement `TokenStoreInterface`Database, S3, etc.Examples
--------

[](#examples)

The [`examples/`](examples/) directory contains working code you can run or copy into your project:

FileDescription[`example.php`](examples/example.php)**Standalone CLI** — run `php examples/example.php` for an interactive demo of login, MFA, and all major API calls[`laravel-mfa-login.php`](examples/laravel-mfa-login.php)**Laravel controller** — copy to `app/Http/Controllers/`, add a route, and get a two-step login endpoint with MFA support (auth state saved in session between requests)[`laravel-activity-sync.php`](examples/laravel-activity-sync.php)**Artisan command** — copy to `app/Console/Commands/`, run `php artisan garmin:sync {user_id}` to sync strength training workouts into your database (paginated fetch, exercise set parsing, incremental sync, transaction import)Available Methods (105)
-----------------------

[](#available-methods-105)

### Profile (6 methods)

[](#profile-6-methods)

MethodDescription`getUserProfile()`Get user settings`getSocialProfile()`Get social profile (displayName, fullName)`getUserprofileSettings()`Get profile settings`getPersonalRecord()`Get personal records`requestReload(string $cdate)`Request data reload for date`queryGarminGraphql(array $query)`Execute GraphQL query### User Stats (10 methods)

[](#user-stats-10-methods)

MethodDescription`getUserSummary(string $cdate)`Daily summary (steps, calories, distance)`getStats(string $cdate)`Alias for getUserSummary`getStepsData(string $cdate)`Detailed step data`getFloors(string $cdate)`Floor climbing data`getDailySteps(string $start, string $end)`Steps for date range`getWeeklySteps(string $end, int $weeks = 52)`Weekly step aggregation`getWeeklyStress(string $end, int $weeks = 52)`Weekly stress aggregation`getWeeklyIntensityMinutes(string $start, string $end)`Weekly intensity minutes`getStatsAndBody(string $cdate)`Combined stats + body data`getProgressSummaryBetweenDates(string $startdate, string $enddate)`Progress summary### Heart Rate (3 methods)

[](#heart-rate-3-methods)

MethodDescription`getHeartRates(string $cdate)`Daily heart rate data`getRhrDay(string $cdate)`Resting heart rate`getHrvData(string $cdate)`Heart rate variability### Wellness (10 methods)

[](#wellness-10-methods)

MethodDescription`getSleepData(string $cdate)`Sleep duration, quality, score`getStressData(string $cdate)`Daily stress data`getAllDayStress(string $cdate)`All day stress with values array`getAllDayEvents(string $cdate)`All day wellness events`getBodyBattery(string $startdate, ?string $enddate = null)`Body battery levels`getBodyBatteryEvents(string $cdate)`Body battery events`getRespirationData(string $cdate)`Breathing rate`getSpo2Data(string $cdate)`Blood oxygen saturation`getIntensityMinutesData(string $cdate)`Intensity minutes`getLifestyleLoggingData(string $cdate)`Lifestyle logging### Activities (10 methods)

[](#activities-10-methods)

MethodDescription`countActivities()`Total activity count`getActivities(int $start = 0, int $limit = 20, ?string $activityType = null)`List activities (paginated)`getActivitiesForDate(string $fordate)`Activities for specific date`getActivitiesByDate(string $startdate, ?string $enddate = null, ?string $activityType = null, ?string $sortOrder = null)`Activities in date range`getLastActivity()`Most recent activity`setActivityName(string $activityId, string $title)`Rename activity`setActivityType(string $activityId, int $typeId, string $typeKey, int $parentTypeId)`Change activity type`getActivityTypes()`Available activity types`createManualActivity(string $startDatetime, string $timeZone, string $typeKey, float $distanceKm, int $durationMin, string $activityName)`Create manual activity`createManualActivityFromJson(array $payload)`Create from JSON payload### Activity Details (9 methods)

[](#activity-details-9-methods)

MethodDescription`getActivity(string $activityId)`Full activity data`getActivityDetails(string $activityId, int $maxChartSize = 1000, int $maxPolylineSize = 4000)`Detailed metrics`getActivitySplits(string $activityId)`Activity splits`getActivityTypedSplits(string $activityId)`Typed splits`getActivitySplitSummaries(string $activityId)`Split summaries`getActivityWeather(string $activityId)`Weather during activity`getActivityHrInTimezones(string $activityId)`HR in time zones`getActivityPowerInTimezones(string $activityId)`Power in time zones`getActivityExerciseSets(string|int $activityId)`Exercise sets### Downloads (2 methods)

[](#downloads-2-methods)

MethodDescription`downloadActivity(string $activityId, ActivityDownloadFormat $format = TCX)`Download activity file (TCX, GPX, KML, CSV, ORIGINAL)`downloadWorkout(string|int $workoutId)`Download workout FIT file### Devices (6 methods)

[](#devices-6-methods)

MethodDescription`getDevices()`List connected devices`getDeviceSettings(string $deviceId)`Device settings`getPrimaryTrainingDevice()`Primary training device`getDeviceSolarData(string $deviceSerial, string $end, int $weeks = 52)`Solar charging data`getDeviceAlarms()`Device alarms`getDeviceLastUsed()`Last used device### Health (13 methods)

[](#health-13-methods)

MethodDescription`getBodyComposition(string $startdate, ?string $enddate = null)`Body composition data`getWeighIns(string $startdate, string $enddate)`Weight measurements`getDailyWeighIns(string $cdate)`Daily weigh-ins`addWeighIn(int|float $weight, string $unitKey = 'kg', string $timestamp = '')`Add weight entry`deleteWeighIn(string $weightPk, string $cdate)`Delete weight entry`getBloodPressure(string $startdate, ?string $enddate = null)`Blood pressure data`setBloodPressure(int $systolic, int $diastolic, int $pulse, string $timestamp = '', string $notes = '')`Record blood pressure`deleteBloodPressure(string $version, string $cdate)`Delete BP reading`getHydrationData(string $cdate)`Hydration intake`addHydrationData(float $valueInMl, ?string $timestamp = null, ?string $cdate = null)`Add hydration entry`getMenstrualDataForDate(string $fordate)`Menstrual cycle data`getMenstrualCalendarData(string $startdate, string $enddate)`Menstrual calendar`getPregnancySummary()`Pregnancy summary### Metrics (7 methods)

[](#metrics-7-methods)

MethodDescription`getMaxMetrics(string $cdate)`VO2Max, fitness metrics`getLactateThreshold(bool $latest = true, ?string $startDate = null, ?string $endDate = null, string $aggregation = 'daily')`Lactate threshold data`getEnduranceScore(string $cdate, int $branch = 1)`Endurance score`getRacePredictions()`Race predictions (latest)`getHillScore(string $cdate, int $branch = 1)`Hill score`getCyclingFtp(string $activityId)`Cycling FTP`getFitnessAgeData(string $cdate)`Fitness age### Training (6 methods)

[](#training-6-methods)

MethodDescription`getTrainingReadiness(string $cdate)`Training readiness`getMorningTrainingReadiness(string $cdate)`Morning readiness`getTrainingStatus(string $cdate)`Training status`getTrainingPlans()`All training plans`getTrainingPlanById(string|int $planId)`Specific training plan`getAdaptiveTrainingPlanById(string|int $planId)`Adaptive training plan### Badges &amp; Challenges (8 methods)

[](#badges--challenges-8-methods)

MethodDescription`getEarnedBadges()`Earned badges`getAvailableBadges()`Available badges`getInProgressBadges()`In-progress badges`getAdhocChallenges(int $start = 1, int $limit = 100)`Ad-hoc challenges`getBadgeChallenges(int $start = 1, int $limit = 100)`Badge challenges`getAvailableBadgeChallenges(int $start = 1, int $limit = 100)`Available badge challenges`getNonCompletedBadgeChallenges(int $start = 1, int $limit = 100)`Non-completed challenges`getInProgressVirtualChallenges(int $start = 1, int $limit = 100)`In-progress virtual challenges### Gear (8 methods)

[](#gear-8-methods)

MethodDescription`getGear(string $userProfileNumber)`Get all gear`getGearStats(string $gearUUID)`Gear statistics`getGearDefaults(string $userProfileNumber)`Default gear`setGearDefault(string $userProfileNumber, string $gearUUID, string $equipmentCategory)`Set default gear`getActivityGear(string|int $activityId)`Gear used in activity`getGearActivities(string $gearUUID, int $start = 0, int $limit = 100)`Activities with gear`addGearToActivity(string $activityId, string $gearUUID)`Add gear to activity`removeGearFromActivity(string $activityId, string $gearUUID)`Remove gear from activity### Goals (1 method)

[](#goals-1-method)

MethodDescription`getGoals(string $status = 'active', int $start = 1, int $limit = 50)`Goals by status (active, future, past)### Uploads (6 methods)

[](#uploads-6-methods)

MethodDescription`uploadActivity(string $activityPath)`Upload FIT/GPX/TCX activity`deleteActivity(string $activityId)`Delete activity`uploadWorkout(array|string $workoutJson)`Upload workout`deleteWorkout(string|int $workoutId)`Delete workout`getWorkouts(int $start = 0, int $limit = 100)`List workouts`getWorkoutById(string|int $workoutId)`Get specific workoutTesting
-------

[](#testing)

```
vendor/bin/phpunit
vendor/bin/phpunit --testdox  # verbose output
```

Development
-----------

[](#development)

```
# Install dependencies
composer install

# Run tests
vendor/bin/phpunit

# Static analysis
vendor/bin/phpstan analyse

# Code formatting
vendor/bin/php-cs-fixer fix
```

Contributing
------------

[](#contributing)

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/new-endpoint`)
3. Make your changes
4. Run tests (`vendor/bin/phpunit`)
5. Submit a pull request

License
-------

[](#license)

MIT License. See [LICENSE](LICENSE) for details.

###  Health Score

39

—

LowBetter than 86% of packages

Maintenance86

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

70d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/ba61ed95acac5de2607c1b5dfefe6a7221f22954c0e16e3977a1b203f397f875?d=identicon)[aIeXoid](/maintainers/aIeXoid)

---

Top Contributors

[![aIeXoid](https://avatars.githubusercontent.com/u/36300509?v=4)](https://github.com/aIeXoid "aIeXoid (1 commits)")

---

Tags

apilaravelhealthgarmingarmin-connectfitness

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/alexoid-laravel-garmin/health.svg)

```
[![Health](https://phpackages.com/badges/alexoid-laravel-garmin/health.svg)](https://phpackages.com/packages/alexoid-laravel-garmin)
```

###  Alternatives

[openai-php/laravel

OpenAI PHP for Laravel is a supercharged PHP API client that allows you to interact with the Open AI API

3.7k7.6M74](/packages/openai-php-laravel)[nickurt/laravel-postcodeapi

Universal PostcodeApi for Laravel 11.x/12.x/13.x

97221.2k](/packages/nickurt-laravel-postcodeapi)[smodav/mpesa

M-Pesa API implementation

16363.7k1](/packages/smodav-mpesa)[mozex/anthropic-laravel

Anthropic PHP for Laravel is a supercharged PHP API client that allows you to interact with the Anthropic API

71226.4k1](/packages/mozex-anthropic-laravel)[scriptdevelop/whatsapp-manager

Paquete para manejo de WhatsApp Business API en Laravel

762.6k](/packages/scriptdevelop-whatsapp-manager)[ardakilic/mutlucell

Mutlucell SMS API wrapper for sending sms text messages for Laravel

457.3k](/packages/ardakilic-mutlucell)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
