Back to Skills
    🦞

    strava

    Load and analyze Strava activities, stats, and workouts

    By @bohdanpodvirnyi
    View on GitHub
    SKILL.md
    ---
    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:
    ```bash
    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`:
    ```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:
    ```bash
    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:
    ```bash
    curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
      "https://www.strava.com/api/v3/athlete/activities?per_page=30"
    ```
    
    Get the last 10 activities:
    ```bash
    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):
    ```bash
    # 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:
    ```bash
    # 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):
    ```bash
    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:
    ```bash
    curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
      "https://www.strava.com/api/v3/athlete"
    ```
    
    ### Get Athlete Stats
    
    Get athlete statistics (replace ATHLETE_ID):
    ```bash
    curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
      "https://www.strava.com/api/v3/athletes/ATHLETE_ID/stats"
    ```
    
    ### Pagination
    
    Navigate through pages:
    ```bash
    # 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
    bash {baseDir}/scripts/refresh_token.sh
    ```
    
    Or manually:
    ```bash
    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:
    ```bash
    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:
    ```bash
    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).