strava
v1.0.0Load and analyze Strava activities, stats, and workouts using the Strava API
Installation
Strava Skill
Interact with Strava to load activities, analyze workouts, and track fitness data.
Setup
1. Create a Strava API Application
- Go to https://www.strava.com/settings/api
- Create an app (use
http://localhostas callback for testing) - Note your Client ID and Client Secret
2. Get Initial OAuth Tokens
Visit this URL in your browser (replace CLIENT_ID):
https://www.strava.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost&approval_prompt=force&scope=activity:read_all
After authorizing, you'll be redirected to http://localhost/?code=AUTHORIZATION_CODE
Exchange the code for tokens:
curl -X POST https://www.strava.com/oauth/token
-d client_id=YOUR_CLIENT_ID
-d client_secret=YOUR_CLIENT_SECRET
-d code=AUTHORIZATION_CODE
-d grant_type=authorization_code
This returns access_token and refresh_token.
3. Configure Credentials
Add to ~/.clawdbot/clawdbot.json:
{
"skills": {
"entries": {
"strava": {
"enabled": true,
"env": {
"STRAVA_ACCESS_TOKEN": "your-access-token",
"STRAVA_REFRESH_TOKEN": "your-refresh-token",
"STRAVA_CLIENT_ID": "your-client-id",
"STRAVA_CLIENT_SECRET": "your-client-secret"
}
}
}
}
}
Or use environment variables:
export STRAVA_ACCESS_TOKEN="your-access-token"
export STRAVA_REFRESH_TOKEN="your-refresh-token"
export STRAVA_CLIENT_ID="your-client-id"
export STRAVA_CLIENT_SECRET="your-client-secret"
Usage
List Recent Activities
Get the last 30 activities:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?per_page=30"
Get the last 10 activities:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?per_page=10"
Filter Activities by Date
Get activities after a specific date (Unix timestamp):
# Activities after Jan 1, 2024
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?after=1704067200"
Get activities in a date range:
# Activities between Jan 1 - Jan 31, 2024
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?after=1704067200&before=1706745600"
Get Activity Details
Get full details for a specific activity (replace ACTIVITY_ID):
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/activities/ACTIVITY_ID"
Get Athlete Profile
Get the authenticated athlete's profile:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete"
Get Athlete Stats
Get athlete statistics (replace ATHLETE_ID):
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athletes/ATHLETE_ID/stats"
Pagination
Navigate through pages:
# Page 1 (default)
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?page=1&per_page=30"
# Page 2
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?page=2&per_page=30"
Token Refresh
Access tokens expire every 6 hours. Refresh using the helper script:
bash {baseDir}/scripts/refresh_token.sh
Or manually:
curl -s -X POST https://www.strava.com/oauth/token
-d client_id="${STRAVA_CLIENT_ID}"
-d client_secret="${STRAVA_CLIENT_SECRET}"
-d grant_type=refresh_token
-d refresh_token="${STRAVA_REFRESH_TOKEN}"
The response includes a new access_token and refresh_token. Update your configuration with both tokens.
Common Data Fields
Activity objects include:
- name — Activity title
- distance — Distance in meters
- moving_time — Moving time in seconds
- elapsed_time — Total time in seconds
- total_elevation_gain — Elevation gain in meters
- type — Activity type (Run, Ride, Swim, etc.)
- sport_type — Specific sport type
- start_date — Start time (ISO 8601)
- average_speed — Average speed in m/s
- max_speed — Max speed in m/s
- average_heartrate — Average heart rate (if available)
- max_heartrate — Max heart rate (if available)
- kudos_count — Number of kudos received
Rate Limits
- 200 requests per 15 minutes
- 2,000 requests per day
If you hit rate limits, responses will include X-RateLimit-* headers.
Tips
- Convert Unix timestamps:
date -d @TIMESTAMP(Linux) ordate -r TIMESTAMP(macOS) - Convert meters to km: divide by 1000
- Convert meters to miles: divide by 1609.34
- Convert m/s to km/h: multiply by 3.6
- Convert m/s to mph: multiply by 2.237
- Convert seconds to hours: divide by 3600
- Parse JSON with
jqif available, or usegrep/sedfor basic extraction
Examples
Get running activities from last week with distances:
LAST_WEEK=$(date -d '7 days ago' +%s 2>/dev/null || date -v-7d +%s)
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?after=${LAST_WEEK}&per_page=50"
| grep -E '"name"|"distance"|"type"'
Get total distance from recent activities:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}"
"https://www.strava.com/api/v3/athlete/activities?per_page=10"
| grep -o '"distance":[0-9.]*' | cut -d: -f2 | awk '{sum+=$1} END {print sum/1000 " km"}'
Error Handling
If you get a 401 Unauthorized error, your access token has expired. Run the token refresh command.
If you get rate limit errors, wait until the limit window resets (check X-RateLimit-Usage header).