Get the FREE Ultimate OpenClaw Setup Guide →

intervals-icu

Scanned
npx machina-cli add skill disco-trooper/skills/intervals-icu --openclaw
Files (1)
SKILL.md
11.8 KB

Intervals.icu API Skill

Skill Relationship

┌─────────────────┐     fetch data      ┌───────────────────┐
│  intervals-icu  │ ──────────────────► │ cycling-training  │
│   (DATA API)    │                     │    (ANALYSIS)     │
│                 │ ◄────────────────── │                   │
│ • wellness      │   interpret results │ • zone calc       │
│ • activities    │                     │ • periodization   │
│ • power curves  │                     │ • workout design  │
│ • fitness       │                     │ • load management │
└─────────────────┘                     └───────────────────┘

Usage pattern:

  1. Use intervals-icu to fetch data from API
  2. Use cycling-training to analyze and interpret
  3. Use intervals-icu to update wellness/events

API wrapper for intervals.icu cycling training platform. Designed to work alongside the cycling-training skill.

Quick Start

# Set credentials (one-time)
export INTERVALS_API_KEY="your_api_key"
export INTERVALS_ATHLETE_ID="iXXXXX"

# Use the API helper
~/.claude/skills/intervals-icu/scripts/api.sh wellness today
~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-01-31

Authentication

Get your API key from https://intervals.icu/settings → Developer Settings → API Key.

Find athlete ID in the URL when logged in: intervals.icu/athlete/iXXXXX/...

Rate Limiting

Intervals.icu API has rate limits. The script handles this with:

  • Automatic retry with exponential backoff (default: 3 attempts)
  • Configurable via INTERVALS_MAX_RETRIES environment variable
# Increase retries for bulk operations
export INTERVALS_MAX_RETRIES=5

If you hit rate limits frequently:

  • Add delays between bulk requests: sleep 1
  • Use date ranges instead of individual requests
  • Cache responses locally for analysis

Prerequisites

  • curl - Pre-installed on most systems
  • jq - brew install jq (macOS) / apt install jq (Linux)
  • bats-core - Optional, for tests: brew install bats-core

API Helper Script

Use scripts/api.sh to handle authentication and common operations:

CommandDescription
api.sh wellness [date]Get wellness for date (default: today)
api.sh wellness-range <start> <end>Get wellness for date range
api.sh wellness-update <date> <json>Update wellness fields
api.sh activities <start> <end> [format] [--all]List activities (--all for pagination)
api.sh activity <id>Get single activity details
api.sh activity-streams <id> [types]Get activity data streams
api.sh activity-upload <file>Upload activity (.fit, .gpx, .tcx)
api.sh athleteGet athlete profile
api.sh fitnessGet current CTL/ATL/TSB
api.sh zonesGet power/HR zone settings
api.sh events <start> <end>Get planned events/workouts
api.sh event-create <date> <json>Create planned workout/event
api.sh power-curves <start> <end> [format]Power curves (json/summary/seconds)

Examples

# Get today's wellness
~/.claude/skills/intervals-icu/scripts/api.sh wellness

# Get wellness for specific date
~/.claude/skills/intervals-icu/scripts/api.sh wellness 2024-01-15

# Update wellness (weight and sleep)
~/.claude/skills/intervals-icu/scripts/api.sh wellness-update 2024-01-15 '{"weight": 72.5, "sleepSecs": 28800}'

# Get last month's activities
~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-01-31

# Export activities as CSV
~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-01-31 csv > activities.csv

Direct curl Examples

For custom operations not covered by the helper:

# Base URL
BASE="https://intervals.icu/api/v1"

# Auth header
AUTH="Authorization: Basic $(echo -n "API_KEY:$INTERVALS_API_KEY" | base64)"

# Get power curve
curl -s -H "$AUTH" "$BASE/athlete/$INTERVALS_ATHLETE_ID/power-curves?oldest=2024-01-01&newest=2024-12-31"

# Get streams for activity
curl -s -H "$AUTH" "$BASE/activity/iXXXX/streams?types=watts,heartrate,cadence"

# Upload activity
curl -s -H "$AUTH" -F "file=@ride.fit" "$BASE/athlete/$INTERVALS_ATHLETE_ID/activities"

Key Endpoints Reference

EndpointMethodPurpose
/athlete/{id}GETAthlete profile
/athlete/{id}/wellness/{date}GET/PUTWellness data
/athlete/{id}/wellnessGETWellness range (add ?oldest=&newest=)
/athlete/{id}/activitiesGETActivities list
/activity/{id}GETActivity details
/activity/{id}/streamsGETActivity data streams
/athlete/{id}/eventsGETPlanned workouts/events
/athlete/{id}/power-curvesGETPower duration curves

