โ† Back to Health & Fitness
Health & Fitness by @rubengarciam

trainingpeaks

Pull real-time training plans, workouts, fitness metrics

0
Source Code

TrainingPeaks Skill

CLI access to the TrainingPeaks internal API. Pure Python stdlib โ€” no pip dependencies.

Setup: Getting Your Auth Cookie

  1. Log in to TrainingPeaks in your browser
  2. Open DevTools โ†’ Application โ†’ Cookies โ†’ app.trainingpeaks.com
  3. Find the cookie named Production_tpAuth
  4. Copy its value (long encoded string)

Then authenticate:

python3 scripts/tp.py auth "<paste_cookie_value_here>"

Or set the environment variable (useful for CI/scripts):

export TP_AUTH_COOKIE="<cookie_value>"

Credentials are stored in ~/.trainingpeaks/ with 0600 permissions.

Commands

auth <cookie> โ€” Authenticate

Store and validate a Production_tpAuth cookie. Exchanges it for a Bearer token and caches the athlete ID.

python3 scripts/tp.py auth "eyJhbGci..."
# โœ“ Authenticated successfully!
#   Account: [email protected]
#   Athlete ID: 12345
#   Token expires in: 60 minutes

auth-status โ€” Check Authentication

python3 scripts/tp.py auth-status
# Cookie: stored (file)
# Token: valid (42m remaining)
# Athlete ID: 12345
# โœ“ Ready

profile [--json] โ€” Athlete Profile

python3 scripts/tp.py profile
# Profile
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
#   Name:        Ruben Example
#   Email:       [email protected]
#   Athlete ID:  12345
#   Account:     Premium
#   Bike FTP:    280 W

workouts <start> <end> [--filter all|planned|completed] [--json]

List workouts in a date range (max 90 days).

# All workouts this week
python3 scripts/tp.py workouts 2026-01-26 2026-02-01

# Only completed workouts
python3 scripts/tp.py workouts 2026-01-01 2026-01-31 --filter completed

# Raw JSON for scripting
python3 scripts/tp.py workouts 2026-01-26 2026-02-01 --json

Output columns: Date, Title, Sport, Status (โœ“/โ—‹), Planned duration, Actual duration, TSS, Distance.

workout <id> [--json] โ€” Workout Detail

Get full details for a single workout including description, coach comments, and all metrics.

python3 scripts/tp.py workout 123456789
# Workout: Tempo Intervals 3x10min
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
#   Date:         2026-01-28
#   Sport:        Bike
#   Status:       Completed โœ“
#   ...

fitness [--days 90] [--json] โ€” CTL/ATL/TSB

Get fitness (CTL), fatigue (ATL), and form (TSB) data.

# Last 90 days (default)
python3 scripts/tp.py fitness

# Full season
python3 scripts/tp.py fitness --days 365

# JSON for charts
python3 scripts/tp.py fitness --json

Shows a summary with current CTL/ATL/TSB and status interpretation, plus a 14-day daily table.

peaks <sport> <pr_type> [--days 3650] [--json] โ€” Personal Records

Get ranked personal records by sport and metric.

# Best 20-minute power (all time)
python3 scripts/tp.py peaks Bike power20min

# 5K running PRs from last year
python3 scripts/tp.py peaks Run speed5K --days 365

# 5-second max power
python3 scripts/tp.py peaks Bike power5sec

Valid PR types:

Sport Types
Bike power5sec, power1min, power5min, power10min, power20min, power60min, power90min, hR5sec, hR1min, hR5min, hR10min, hR20min, hR60min, hR90min
Run hR5secโ€“hR90min, speed400Meter, speed800Meter, speed1K, speed1Mi, speed5K, speed5Mi, speed10K, speed10Mi, speedHalfMarathon, speedMarathon, speed50K

Token Management

  • Bearer tokens are cached in ~/.trainingpeaks/token.json
  • Tokens expire in ~1 hour; auto-refreshed from stored cookie
  • Cookie lasts weeks; stored in ~/.trainingpeaks/cookie
  • If the cookie expires, you'll get a clear error to re-authenticate

File Locations

File Purpose
~/.trainingpeaks/cookie Stored Production_tpAuth cookie
~/.trainingpeaks/token.json Cached OAuth Bearer token + expiry
~/.trainingpeaks/config.json Cached athlete ID and account info

Notes

  • All dates use YYYY-MM-DD format
  • Maximum workout query range: 90 days
  • Rate limiting: 150ms minimum between API requests
  • TP_AUTH_COOKIE environment variable overrides stored cookie
  • Default output is human-readable; --json gives raw API responses