Agent skill
strava
Strava API for fitness activities. Use when user mentions "Strava", "running", "cycling", "activity", or asks about fitness tracking.
Install this agent skill to your Project
npx add-skill https://github.com/vm0-ai/vm0-skills/tree/main/strava
SKILL.md
Strava API
Use the Strava API v3 via curl to access athlete activities, segments, clubs, gear, and routes. Create, update, and upload activities.
Official docs: https://developers.strava.com/docs/reference/
When to Use
Use this skill when you need to:
- Get athlete profile and statistics
- List, search, and filter activities
- Create manual activities or upload activity files (GPX/FIT/TCX)
- Update activity name, description, sport type, and other metadata
- Access activity streams (GPS, heart rate, power data)
- View segments, clubs, gear, and routes
Placeholders: Values in
<angle-brackets>like<activity-id>are placeholders. Replace them with actual values when executing.
Athlete
Get Authenticated Athlete Profile
curl -s "https://www.strava.com/api/v3/athlete" --header "Authorization: Bearer $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv STRAVA_TOKEN)" | jq '.[] | {id, firstname, lastname}'
Get Activity Laps
curl -s "https://www.strava.com/api/v3/activities/<activity-id>/laps" --header "Authorization: Bearer $(printenv STRAVA_TOKEN)" | jq '.[] | {id, name, elapsed_time, distance, average_speed, average_heartrate}'
Get Activity Photos
curl -s "https://www.strava.com/api/v3/activities/<activity-id>/photos?photo_sources=true&size=600" --header "Authorization: Bearer $(printenv STRAVA_TOKEN)" | jq '.[] | {unique_id, urls, caption, source, location}'
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 $(printenv 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 $(printenv 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 $(printenv STRAVA_TOKEN)" | jq '{id, name, activity_type, distance, average_grade, maximum_grade, elevation_high, elevation_low, city, country, effort_count, athlete_count}'
Get Segment Leaderboard
curl -s "https://www.strava.com/api/v3/segments/<segment-id>/leaderboard?per_page=10" --header "Authorization: Bearer $(printenv STRAVA_TOKEN)" | jq '{entry_count, entries: [.entries[] | {rank, athlete_name, elapsed_time, moving_time, start_date_local}]}'
Parameters: gender (M/F), age_group, weight_class, following (true/false), per_page.
Gear
Get Athlete's Gear
curl -s "https://www.strava.com/api/v3/athlete" --header "Authorization: Bearer $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv 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 $(printenv STRAVA_TOKEN)" | jq '.[] | {id, name, type, distance, elevation_gain, estimated_moving_time}'
Guidelines
- Token expiry: Access tokens expire every 6 hours — the platform handles refresh automatically via the connector
- Pagination: Use
pageandper_page(max 200) for list endpoints - Time filters: Use Unix epoch timestamps for
before/afterparameters - Scope requirements: Ensure token has correct scopes;
activity:read_allneeded for private activities,activity:writeneeded to create/edit - Rate limits: 200 req/15min, 2000 req/day — add delays for bulk operations. Returns
429when exceeded - Distance units: All distances are in meters, speeds in meters/second
- Time units: All durations are in seconds
- Sport type vs type: Prefer
sport_typeover deprecatedtypefield
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/
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
brave-search
Brave Search API for web search. Use when user says "search web", "Brave search", or asks to "find on web" without specifying Google.
supadata
Supadata API for YouTube/web data. Use when user mentions "Supadata", "YouTube data", "channel stats", or web scraping data.
roadmap-planning
Build and prioritize product roadmaps using scoring models like RICE, ICE, and value-effort matrices. Activate when creating a product roadmap, prioritizing features, sequencing initiatives, mapping dependencies, balancing team capacity, choosing between Now/Next/Later or quarterly planning, or communicating roadmap tradeoffs to executives and stakeholders.
qdrant
Qdrant API for vector search. Use when user mentions "Qdrant", "vector database", "semantic search", or embeddings storage.
calendly
Calendly scheduling API. Use when user mentions "Calendly", "calendly.com", "schedule a meeting", "booking link", "event types", or asks about interview scheduling.
stripe
Stripe API for payments. Use when user mentions "Stripe", "payment", "subscription", "billing", "invoice", or asks about payment processing.
Didn't find tool you were looking for?