Wellness Fields

FieldTypeRangeDescription
weightfloat30-200 kgBody weight
restingHRint30-100 bpmResting heart rate
hrvfloat10-150 msHRV RMSSD (typical: 20-80)
hrvSDNNfloat10-200 msHRV SDNN
sleepSecsint0-43200Sleep duration (0-12h in seconds)
sleepScorefloat0-100Sleep quality percentage
sleepQualityint1-51=poor, 5=excellent
fatigueint1-51=fresh, 5=exhausted
moodint1-51=bad, 5=great
motivationint1-5Training motivation
readinessint1-5Training readiness
stressint1-5Stress level
sorenessint1-5Muscle soreness
ctlfloat0-200Chronic Training Load (fitness)
atlfloat0-300Acute Training Load (fatigue)
rampRatefloat-10 to +10CTL weekly change rate

Integrate with cycling-training

Use both skills together:

  1. Fetch data with intervals-icu skill:

    ~/.claude/skills/intervals-icu/scripts/api.sh wellness-range 2024-01-01 2024-01-31 > wellness.json
    ~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-01-31 > activities.json
    
  2. Analyze with cycling-training skill:

    • Calculate training load distribution
    • Check polarization index
    • Evaluate recovery status based on HRV trends
    • Plan next mesocycle based on CTL/ATL/TSB
  3. Update wellness after morning check-in:

    ~/.claude/skills/intervals-icu/scripts/api.sh wellness-update today '{"weight": 72.5, "sleepSecs": 28800, "readiness": 4}'
    

End-to-End Workflow Example

Complete example: Morning HRV-based workout adjustment using both skills.

Scenario

You wake up, check HRV, and want to adjust today's planned workout based on recovery status.

Step 1: Fetch morning wellness data

# Get today's wellness (HRV from device sync)
WELLNESS=$(~/.claude/skills/intervals-icu/scripts/api.sh wellness today)
echo "$WELLNESS" | jq '{hrv, restingHR, sleepSecs, ctl, atl}'

Output:

{
  "hrv": 42.5,
  "restingHR": 54,
  "sleepSecs": 25200,
  "ctl": 65.3,
  "atl": 72.1
}

Step 2: Analyze with cycling-training skill

Based on the data:

  • HRV: 42.5 ms (below your baseline of 50 ms = -15%)
  • TSB: 65.3 - 72.1 = -6.8 (slightly fatigued)
  • Sleep: 7 hours (adequate but not optimal)

cycling-training recommendation: Reduce intensity. Convert threshold workout to endurance/recovery.

Step 3: Update today's planned event

# Find today's planned workout
TODAY=$(date +%Y-%m-%d)
EVENTS=$(~/.claude/skills/intervals-icu/scripts/api.sh events $TODAY $TODAY)
EVENT_ID=$(echo "$EVENTS" | jq -r '.[0].id')

# Update to easier workout
~/.claude/skills/intervals-icu/scripts/api.sh event-update "$EVENT_ID" '{
  "name": "Recovery Ride (HRV adjusted)",
  "description": "Original: Threshold intervals. Adjusted due to low HRV (-15% from baseline).",
  "icu_training_load": 40
}'

Step 4: Log subjective wellness

~/.claude/skills/intervals-icu/scripts/api.sh wellness-update today '{
  "readiness": 3,
  "fatigue": 3,
  "mood": 4,
  "soreness": 2
}'

Decision Matrix

HRV vs BaselineTSBRecommendation
>+10%>0Execute as planned or add intensity
±10%>0Execute as planned
±10%<0Execute but monitor
<-10%AnyReduce intensity or rest
<-20%AnyRest day

Testing

Run the test suite:

# Requires: bats-core
# Install: brew install bats-core (macOS) or apt install bats (Linux)

~/.claude/skills/intervals-icu/tests/run_tests.sh

Tests verify:

  • Help and argument validation
  • Environment variable checks
  • Date parsing (cross-platform)
  • JSON parsing with mock fixtures
  • Power curve calculations

Troubleshooting

Common Errors

