{"openapi":"3.1.0","info":{"title":"Strava (BYOK) API","version":"0.1.0","description":"Strava (BYOK) lets an AI assistant read your own Strava data through the Strava API with a key you supply (Strava access token (short-lived: it expires six hours after it is issued)). Read-only: 6 tools (get_my_profile, list_my_activities, get_activity, get_my_stats, get_gear, list_my_routes). The BYOK key travels with each request, is used for that one call only and is never stored, logged or...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-strava.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-strava/docs"},"termsOfService":"https://connectorbay.com/byok-strava/terms"},"servers":[{"url":"https://byok-strava.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-strava/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_my_profile":{"post":{"operationId":"get_my_profile","summary":"Show the Strava athlete the token belongs to: name, city, country, units, follower counts, FTP, weight, bikes and shoes.","description":"Show the Strava athlete the token belongs to: name, city, country, units, follower counts, FTP, weight, bikes and shoes. Reads only the data of the athlete the token belongs to. Use for \"Which Strava account is my token connected to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_my_profileArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_my_activities":{"post":{"operationId":"list_my_activities","summary":"List your own recent Strava activities (newest first) with type, distance in metres, moving time in seconds, elevation, ","description":"List your own recent Strava activities (newest first) with type, distance in metres, moving time in seconds, elevation, speed and heart rate. Needs a token with the activity:read scope (activity:read_all to include Only Me activities). Reads only the data of the athlete the token belongs to. Use for \"What were my last 10 runs and rides on Strava\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"after":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only activities that started after this time, as a Unix timestamp in seconds.","title":"After"},"before":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only activities that started before this time, as a Unix timestamp in seconds.","title":"Before"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":30,"description":"How many activities per page (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_my_activitiesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_activity":{"post":{"operationId":"get_activity","summary":"Get one of your own activities by id: totals, speed, heart rate, calories, description, device and gear. Needs the activ","description":"Get one of your own activities by id: totals, speed, heart rate, calories, description, device and gear. Needs the activity:read scope. Reads only the data of the athlete the token belongs to. Use for \"Show the details of my Strava activity 12345678\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Strava activity id (a number from list_my_activities).","title":"Id","type":"integer"},"include_all_efforts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include every segment effort of the activity.","title":"Include All Efforts"}},"required":["id"],"title":"get_activityArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_my_stats":{"post":{"operationId":"get_my_stats","summary":"Get your own totals: recent (four weeks), year-to-date and all-time runs, rides and swims, plus the biggest ride distanc","description":"Get your own totals: recent (four weeks), year-to-date and all-time runs, rides and swims, plus the biggest ride distance and climb. Counts only activities visible to everyone. Reads only the data of the athlete the token belongs to. Use for \"How far have I run this year on Strava\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Your own Strava athlete id (the id field of get_my_profile).","title":"Id","type":"integer"}},"required":["id"],"title":"get_my_statsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_gear":{"post":{"operationId":"get_gear","summary":"Get one piece of your own gear (a bike or shoes) by its id, with brand, model and total distance in metres. Reads only t","description":"Get one piece of your own gear (a bike or shoes) by its id, with brand, model and total distance in metres. Reads only the data of the athlete the token belongs to. Use for \"How many kilometres are on my bike b12345678\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Gear id as a string, for example 'b12345678' for a bike or 'g12345678' for shoes (from get_my_profile or an activity's gear_id).","maxLength":200,"title":"Id","type":"string"}},"required":["id"],"title":"get_gearArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_my_routes":{"post":{"operationId":"list_my_routes","summary":"List routes you created or starred on Strava. The answer is returned as the provider sends it, capped at 20 routes per c","description":"List routes you created or starred on Strava. The answer is returned as the provider sends it, capped at 20 routes per call. Reads only the data of the athlete the token belongs to. Use for \"What routes do I have saved on Strava\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Your own Strava athlete id (the id field of get_my_profile).","title":"Id","type":"integer"},"per_page":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many routes per page (1 to 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["id"],"title":"list_my_routesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}