{
  "schemaVersion": "1.0",
  "item": {
    "slug": "strava",
    "name": "Strava",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/bohdanpodvirnyi/strava",
    "canonicalUrl": "https://clawhub.ai/bohdanpodvirnyi/strava",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/strava",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=strava",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "scripts/refresh_token.sh"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/strava"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/strava",
    "agentPageUrl": "https://openagent3.xyz/skills/strava/agent",
    "manifestUrl": "https://openagent3.xyz/skills/strava/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/strava/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Strava Skill",
        "body": "Interact with Strava to load activities, analyze workouts, and track fitness data."
      },
      {
        "title": "1. Create a Strava API Application",
        "body": "Go to https://www.strava.com/settings/api\nCreate an app (use http://localhost as callback for testing)\nNote your Client ID and Client Secret"
      },
      {
        "title": "2. Get Initial OAuth Tokens",
        "body": "Visit this URL in your browser (replace CLIENT_ID):\n\nhttps://www.strava.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost&approval_prompt=force&scope=activity:read_all\n\nAfter authorizing, you'll be redirected to http://localhost/?code=AUTHORIZATION_CODE\n\nExchange the code for tokens:\n\ncurl -X POST https://www.strava.com/oauth/token \\\n  -d client_id=YOUR_CLIENT_ID \\\n  -d client_secret=YOUR_CLIENT_SECRET \\\n  -d code=AUTHORIZATION_CODE \\\n  -d grant_type=authorization_code\n\nThis returns access_token and refresh_token."
      },
      {
        "title": "3. Configure Credentials",
        "body": "Add to ~/.clawdbot/clawdbot.json:\n\n{\n  \"skills\": {\n    \"entries\": {\n      \"strava\": {\n        \"enabled\": true,\n        \"env\": {\n          \"STRAVA_ACCESS_TOKEN\": \"your-access-token\",\n          \"STRAVA_REFRESH_TOKEN\": \"your-refresh-token\",\n          \"STRAVA_CLIENT_ID\": \"your-client-id\",\n          \"STRAVA_CLIENT_SECRET\": \"your-client-secret\"\n        }\n      }\n    }\n  }\n}\n\nOr use environment variables:\n\nexport STRAVA_ACCESS_TOKEN=\"your-access-token\"\nexport STRAVA_REFRESH_TOKEN=\"your-refresh-token\"\nexport STRAVA_CLIENT_ID=\"your-client-id\"\nexport STRAVA_CLIENT_SECRET=\"your-client-secret\""
      },
      {
        "title": "List Recent Activities",
        "body": "Get the last 30 activities:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?per_page=30\"\n\nGet the last 10 activities:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?per_page=10\""
      },
      {
        "title": "Filter Activities by Date",
        "body": "Get activities after a specific date (Unix timestamp):\n\n# Activities after Jan 1, 2024\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?after=1704067200\"\n\nGet activities in a date range:\n\n# Activities between Jan 1 - Jan 31, 2024\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?after=1704067200&before=1706745600\""
      },
      {
        "title": "Get Activity Details",
        "body": "Get full details for a specific activity (replace ACTIVITY_ID):\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/activities/ACTIVITY_ID\""
      },
      {
        "title": "Get Athlete Profile",
        "body": "Get the authenticated athlete's profile:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete\""
      },
      {
        "title": "Get Athlete Stats",
        "body": "Get athlete statistics (replace ATHLETE_ID):\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athletes/ATHLETE_ID/stats\""
      },
      {
        "title": "Pagination",
        "body": "Navigate through pages:\n\n# Page 1 (default)\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?page=1&per_page=30\"\n\n# Page 2\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?page=2&per_page=30\""
      },
      {
        "title": "Token Refresh",
        "body": "Access tokens expire every 6 hours. Refresh using the helper script:\n\nbash {baseDir}/scripts/refresh_token.sh\n\nOr manually:\n\ncurl -s -X POST https://www.strava.com/oauth/token \\\n  -d client_id=\"${STRAVA_CLIENT_ID}\" \\\n  -d client_secret=\"${STRAVA_CLIENT_SECRET}\" \\\n  -d grant_type=refresh_token \\\n  -d refresh_token=\"${STRAVA_REFRESH_TOKEN}\"\n\nThe response includes a new access_token and refresh_token. Update your configuration with both tokens."
      },
      {
        "title": "Common Data Fields",
        "body": "Activity objects include:\n\nname — Activity title\ndistance — Distance in meters\nmoving_time — Moving time in seconds\nelapsed_time — Total time in seconds\ntotal_elevation_gain — Elevation gain in meters\ntype — Activity type (Run, Ride, Swim, etc.)\nsport_type — Specific sport type\nstart_date — Start time (ISO 8601)\naverage_speed — Average speed in m/s\nmax_speed — Max speed in m/s\naverage_heartrate — Average heart rate (if available)\nmax_heartrate — Max heart rate (if available)\nkudos_count — Number of kudos received"
      },
      {
        "title": "Rate Limits",
        "body": "200 requests per 15 minutes\n2,000 requests per day\n\nIf you hit rate limits, responses will include X-RateLimit-* headers."
      },
      {
        "title": "Tips",
        "body": "Convert Unix timestamps: date -d @TIMESTAMP (Linux) or date -r TIMESTAMP (macOS)\nConvert meters to km: divide by 1000\nConvert meters to miles: divide by 1609.34\nConvert m/s to km/h: multiply by 3.6\nConvert m/s to mph: multiply by 2.237\nConvert seconds to hours: divide by 3600\nParse JSON with jq if available, or use grep/sed for basic extraction"
      },
      {
        "title": "Examples",
        "body": "Get running activities from last week with distances:\n\nLAST_WEEK=$(date -d '7 days ago' +%s 2>/dev/null || date -v-7d +%s)\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?after=${LAST_WEEK}&per_page=50\" \\\n  | grep -E '\"name\"|\"distance\"|\"type\"'\n\nGet total distance from recent activities:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?per_page=10\" \\\n  | grep -o '\"distance\":[0-9.]*' | cut -d: -f2 | awk '{sum+=$1} END {print sum/1000 \" km\"}'"
      },
      {
        "title": "Error Handling",
        "body": "If you get a 401 Unauthorized error, your access token has expired. Run the token refresh command.\n\nIf you get rate limit errors, wait until the limit window resets (check X-RateLimit-Usage header)."
      }
    ],
    "body": "Strava Skill\n\nInteract with Strava to load activities, analyze workouts, and track fitness data.\n\nSetup\n1. Create a Strava API Application\nGo to https://www.strava.com/settings/api\nCreate an app (use http://localhost as callback for testing)\nNote your Client ID and Client Secret\n2. Get Initial OAuth Tokens\n\nVisit this URL in your browser (replace CLIENT_ID):\n\nhttps://www.strava.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost&approval_prompt=force&scope=activity:read_all\n\n\nAfter authorizing, you'll be redirected to http://localhost/?code=AUTHORIZATION_CODE\n\nExchange the code for tokens:\n\ncurl -X POST https://www.strava.com/oauth/token \\\n  -d client_id=YOUR_CLIENT_ID \\\n  -d client_secret=YOUR_CLIENT_SECRET \\\n  -d code=AUTHORIZATION_CODE \\\n  -d grant_type=authorization_code\n\n\nThis returns access_token and refresh_token.\n\n3. Configure Credentials\n\nAdd to ~/.clawdbot/clawdbot.json:\n\n{\n  \"skills\": {\n    \"entries\": {\n      \"strava\": {\n        \"enabled\": true,\n        \"env\": {\n          \"STRAVA_ACCESS_TOKEN\": \"your-access-token\",\n          \"STRAVA_REFRESH_TOKEN\": \"your-refresh-token\",\n          \"STRAVA_CLIENT_ID\": \"your-client-id\",\n          \"STRAVA_CLIENT_SECRET\": \"your-client-secret\"\n        }\n      }\n    }\n  }\n}\n\n\nOr use environment variables:\n\nexport STRAVA_ACCESS_TOKEN=\"your-access-token\"\nexport STRAVA_REFRESH_TOKEN=\"your-refresh-token\"\nexport STRAVA_CLIENT_ID=\"your-client-id\"\nexport STRAVA_CLIENT_SECRET=\"your-client-secret\"\n\nUsage\nList Recent Activities\n\nGet the last 30 activities:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?per_page=30\"\n\n\nGet the last 10 activities:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?per_page=10\"\n\nFilter Activities by Date\n\nGet activities after a specific date (Unix timestamp):\n\n# Activities after Jan 1, 2024\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?after=1704067200\"\n\n\nGet activities in a date range:\n\n# Activities between Jan 1 - Jan 31, 2024\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?after=1704067200&before=1706745600\"\n\nGet Activity Details\n\nGet full details for a specific activity (replace ACTIVITY_ID):\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/activities/ACTIVITY_ID\"\n\nGet Athlete Profile\n\nGet the authenticated athlete's profile:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete\"\n\nGet Athlete Stats\n\nGet athlete statistics (replace ATHLETE_ID):\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athletes/ATHLETE_ID/stats\"\n\nPagination\n\nNavigate through pages:\n\n# Page 1 (default)\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?page=1&per_page=30\"\n\n# Page 2\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?page=2&per_page=30\"\n\nToken Refresh\n\nAccess tokens expire every 6 hours. Refresh using the helper script:\n\nbash {baseDir}/scripts/refresh_token.sh\n\n\nOr manually:\n\ncurl -s -X POST https://www.strava.com/oauth/token \\\n  -d client_id=\"${STRAVA_CLIENT_ID}\" \\\n  -d client_secret=\"${STRAVA_CLIENT_SECRET}\" \\\n  -d grant_type=refresh_token \\\n  -d refresh_token=\"${STRAVA_REFRESH_TOKEN}\"\n\n\nThe response includes a new access_token and refresh_token. Update your configuration with both tokens.\n\nCommon Data Fields\n\nActivity objects include:\n\nname — Activity title\ndistance — Distance in meters\nmoving_time — Moving time in seconds\nelapsed_time — Total time in seconds\ntotal_elevation_gain — Elevation gain in meters\ntype — Activity type (Run, Ride, Swim, etc.)\nsport_type — Specific sport type\nstart_date — Start time (ISO 8601)\naverage_speed — Average speed in m/s\nmax_speed — Max speed in m/s\naverage_heartrate — Average heart rate (if available)\nmax_heartrate — Max heart rate (if available)\nkudos_count — Number of kudos received\nRate Limits\n200 requests per 15 minutes\n2,000 requests per day\n\nIf you hit rate limits, responses will include X-RateLimit-* headers.\n\nTips\nConvert Unix timestamps: date -d @TIMESTAMP (Linux) or date -r TIMESTAMP (macOS)\nConvert meters to km: divide by 1000\nConvert meters to miles: divide by 1609.34\nConvert m/s to km/h: multiply by 3.6\nConvert m/s to mph: multiply by 2.237\nConvert seconds to hours: divide by 3600\nParse JSON with jq if available, or use grep/sed for basic extraction\nExamples\n\nGet running activities from last week with distances:\n\nLAST_WEEK=$(date -d '7 days ago' +%s 2>/dev/null || date -v-7d +%s)\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?after=${LAST_WEEK}&per_page=50\" \\\n  | grep -E '\"name\"|\"distance\"|\"type\"'\n\n\nGet total distance from recent activities:\n\ncurl -s -H \"Authorization: Bearer ${STRAVA_ACCESS_TOKEN}\" \\\n  \"https://www.strava.com/api/v3/athlete/activities?per_page=10\" \\\n  | grep -o '\"distance\":[0-9.]*' | cut -d: -f2 | awk '{sum+=$1} END {print sum/1000 \" km\"}'\n\nError Handling\n\nIf you get a 401 Unauthorized error, your access token has expired. Run the token refresh command.\n\nIf you get rate limit errors, wait until the limit window resets (check X-RateLimit-Usage header)."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/bohdanpodvirnyi/strava",
    "publisherUrl": "https://clawhub.ai/bohdanpodvirnyi/strava",
    "owner": "bohdanpodvirnyi",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/strava",
    "downloadUrl": "https://openagent3.xyz/downloads/strava",
    "agentUrl": "https://openagent3.xyz/skills/strava/agent",
    "manifestUrl": "https://openagent3.xyz/skills/strava/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/strava/agent.md"
  }
}