ErrorCauseSolution
HTTP 401Invalid API keyRegenerate key in settings
HTTP 403No permissionCheck athlete ID ownership
HTTP 404Resource not foundVerify date format (YYYY-MM-DD)
HTTP 429Rate limitedWait 60s, reduce request frequency
"jq: command not found"jq not installedbrew install jq (macOS) / apt install jq (Linux)
Empty responseNo data for date rangeCheck date range contains activities
"Invalid JSON"Malformed JSON payloadValidate JSON: `echo '{"key": "value"}'

Debug Mode

Enable verbose output for debugging:

# Show curl commands
export INTERVALS_DEBUG=1
~/.claude/skills/intervals-icu/scripts/api.sh wellness today

Common Issues

Issue: Activities not syncing from Garmin/Wahoo

  • Check device sync in intervals.icu settings
  • Verify connection status with fitness platform
  • Manual upload: api.sh activity-upload ride.fit

Issue: HRV not appearing in wellness

  • HRV requires compatible device (Garmin, Wahoo, Oura, etc.)
  • Check device sync completed before fetching
  • Some devices sync HRV with delay (up to 2 hours)

Issue: Power curves show 0 for some durations

  • Need activity with sustained effort at that duration
  • Indoor trainers may have gaps in data
  • Check activity streams: api.sh activity-streams <id> watts

Issue: CSV export has wrong encoding

  • Intervals.icu returns UTF-8
  • If Excel shows garbled text: Import as UTF-8, not auto-detect

Undocumented Endpoints

For endpoints not covered by api.sh, use Context7:

// Find Intervals.icu docs
mcp__plugin_context7_context7__resolve-library-id({
  libraryName: "intervals.icu"
})

// Query specific endpoint
mcp__plugin_context7_context7__query-docs({
  libraryId: "/websites/intervals_icu_api_v1",
  query: "how to create workout library entry"
})

Common Workflows

Morning Wellness Check-in

# Get HRV device data (if synced)
~/.claude/skills/intervals-icu/scripts/api.sh wellness today

# Update subjective metrics
~/.claude/skills/intervals-icu/scripts/api.sh wellness-update today '{"readiness": 4, "mood": 4, "soreness": 2}'

Weekly Training Review

# Get last 7 days
END=$(date +%Y-%m-%d)
START=$(date -v-7d +%Y-%m-%d 2>/dev/null || date -d "7 days ago" +%Y-%m-%d)

~/.claude/skills/intervals-icu/scripts/api.sh activities $START $END
~/.claude/skills/intervals-icu/scripts/api.sh wellness-range $START $END
~/.claude/skills/intervals-icu/scripts/api.sh fitness  # Current CTL/ATL/TSB

Export for Analysis

# CSV export for spreadsheet analysis
~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-12-31 csv > yearly_activities.csv
~/.claude/skills/intervals-icu/scripts/api.sh wellness-range 2024-01-01 2024-12-31 csv > yearly_wellness.csv

Source

git clone https://github.com/disco-trooper/skills/blob/main/intervals-icu/SKILL.mdView on GitHub

Overview

A focused API wrapper that interfaces with intervals.icu to fetch wellness, activities, power curves, and fitness metrics. It’s designed to work alongside the cycling-training skill, enabling streamlined data retrieval, updates, and analysis for training planning.

How This Skill Works

The skill provides a CLI helper (scripts/api.sh) that authenticates with your API key and athlete ID, then calls intervals.icu endpoints (wellness, activities, power-curves, etc.). It includes automatic rate-limit handling with exponential backoff and a retry cap, and can export data for downstream analysis or feed into the cycling-training analysis pipeline.

When to Use It

  • Get today's wellness to quick-check daily status before training
  • Fetch wellness for a date range to monitor trends over time
  • Retrieve last month's activities for training load analysis
  • Obtain power curves for performance insights and planning
  • Update wellness fields (weight, sleep, etc.) after workouts

Quick Start

  1. Step 1: Set credentials (one-time) export INTERVALS_API_KEY="your_api_key" export INTERVALS_ATHLETE_ID="iXXXXX"
  2. Step 2: Fetch wellness for today ~/.claude/skills/intervals-icu/scripts/api.sh wellness
  3. Step 3: List activities for a date range ~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-01-31

Best Practices

  • Store credentials as environment variables (INTERVALS_API_KEY, INTERVALS_ATHLETE_ID) and avoid hard-coding them
  • Use date ranges instead of single requests to stay within rate limits and optimize calls
  • Leverage INTERVALS_MAX_RETRIES and exponential backoff for bulk operations
  • Cache frequently used responses locally to speed up repeated analyses
  • Validate data formats when exporting (e.g., CSV) for compatibility with analytics tools

Example Use Cases

  • Get today's wellness: ~/.claude/skills/intervals-icu/scripts/api.sh wellness
  • Get wellness for a specific date: ~/.claude/skills/intervals-icu/scripts/api.sh wellness 2024-01-15
  • Update wellness (weight and sleep): ~/.claude/skills/intervals-icu/scripts/api.sh wellness-update 2024-01-15 '{"weight": 72.5, "sleepSecs": 28800}'
  • Get last month's activities: ~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-01-31
  • Export activities as CSV: ~/.claude/skills/intervals-icu/scripts/api.sh activities 2024-01-01 2024-01-31 csv > activities.csv

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers