{"openapi":"3.1.0","info":{"title":"NeverChill Athlete API","version":"1.0.0","description":"Read-only access to your own data. Personal access tokens from Settings \u2192 Athlete API. Availability depends on your account. Private activities are included. OAuth is not available."},"servers":[{"url":"https:\/\/neverchill.com"}],"security":[{"bearerAuth":[]}],"externalDocs":{"url":"https:\/\/neverchill.com\/developers\/athlete-api.md"},"x-rate-limits":{"readsPerMinute":60,"readsPerHour":1000,"readsPerDay":5000,"filesPerMinute":20,"filesPerDay":500,"idleDays":60},"paths":{"\/api\/v1\/athlete":{"get":{"operationId":"getAthlete","summary":"Your profile","description":"Read your name, username, and timezone. Required token scope: athlete-api:profile:read. Only the authenticated athlete\u2019s own data.","x-required-scope":"athlete-api:profile:read","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Profile"}}}},"401":{"description":"Missing, invalid, expired, or idle bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Wrong token lane or scope, incomplete registration, or unverified email.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Unavailable feature, missing or inaccessible activity, or unavailable file.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/NotFound"}}}},"422":{"description":"Invalid query parameters or workout date window.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/api\/v1\/activities":{"get":{"operationId":"listActivities","summary":"Your activities","description":"Page through your ready activities, including private ones. Required token scope: athlete-api:activities:read. Only the authenticated athlete\u2019s own data.","x-required-scope":"athlete-api:activities:read","parameters":[{"name":"from","in":"query","required":false,"description":"Inclusive day in the athlete timezone.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Inclusive day in the athlete timezone.","schema":{"type":"string","format":"date"}},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"cursor","in":"query","description":"Opaque next_cursor from the previous response. Malformed cursors start at the first page.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"Successful response","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ActivityPage"}}}},"401":{"description":"Missing, invalid, expired, or idle bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Wrong token lane or scope, incomplete registration, or unverified email.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Unavailable feature, missing or inaccessible activity, or unavailable file.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/NotFound"}}}},"422":{"description":"Invalid query parameters or workout date window.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/api\/v1\/activities\/{activity}":{"get":{"operationId":"getActivity","summary":"Activity details","description":"Read one of your activities by UUID. Required token scope: athlete-api:activities:read. Only the authenticated athlete\u2019s own data.","x-required-scope":"athlete-api:activities:read","parameters":[{"name":"activity","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Activity"}}}},"401":{"description":"Missing, invalid, expired, or idle bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Wrong token lane or scope, incomplete registration, or unverified email.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Unavailable feature, missing or inaccessible activity, or unavailable file.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/NotFound"}}}},"422":{"description":"Invalid query parameters or workout date window.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/api\/v1\/training\/workouts":{"get":{"operationId":"listPlannedWorkouts","summary":"Planned workouts","description":"Read your planned workouts in a date window. Required token scope: athlete-api:training:read. Only the authenticated athlete\u2019s own data.","x-required-scope":"athlete-api:training:read","parameters":[{"name":"from","in":"query","required":true,"description":"Inclusive YYYY-MM-DD. to must be on or after from and at most 366 days later. Narrow the window if has_more is true.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":true,"description":"Inclusive YYYY-MM-DD. to must be on or after from and at most 366 days later. Narrow the window if has_more is true.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Successful response","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WorkoutPage"}}}},"401":{"description":"Missing, invalid, expired, or idle bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Wrong token lane or scope, incomplete registration, or unverified email.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Unavailable feature, missing or inaccessible activity, or unavailable file.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/NotFound"}}}},"422":{"description":"Invalid query parameters or workout date window.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/api\/v1\/activities\/{activity}\/file.fit":{"get":{"operationId":"downloadActivityFit","summary":"Original FIT","description":"Download the original uploaded FIT file. Required token scope: athlete-api:rides:files. Original uploaded FIT only; GPX\/TCX originals return 404.","x-required-scope":"athlete-api:rides:files","parameters":[{"name":"activity","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application\/vnd.ant.fit":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing, invalid, expired, or idle bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Wrong token lane or scope, incomplete registration, or unverified email.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Unavailable feature, missing or inaccessible activity, or unavailable file.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/NotFound"}}}},"422":{"description":"Invalid query parameters or workout date window.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/api\/v1\/activities\/{activity}\/export.gpx":{"get":{"operationId":"exportActivityGpx","summary":"GPX export","description":"Export your activity GPS track as GPX. Required token scope: athlete-api:rides:files. Full owner track; no privacy-zone redaction. No GPS track returns 404.","x-required-scope":"athlete-api:rides:files","parameters":[{"name":"activity","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application\/gpx+xml":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing, invalid, expired, or idle bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Wrong token lane or scope, incomplete registration, or unverified email.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Unavailable feature, missing or inaccessible activity, or unavailable file.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/NotFound"}}}},"422":{"description":"Invalid query parameters or workout date window.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Scoped personal access token. Required ability is listed in x-required-scope on each operation."}},"schemas":{"Profile":{"type":"object","required":["id","name","username","timezone"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"],"maxLength":280},"username":{"type":["string","null"]},"timezone":{"type":"string"}}},"Activity":{"type":"object","required":["id","name","description","sport","started_at","distance_m","moving_time_s","elevation_gain_m","privacy"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"],"maxLength":280},"description":{"type":["string","null"],"maxLength":2000},"sport":{"type":["string","null"]},"started_at":{"type":["string","null"],"format":"date-time"},"distance_m":{"type":["integer","null"]},"moving_time_s":{"type":["integer","null"]},"elevation_gain_m":{"type":["integer","null"]},"privacy":{"type":["string","null"]}}},"Workout":{"type":"object","required":["id","scheduled_date","sport","workout_type","status","title","coach_note","planned_duration_seconds","planned_distance_meters"],"properties":{"id":{"type":"string","format":"uuid"},"scheduled_date":{"type":["string","null"],"format":"date"},"sport":{"type":["string","null"]},"workout_type":{"type":["string","null"]},"status":{"type":["string","null"]},"title":{"type":["string","null"],"maxLength":280},"coach_note":{"type":["string","null"],"maxLength":2000},"planned_duration_seconds":{"type":["integer","null"]},"planned_distance_meters":{"type":["integer","null"]}}},"ActivityPage":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","maxItems":50,"items":{"$ref":"#\/components\/schemas\/Activity"}},"next_cursor":{"type":["string","null"]}}},"WorkoutPage":{"type":"object","required":["has_more","data"],"properties":{"has_more":{"type":"boolean"},"data":{"type":"array","maxItems":500,"items":{"$ref":"#\/components\/schemas\/Workout"}}}},"NotFound":{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"not_found"}}},"Error":{"type":"object","required":["message"],"properties":{"message":{"type":"string"},"code":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}}}}}