Gives Claude direct access to the Strava API so it can read your fitness data, create activities, and manage your training history. You can ask about your running stats, log workouts, update activity details, or pull GPS and heart rate streams from past efforts. Covers the full REST API including athlete profiles, segments, clubs, gear tracking, and file uploads for GPX or FIT files. Watch the rate limits (200 requests per 15 minutes), and remember all distances come back in meters and times in seconds. Most useful if you want to analyze training patterns, automate activity logging, or build custom fitness reports without clicking through the Strava UI.
npx -y skills add vm0-ai/vm0-skills --skill strava --agent claude-codeInstalls into .claude/skills of the current project.
If requests fail, run zero doctor check-connector --env-name STRAVA_TOKEN or zero doctor check-connector --url https://www.strava.com/api/v3/athlete --method GET
curl -s "https://www.strava.com/api/v3/athlete" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{id, firstname, lastname, city, country, sex, premium, created_at, follower_count, friend_count}'
Replace <athlete-id> with the id from the athlete profile above:
curl -s "https://www.strava.com/api/v3/athletes/<athlete-id>/stats" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{recent_run_totals, recent_ride_totals, ytd_run_totals, ytd_ride_totals, all_run_totals, all_ride_totals}'
curl -s "https://www.strava.com/api/v3/athlete/activities?per_page=30" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, name, sport_type, distance, moving_time, elapsed_time, total_elevation_gain, start_date_local, average_speed, max_speed}'
Query parameters:
before=EPOCH — Activities before timestampafter=EPOCH — Activities after timestamppage=1 — Page numberper_page=30 — Results per page (max 200)curl -s "https://www.strava.com/api/v3/activities/<activity-id>" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{id, name, sport_type, distance, moving_time, elapsed_time, total_elevation_gain, average_speed, max_speed, average_heartrate, max_heartrate, calories, description, gear_id}'
Write to /tmp/strava_request.json:
{
"name": "Morning Run",
"sport_type": "Run",
"start_date_local": "2025-01-15T08:00:00Z",
"elapsed_time": 3600,
"distance": 10000,
"description": "Easy morning run"
}
Then run:
curl -s -X POST "https://www.strava.com/api/v3/activities" --header "Authorization: Bearer $STRAVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/strava_request.json | jq '{id, name, sport_type, distance}'
Required fields: name, sport_type, start_date_local (ISO 8601), elapsed_time (seconds).
Optional: distance (meters), description, trainer (0/1), commute (0/1).
Sport types: Run, TrailRun, Ride, MountainBikeRide, GravelRide, EBikeRide, Swim, Walk, Hike, WeightTraining, Yoga, Workout, Rowing, Kayaking, Surfing, RockClimbing, Golf, Soccer, Tennis, Pickleball, Skateboard, Snowboard, AlpineSki, NordicSki, etc.
Write to /tmp/strava_request.json:
{
"name": "Updated Name",
"description": "Updated description",
"sport_type": "Run",
"gear_id": "<gear-id>",
"commute": false,
"hide_from_home": false
}
Then run:
curl -s -X PUT "https://www.strava.com/api/v3/activities/<activity-id>" --header "Authorization: Bearer $STRAVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/strava_request.json | jq '{id, name, description, sport_type}'
Updatable fields: name, sport_type, description, gear_id (set to "none" to remove), trainer, commute, hide_from_home.
curl -s -X POST "https://www.strava.com/api/v3/uploads" --header "Authorization: Bearer $STRAVA_TOKEN" -F "data_type=gpx" -F "file=@/path/to/activity.gpx" -F "name=My Activity" -F "description=Uploaded via API"
Supported formats: fit, fit.gz, tcx, tcx.gz, gpx, gpx.gz.
Uploads are processed asynchronously. Poll for status:
curl -s "https://www.strava.com/api/v3/uploads/<upload-id>" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{id, status, error, activity_id}'
When activity_id is populated, the upload is complete.
curl -s "https://www.strava.com/api/v3/activities/<activity-id>/comments" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, text, created_at, athlete: .athlete.firstname}'
curl -s "https://www.strava.com/api/v3/activities/<activity-id>/kudos" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, firstname, lastname}'
curl -s "https://www.strava.com/api/v3/activities/<activity-id>/laps" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, name, elapsed_time, distance, average_speed, average_heartrate}'
curl -s "https://www.strava.com/api/v3/activities/<activity-id>/streams?keys=time,distance,heartrate,velocity_smooth&key_by_type=true" --header "Authorization: Bearer $STRAVA_TOKEN" | jq 'keys'
Available stream keys: time, distance, latlng, altitude, velocity_smooth, heartrate, cadence, watts, temp, moving, grade_smooth.
curl -s "https://www.strava.com/api/v3/segments/starred" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, name, distance, average_grade, maximum_grade, city, state, country}'
curl -s "https://www.strava.com/api/v3/segments/<segment-id>" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{id, name, activity_type, distance, average_grade, maximum_grade, elevation_high, elevation_low, city, country, effort_count, athlete_count}'
curl -s "https://www.strava.com/api/v3/athlete" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{bikes: .bikes, shoes: .shoes}'
Bike IDs start with b, shoe IDs start with g:
curl -s "https://www.strava.com/api/v3/gear/<gear-id>" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{id, name, brand_name, model_name, distance, converted_distance}'
curl -s "https://www.strava.com/api/v3/athlete/clubs" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, name, sport_type, city, country, member_count}'
curl -s "https://www.strava.com/api/v3/clubs/<club-id>" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{id, name, sport_type, city, country, member_count, description}'
curl -s "https://www.strava.com/api/v3/clubs/<club-id>/activities?per_page=20" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {name, sport_type, distance, moving_time, athlete: (.athlete.firstname + " " + .athlete.lastname)}'
curl -s "https://www.strava.com/api/v3/athletes/<athlete-id>/routes?per_page=20" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, name, type, distance, elevation_gain, estimated_moving_time}'
page and per_page (max 200) for list endpointsbefore/after parametersactivity:read_all needed for private activities, activity:write needed to create/edit429 when exceededsport_type over deprecated type fieldjuliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills