
Strava
- 584 installs
- 76 repo stars
- Updated August 4, 2026
- vm0-ai/vm0-skills
strava is a Claude Code API integration skill that helps developers wire Strava OAuth and REST API v3 calls to sync runs, rides, athlete profiles, and activity statistics into fitness dashboards, coaching apps, or traini
About
strava is an API integration skill from vm0-ai/vm0-skills for Strava fitness data using OAuth bearer tokens and Strava API v3 endpoints. It documents curl patterns for athlete profile and statistics retrieval, includes zero doctor connector troubleshooting via zero doctor check-connector, and covers running, cycling, and activity sync workflows. Developers reach for strava when building fitness dashboards, coaching features, or agent tools that must authenticate athletes and pull activity feeds from Strava into backend services.
- Strava OAuth flows
- Activities and athlete endpoints
- Webhook event handling
- Rate-limit aware sync
- Fitness data normalization
Strava by the numbers
- 584 all-time installs (skills.sh)
- +10 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #689 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/vm0-ai/vm0-skills --skill stravaAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 584 |
|---|---|
| repo stars | ★ 76 |
| Last updated | August 4, 2026 |
| Repository | vm0-ai/vm0-skills ↗ |
How do you integrate the Strava API with OAuth?
Integrate Strava OAuth and activity APIs to sync runs, rides, and athlete stats into fitness dashboards, coaching apps, or training agents.
Who is it for?
Backend developers building fitness apps or training agents that must authenticate and sync Strava athlete and activity data.
Skip if: Developers building workout features with no third-party fitness data source and no Strava developer app credentials.
When should I use this skill?
User mentions Strava, running, cycling, activity sync, STRAVA_TOKEN, or Strava API v3 athlete endpoints.
What you get
OAuth-connected Strava client, athlete profile payloads, activity sync handlers, and API v3 curl examples
- api-integration-snippets
- activity-sync-handler
- connector-troubleshooting-steps
Files
Troubleshooting
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
Athlete
Get Authenticated Athlete Profile
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}'Get Athlete Statistics
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}'Activities
List Recent Activities
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)
Get Activity Details
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}'Create Manual Activity
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.
Update Activity
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.
Uploads
Upload Activity File (GPX/FIT/TCX)
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.
Check Upload Status
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.
Activity Details
List Activity Comments
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}'List Activity Kudoers
curl -s "https://www.strava.com/api/v3/activities/<activity-id>/kudos" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, firstname, lastname}'Get Activity Laps
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}'Get Activity Streams (GPS/HR/Power Data)
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.
Segments
List Starred Segments
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}'Get Segment Details
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}'Gear
Get Athlete's Gear
curl -s "https://www.strava.com/api/v3/athlete" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '{bikes: .bikes, shoes: .shoes}'Get Gear Details
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}'Clubs
List Athlete Clubs
curl -s "https://www.strava.com/api/v3/athlete/clubs" --header "Authorization: Bearer $STRAVA_TOKEN" | jq '.[] | {id, name, sport_type, city, country, member_count}'Get Club Details
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}'List Club Activities
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)}'Routes
Get Athlete Routes
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}'Guidelines
1. Token expiry: Access tokens expire every 6 hours — the platform handles refresh automatically via the connector 2. Pagination: Use page and per_page (max 200) for list endpoints 3. Time filters: Use Unix epoch timestamps for before/after parameters 4. Scope requirements: Ensure token has correct scopes; activity:read_all needed for private activities, activity:write needed to create/edit 5. Rate limits: 200 req/15min, 2000 req/day — add delays for bulk operations. Returns 429 when exceeded 6. Distance units: All distances are in meters, speeds in meters/second 7. Time units: All durations are in seconds 8. Sport type vs type: Prefer sport_type over deprecated type field
API Reference
- REST Reference: https://developers.strava.com/docs/reference/
- Authentication: https://developers.strava.com/docs/authentication/
- Rate Limits: https://developers.strava.com/docs/rate-limits/
- Uploads: https://developers.strava.com/docs/uploads/
Related skills
How it compares
Use strava for Strava-specific OAuth and v3 endpoint patterns, not generic REST tutorials without fitness activity schemas.
FAQ
Which Strava API version does the strava skill use?
The strava skill uses Strava REST API v3 with OAuth bearer tokens, documenting curl examples for athlete profile and statistics endpoints and troubleshooting via zero doctor check-connector commands.
How do you debug failing Strava requests with the strava skill?
Run zero doctor check-connector --env-name STRAVA_TOKEN or zero doctor check-connector against https://www.strava.com/api/v3/athlete with GET to verify OAuth token and endpoint connectivity before syncing activities.