🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

Strava

by @bohdanpodvirnyi

Load and analyze Strava activities, stats, and workouts using the Strava API

Versionv1.0.0
Downloads3,568
Stars⭐ 10
TERMINAL
clawhub install strava

πŸ“– About This Skill


name: strava description: Load and analyze Strava activities, stats, and workouts using the Strava API homepage: https://developers.strava.com/ metadata: {"clawdbot":{"emoji":"πŸƒ","requires":{"bins":["curl"],"env":["STRAVA_ACCESS_TOKEN"]},"primaryEnv":"STRAVA_ACCESS_TOKEN"}}

Strava Skill

Interact with Strava to load activities, analyze workouts, and track fitness data.

Setup

1. Create a Strava API Application

1. Go to https://www.strava.com/settings/api 2. Create an app (use http://localhost as callback for testing) 3. 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) or date -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 jq if available, or use grep/sed for 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).

    πŸ’‘ 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"}'
    

    βš™οΈ Configuration

    1. Create a Strava API Application

    1. Go to https://www.strava.com/settings/api 2. Create an app (use http://localhost as callback for testing) 3. 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"
    

    πŸ“‹ Tips & Best Practices

  • Convert Unix timestamps: date -d @TIMESTAMP (Linux) or date -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 jq if available, or use grep/sed for basic extraction