Coach API Reference
Version 1.29.0. Program athletes, manage reusable templates, browse and add exercises, maintain athlete PRs and meets, and read live Oura and WHOOP recovery data plus FatSecret nutrition data. All account data is scoped to the coach who created the personal access token. Paths are relative to the base URL, and every request except the health check sends a bearer token; see Getting Started for tokens, errors, and revisions.
https://graceful-tortoise-95.convex.site/api/v1This page is generated from the OpenAPI document, which agents and tools can import directly:
https://graceful-tortoise-95.convex.site/api/v1/openapi.jsonAccount And Health
GET /health
Check API availability
- Operation ID
health- Permission
- None (public)
- CLI
atlas health
Responses
200API is available (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /account
Inspect the authenticated token, scopes, and rate limit
- Operation ID
getAgentAccount- Permission
read
Responses
200Authenticated token context (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Roster
Stable Roster Identities
Page through GET /roster?limit=100 and follow continueCursor until isDone is true for the complete roster. Create or adopt a roster entry before writing a new program, and use the athleteId it returns instead of an editable name.
GET /roster
Page through the complete stable coach-owned athlete roster
- Operation ID
listRoster- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
limit | query | integer | |
cursor | query | string |
Responses
200Paginated roster with page, continueCursor, and isDone (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Athletes
Name And ID Routes
Most athlete endpoints come in two forms: /athletes/{athleteName}/… for legacy name-based records and /athletes/id/{athleteId}/… for the stable roster ID. Prefer the ID form. GET /athletes is a compatibility view that also surfaces legacy name-only records.
Deleting Athlete Data
Deleting an athlete's data removes every coach-owned program, personal record, meet, meet result, meet plan, week note, session check-in, and badge for that athlete, in bounded transactions that stay safe for long histories. The response counts each kind of record deleted. The roster entry stays; archive it separately. These deletes need athlete_data_delete.
GET /athletes
List athletes belonging to the coach
- Operation ID
listAthletes- Permission
read
Responses
POST /athletes
Create or adopt a stable coach-owned roster entry
- Operation ID
createAthlete- Permission
write
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
nameRequired | string |
Responses
201Athlete created or adopted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/by-id/{athleteId}
Get an athlete profile and integration status
- Operation ID
getAthleteById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
PATCH /athletes/by-id/{athleteId}
Update an athlete name, email, or Output connection
- Operation ID
updateAthleteProfileById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Request Body
Required, JSON
Responses
DELETE /athletes/by-id/{athleteId}
Archive an athlete roster profile without deleting its history
- Operation ID
archiveAthleteProfileById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
200Athlete profile archived (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/{athleteName}
Delete all programs, personal records, and meet data for an athlete
- Operation ID
deleteAthleteData- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Responses
200Athlete data deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/id/{athleteId}
Delete all programs, personal records, and meet data for an athlete
- Operation ID
deleteAthleteDataById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
200Athlete data deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Personal Records
Personal Record Rules
- An athlete holds at most 100 records. A write that would add one past that returns
400; updates to existing records still succeed. repMaxis a positive integer andweightis kilograms from 0 to 1,500.recordedAt(epoch milliseconds) defaults to the time of the write.- Any spelling of the snatch, clean, jerk, clean & jerk, push press, back squat, or front squat is stored as its id:
snatch,clean,jerk,clean_jerk,push_press,back_squat,front_squat. Other names keep their spelling, trimmed, from 1 to 120 characters. - Writes and
?exerciseName=reads match a record regardless of case, spacing, punctuation, and & versus and, so records written here show up in the app's Progress tab and the coach console. calculate-weightsrounds working weights from an athlete's PR and the requested percentages.
GET /athletes/{athleteName}/recent-bests
Get best estimated 1RMs from completed non-miss sets in the prior three months
- Operation ID
getRecentBests- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
todayRequired | query | string |
Responses
200Recent bests keyed by exercise (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /athletes/{athleteName}/calculate-weights
Calculate rounded training weights from an athlete PR
- Operation ID
calculateTrainingWeights- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Request Body
Required, JSON
Responses
200Calculated raw and rounded weights (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/{athleteName}/personal-records
List an athlete's personal records
- Operation ID
listPersonalRecords- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
exerciseName | query | string |
Responses
200Personal records (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/{athleteName}/personal-records
Create or update an athlete personal record
- Operation ID
upsertPersonalRecord- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Request Body
Required, JSON
Responses
200Personal record saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/{athleteName}/personal-records
Delete every personal record for an athlete
- Operation ID
deleteAllPersonalRecords- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Responses
200Personal records deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /athletes/{athleteName}/personal-records/bulk
Create or update up to 100 personal records
- Operation ID
bulkUpsertPersonalRecords- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Request Body
Required, JSON
Responses
200Personal records saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/{athleteName}/personal-records/{personalRecordId}
Delete one personal record
- Operation ID
deletePersonalRecord- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
personalRecordIdRequired | path | string |
Responses
200Personal record deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/recent-bests
Get best estimated 1RMs from completed non-miss sets in the prior three months
- Operation ID
getRecentBestsById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
todayRequired | query | string |
Responses
200Recent bests keyed by exercise (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /athletes/id/{athleteId}/calculate-weights
Calculate rounded training weights from an athlete PR
- Operation ID
calculateTrainingWeightsById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Request Body
Required, JSON
Responses
200Calculated raw and rounded weights (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/personal-records
List an athlete's personal records
- Operation ID
listPersonalRecordsById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
exerciseName | query | string |
Responses
200Personal records (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/id/{athleteId}/personal-records
Create or update an athlete personal record
- Operation ID
upsertPersonalRecordById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Request Body
Required, JSON
Responses
200Personal record saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/id/{athleteId}/personal-records
Delete every personal record for an athlete
- Operation ID
deleteAllPersonalRecordsById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
200Personal records deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /athletes/id/{athleteId}/personal-records/bulk
Create or update up to 100 personal records
- Operation ID
bulkUpsertPersonalRecordsById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Request Body
Required, JSON
Responses
200Personal records saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/id/{athleteId}/personal-records/{personalRecordId}
Delete one personal record
- Operation ID
deletePersonalRecordById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
personalRecordIdRequired | path | string |
Responses
200Personal record deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Meets And Annual Plans
Meets And Annual Plans
Meet names are trimmed and at most 120 characters. An athlete holds at most 50 upcoming meets, so a meet list is never truncated; moving a past meet to a future date counts like a new meet. Writing meets needs the athlete's club owner or assigned coach. Annual plans return meets, overlapping programs, and the coach's week notes; meet-result overrides can create, update, hide, or delete historical results.
GET /athletes/{athleteName}/annual-plan
Get meets, overlapping programs, and week notes in an athlete's date range
- Operation ID
getAnnualPlan- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
startDateRequired | query | string | |
endDateRequired | query | string |
Responses
200Annual plan range (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/{athleteName}/meet
List an athlete's meets
- Operation ID
getMeet- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Responses
200Meets (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/{athleteName}/meet
Add an upcoming meet for an athlete
- Operation ID
upsertMeet- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Request Body
Required, JSON
Responses
200Meet saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/{athleteName}/meet
Delete all upcoming meets for an athlete
- Operation ID
deleteMeet- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Responses
200Meets deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/{athleteName}/meet-results
List locally managed and imported meet-result overrides
- Operation ID
listMeetResults- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Responses
200Meet results (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/{athleteName}/meet-results
Create or update a local meet result or imported-result override
- Operation ID
upsertMeetResult- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Request Body
Required, JSON
Responses
200Meet result saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/{athleteName}/meet-results/{sourceKey}
Delete a local result or hide an imported result
- Operation ID
removeMeetResult- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
sourceKeyRequired | path | string |
Responses
200Meet result removed or hidden (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/{athleteName}/meet/{meetId}
Update one upcoming meet
- Operation ID
updateAthleteMeet- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
meetIdRequired | path | string |
Request Body
Required, JSON
Responses
200Meet saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/{athleteName}/meet/{meetId}
Delete one upcoming meet
- Operation ID
deleteAthleteMeet- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
meetIdRequired | path | string |
Responses
200Meet deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/annual-plan
Get meets, overlapping programs, and week notes in an athlete's date range
- Operation ID
getAnnualPlanById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
startDateRequired | query | string | |
endDateRequired | query | string |
Responses
200Annual plan range (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/meet
List an athlete's meets
- Operation ID
getMeetById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
200Meets (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/id/{athleteId}/meet
Add an upcoming meet for an athlete
- Operation ID
upsertMeetById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Request Body
Required, JSON
Responses
200Meet saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/id/{athleteId}/meet
Delete all upcoming meets for an athlete
- Operation ID
deleteMeetById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
200Meets deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/meet-results
List locally managed and imported meet-result overrides
- Operation ID
listMeetResultsById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
200Meet results (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/id/{athleteId}/meet-results
Create or update a local meet result or imported-result override
- Operation ID
upsertMeetResultById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Request Body
Required, JSON
Responses
200Meet result saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/id/{athleteId}/meet-results/{sourceKey}
Delete a local result or hide an imported result
- Operation ID
removeMeetResultById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
sourceKeyRequired | path | string |
Responses
200Meet result removed or hidden (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/id/{athleteId}/meet/{meetId}
Update one upcoming meet
- Operation ID
updateAthleteMeetById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
meetIdRequired | path | string |
Request Body
Required, JSON
Responses
200Meet saved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/id/{athleteId}/meet/{meetId}
Delete one upcoming meet
- Operation ID
deleteAthleteMeetById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
meetIdRequired | path | string |
Responses
200Meet deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Meet Plans
GET /athletes/{athleteName}/meet-plans
List an athlete's meet-day worksheets
- Operation ID
listMeetPlans- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Responses
200Meet plan summaries (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/{athleteName}/meet-plans
Create a meet-day worksheet for an athlete
- Operation ID
createMeetPlan- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string |
Request Body
Required, JSON
Responses
200Meet plan created (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/{athleteName}/meet-plans/{meetPlanId}
Get one meet-day worksheet
- Operation ID
getMeetPlan- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
meetPlanIdRequired | path | string |
Responses
200Meet plan (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/{athleteName}/meet-plans/{meetPlanId}
Replace one meet-day worksheet
- Operation ID
updateMeetPlan- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
meetPlanIdRequired | path | string |
Request Body
Required, JSON
Responses
DELETE /athletes/{athleteName}/meet-plans/{meetPlanId}
Delete one meet-day worksheet
- Operation ID
deleteMeetPlan- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
meetPlanIdRequired | path | string |
Responses
200Meet plan deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/{athleteName}/meet-plans/{meetPlanId}/export
Export the full meet-plan page (worksheet plus recent lifts, check-in flags, last meet, and two-year history) as JSON or PDF
- Operation ID
exportMeetPlan- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
meetPlanIdRequired | path | string | |
todayRequired | query | string | Anchor date for recent-lift and meet-history windows |
format | query | "json" | "pdf" | Use pdf or send Accept: application/pdf for a binary PDF download |
Responses
200Meet plan page export (MeetPlanPageExport) as application/pdf400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/meet-plans
List an athlete's meet-day worksheets
- Operation ID
listMeetPlansById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Responses
200Meet plan summaries (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/id/{athleteId}/meet-plans
Create a meet-day worksheet for an athlete
- Operation ID
createMeetPlanById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string |
Request Body
Required, JSON
Responses
200Meet plan created (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/meet-plans/{meetPlanId}
Get one meet-day worksheet
- Operation ID
getMeetPlanById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
meetPlanIdRequired | path | string |
Responses
200Meet plan (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/id/{athleteId}/meet-plans/{meetPlanId}
Replace one meet-day worksheet
- Operation ID
updateMeetPlanById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
meetPlanIdRequired | path | string |
Request Body
Required, JSON
Responses
DELETE /athletes/id/{athleteId}/meet-plans/{meetPlanId}
Delete one meet-day worksheet
- Operation ID
deleteMeetPlanById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
meetPlanIdRequired | path | string |
Responses
200Meet plan deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/meet-plans/{meetPlanId}/export
Export the full meet-plan page (worksheet plus recent lifts, check-in flags, last meet, and two-year history) as JSON or PDF
- Operation ID
exportMeetPlanById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
meetPlanIdRequired | path | string | |
todayRequired | query | string | Anchor date for recent-lift and meet-history windows |
format | query | "json" | "pdf" | Use pdf or send Accept: application/pdf for a binary PDF download |
Responses
200Meet plan page export (MeetPlanPageExport) as application/pdf400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Week Notes
Week Note Rules
A week note is stored on the Sunday that starts the week, so any day in that week addresses the same note. PUT rejects a blank note; DELETE removes it and needs athlete_data_delete. Only a coach who manages the athlete may write a note, even though the athlete can read it.
PUT /athletes/{athleteName}/week-notes/{weekStartDate}
Set the coach note for the week containing a date
Notes are stored on the Sunday that starts the week, so any day in the week addresses the same note.
- Operation ID
upsertAthleteWeekNote- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
weekStartDateRequired | path | string |
Request Body
Required, JSON
Responses
200Week note saved (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/{athleteName}/week-notes/{weekStartDate}
Remove the coach note for the week containing a date
- Operation ID
deleteAthleteWeekNote- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
weekStartDateRequired | path | string |
Responses
200Week note removed (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /athletes/id/{athleteId}/week-notes/{weekStartDate}
Set the coach note for the week containing a date
Notes are stored on the Sunday that starts the week, so any day in the week addresses the same note.
- Operation ID
upsertAthleteWeekNoteById- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
weekStartDateRequired | path | string |
Request Body
Required, JSON
Responses
200Week note saved (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /athletes/id/{athleteId}/week-notes/{weekStartDate}
Remove the coach note for the week containing a date
- Operation ID
deleteAthleteWeekNoteById- Permission
athlete_data_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
weekStartDateRequired | path | string |
Responses
200Week note removed (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Session Check-Ins
GET /athletes/{athleteName}/session-check-ins
List pre- and post-workout check-ins for an athlete
- Operation ID
listSessionCheckIns- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
from | query | string | |
to | query | string | |
limit | query | integer |
Responses
GET /athletes/id/{athleteId}/session-check-ins
List pre- and post-workout check-ins for an athlete
- Operation ID
listSessionCheckInsById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
from | query | string | |
to | query | string | |
limit | query | integer |
Responses
Wearables And Nutrition
Live Health Data
These endpoints need wearables_read and read live data from services the athlete connected in the mobile app under Settings, Connections. Atlas does not store the measurements.
- Oura: up to one year of sleep duration, HRV, heart rate, and readiness.
- FatSecret: up to one year of daily calories, protein, carbohydrates, and fat, and the foods logged on one day with fiber, sugar, and sodium.
GET /athletes/{athleteName}/oura
Fetch live Oura sleep and readiness metrics for an athlete
- Operation ID
getOuraMetrics- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
fromRequired | query | string | |
toRequired | query | string |
Responses
200Live Oura metrics, or an empty result when not connected (OuraMetricsEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502Oura rejected or could not complete the upstream request (Error)
GET /athletes/{athleteName}/whoop
Fetch live WHOOP recovery, sleep, and strain metrics for an athlete
- Operation ID
getWhoopMetrics- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
fromRequired | query | string | Inclusive start date; the WHOOP range may not exceed 90 days |
toRequired | query | string |
Responses
200Live WHOOP metrics, or an empty result when not connected (WhoopMetricsEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502WHOOP rejected or could not complete the upstream request (Error)
GET /athletes/{athleteName}/nutrition
Fetch live daily calorie and macronutrient totals from an athlete's connected nutrition app
Returns one point per logged day from the athlete's connected food diary (currently FatSecret). Use it to review energy and macronutrient intake alongside training load. For the individual foods behind a day, call the entries operation.
- Operation ID
getNutritionMetrics- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
fromRequired | query | string | Inclusive start date; the range may not exceed 366 days |
toRequired | query | string |
Responses
200Live nutrition totals, or an empty result when not connected (NutritionMetricsEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502The nutrition provider rejected or could not complete the upstream request (Error)
GET /athletes/{athleteName}/nutrition/entries
Fetch the individual foods an athlete logged on one day
Returns every food-diary entry for a single date with meal slot, serving description, calories, macronutrients, fiber, sugar, and sodium. One upstream request per call.
- Operation ID
getNutritionFoodEntries- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
dateRequired | query | string |
Responses
200Live food entries for the day, or an empty result when not connected (NutritionFoodEntriesEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502The nutrition provider rejected or could not complete the upstream request (Error)
GET /athletes/id/{athleteId}/oura
Fetch live Oura sleep and readiness metrics for an athlete
- Operation ID
getOuraMetricsById- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
fromRequired | query | string | |
toRequired | query | string |
Responses
200Live Oura metrics, or an empty result when not connected (OuraMetricsEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502Oura rejected or could not complete the upstream request (Error)
GET /athletes/id/{athleteId}/whoop
Fetch live WHOOP recovery, sleep, and strain metrics for an athlete
- Operation ID
getWhoopMetricsById- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
fromRequired | query | string | Inclusive start date; the WHOOP range may not exceed 90 days |
toRequired | query | string |
Responses
200Live WHOOP metrics, or an empty result when not connected (WhoopMetricsEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502WHOOP rejected or could not complete the upstream request (Error)
GET /athletes/id/{athleteId}/nutrition
Fetch live daily calorie and macronutrient totals from an athlete's connected nutrition app
Returns one point per logged day from the athlete's connected food diary (currently FatSecret). Use it to review energy and macronutrient intake alongside training load. For the individual foods behind a day, call the entries operation.
- Operation ID
getNutritionMetricsById- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
fromRequired | query | string | Inclusive start date; the range may not exceed 366 days |
toRequired | query | string |
Responses
200Live nutrition totals, or an empty result when not connected (NutritionMetricsEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502The nutrition provider rejected or could not complete the upstream request (Error)
GET /athletes/id/{athleteId}/nutrition/entries
Fetch the individual foods an athlete logged on one day
Returns every food-diary entry for a single date with meal slot, serving description, calories, macronutrients, fiber, sugar, and sodium. One upstream request per call.
- Operation ID
getNutritionFoodEntriesById- Permission
wearables_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
dateRequired | query | string |
Responses
200Live food entries for the day, or an empty result when not connected (NutritionFoodEntriesEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)502The nutrition provider rejected or could not complete the upstream request (Error)
Athlete Workouts
GET /athletes/{athleteName}/workouts
Get flattened programmed workouts for an athlete
- Operation ID
getWorkoutsForAnalytics- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteNameRequired | path | string | |
programName | query | string |
Responses
200Flattened workouts (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /athletes/id/{athleteId}/workouts
Get flattened programmed workouts for an athlete
- Operation ID
getWorkoutsForAnalyticsById- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteIdRequired | path | string | |
programName | query | string |
Responses
200Flattened workouts (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Programs
Program Writes
- Create, read, replace, and delete whole programs, or check for and get the current program. Program and template list pages hold at most 10 items.
GET /programs/current/summary?athleteId=&today=returns the progress summary the console's athlete overview shows: the current week, completed and missed sessions, and the average session rating. It picks the active program, else the next to start, else the most recent, and returnsnullwhen the athlete has none.- Add, patch, move, copy, and delete weeks, days, and exercises without replacing the program. Every such write sends the program revision in
If-Match. - Set, update, or clear a coach session note (
coachNotes) on a day. - Complete a workout with its rating, session intensity, and duration in one revision with
/complete. Do not mark work complete as a side effect of editing prescriptions. - Normalize and validate a draft with
POST /programs/validatebefore saving it. - A replace or metadata patch that would give the program the athlete, name, and start date of another program returns
409.
Completed Sessions
Completed sessions are locked: only the athlete can change a completed day, from the app. A day, week, or exercise write that would change, move, or remove one returns 409, except moving a completed day to another date (/move), which returns 400.
- A replace keeps every completed session exactly as the athlete logged it, in its week and day slot, even when the body leaves that day out.
- A replace that would remove a whole week holding a completed session returns
VALIDATION_ERROR. One that renumbers a week's days so a completed session's exercises land under another day number, while its own slot is left out or holds something else, returns409. - A program that holds a completed day cannot move to another athlete (
400) or be deleted (409). Changing its start date leaves completed days on the date they were trained.
Prescriptions
An exercise's reps is a string or an array of strings, each one of the shapes below, or blank for a set the athlete has not filled in. Text such as "10 each side", "AMRAP", "1+1", or "2 x 20m" is rejected with INVALID_FORMAT; put instructions in exerciseNotes.
| Shape | Example | Meaning |
|---|---|---|
| Count | "3" or ["3", "2", "1"] | Repetitions. A string applies to every set; an array varies by set. |
| Range | "10-12" | Inclusive repetition range. |
| Timed suffix | "30s", "30-45s" | Duration in seconds. |
| Timed unit | { "reps": "30", "prescriptionUnit": "seconds" } | Same as "30s". |
| Distance suffix | "100m", "100-200m" | Distance in meters. |
| Distance unit | { "reps": "100", "prescriptionUnit": "meters" } | Same as "100m". prescriptionUnit may be reps, seconds, or meters. |
Program create and replace, validate, template create and update, add exercise, and patch exercise all accept these shapes, and reads return the fields as sent. A patch may set prescriptionUnit to null to clear it.
An exercise's sets is a whole number from 1 to 99 on every write. An array reps and setStatuses need one entry per set; setWeights may be shorter, since it stops at the last weighed set, but never longer.
Exercise Intensity
An exercise prescribes working intensity with one of four modes. Velocity is an optional overlay that stacks with percent or RPE. Percent-only payloads stay valid, and a range is never the default and never inferred from a two-number array.
| Field | Type | Notes |
|---|---|---|
intensityMode | percent, percent_range, rpe, or rpe_range | Omit or use percent for a single percent of a PR. Range modes store a lower and upper bound. |
percent | number, number array, or array of pairs | Greater than 0 and at most 200. A per-set array must match sets. For percent_range, [70, 80] is one 70–80 range for every set; nested pairs vary it by set. Mutually exclusive with rpe. |
rpe | number, number array, or array of pairs | Rating of perceived exertion from 1 to 10, in the same shapes as percent. |
velocity | number, number array, or array of pairs | Optional bar speed in m/s, greater than 0 and at most 5. Independent of intensityMode. |
velocityRange | boolean | When true, velocity stores a lower and upper bound. Without it, a two-number array is two per-set values. |
loggedVelocity | number or number array | Athlete-measured bar speed in m/s, written by the athlete app. |
If only rpe is present, the API infers intensityMode: "rpe". On an exercise patch, setting rpe switches the exercise to RPE and clears percent; setting percent does the reverse; setting velocity keeps both. intensityMode, rpe, percent, velocity, and velocityRange may be null to clear them. Templates take the same fields.
Rep Target Changes
A program's or template's repTargets are its week-1 rep target percentages. repTargetChanges lists targets that take over later in the block, each from its startWeek until the next change.
- Start weeks are whole weeks from 2 to the block's last week, strictly increasing, with at most 52 changes.
- Percentages are strings of at most 16 characters. Categories left out are stored as empty strings.
- Reads always return the field, as
[]when targets never change. - On create or replace, omitting the field keeps stored changes that still fall inside the block, and
[]clears them.PATCH /programs/{programId}replaces the whole list. - Deleting or renumbering weeks drops changes past the new last week. Assigning a template copies its changes.
Notes And Names
A day's coachNotes and sessionComments and an exercise's exerciseNotes hold at most 2,000 characters; an exercise's athleteComments at most 1,000. A program or template name is required and at most 120 characters after trimming. A program or template body over a bound returns 422 with the offending path; a day, exercise, metadata, or assignment write returns 400. A longer value stored before these bounds existed is kept as long as a write leaves it unchanged.
GET /programs
List programs, optionally filtered by athleteName
- Operation ID
listPrograms- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteName | query | string | |
athleteId | query | string | |
limit | query | integer | |
cursor | query | string |
Responses
200Programs (ProgramPageEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /programs
Create a normalized, idempotent program; numbering, completion flags, targets, and totals receive defaults
- Operation ID
createProgram- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
Idempotency-Key | header | string |
Request Body
Required, JSON
Responses
200Existing idempotent result (ProgramMutationResult)201Program created (ProgramMutationResult)401Missing or invalid token (Error)403Token lacks the required permission (Error)409Conflicting or duplicate resource (Error)422Invalid request (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /programs/{programId}
Get a complete program
- Operation ID
getProgram- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
If-None-Match | header | string | Return 304 when this revision ETag is still current |
Responses
200Program (ProgramEnvelope)304Program has not changed401Missing or invalid token (Error)403Token lacks the required permission (Error)404Not found429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /programs/{programId}
Replace a complete program
- Operation ID
updateProgram- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
200Program updated (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)409Conflicting or duplicate resource (Error)412Program changed since it was read (Error)422Invalid request (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PATCH /programs/{programId}
Update athlete, name, start date, rep targets, rep target changes, or weekly totals without replacing workouts
- Operation ID
patchProgramMetadata- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
athleteName | string | |
programName | string | min length 1, max length 120 |
startDate | string | format date |
athleteId | string | |
shiftScheduledDates | boolean | Shift every explicit scheduledDate by the same delta as startDate |
repTargets | RepTargets | |
weekTotals | array of object | |
repTargetChanges | RepTargetChanges | Replaces the whole schedule; [] clears it |
Responses
200Program metadata updated (DataEnvelope)400Invalid request (Error)401Missing or invalid token (Error)403Token lacks the required permission (Error)409Conflicting or duplicate resource (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /programs/{programId}
Delete a program
- Operation ID
deleteProgram- Permission
program_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Responses
200Program deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)409Conflicting or duplicate resource (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /programs/current
Get the current program, optionally for one athlete
- Operation ID
getCurrentProgram- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
todayRequired | query | string | |
athleteName | query | string | |
athleteId | query | string |
Responses
200Current program or null (NullableProgramEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /programs/current/summary
Summarize one athlete's current program as the console overview does
Picks the active program, else the next to start, else the most recent, and reports its week, completed and missed sessions, and session ratings.
- Operation ID
getCurrentProgramSummary- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
todayRequired | query | string | |
athleteId | query | string | |
athleteName | query | string |
Responses
200Program summary, or null when the athlete has no program (CurrentProgramSummaryEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /programs/exists
Check for a program by athlete, name, and start date
- Operation ID
checkProgramExists- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteName | query | string | |
athleteId | query | string | |
programNameRequired | query | string | |
startDateRequired | query | string |
Responses
200Existence result (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /programs/validate
Normalize and validate a program without saving it
- Operation ID
validateProgram- Permission
read
Request Body
Required, JSON
Responses
200Validation issues and normalized payload (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /programs/{programId}/weeks
Add a week and update weekCount automatically
- Operation ID
addProgramWeek- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
PATCH /programs/{programId}/weeks/{weekNumber}
Renumber a week or update its total
- Operation ID
patchProgramWeek- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
DELETE /programs/{programId}/weeks/{weekNumber}
Delete a week
- Operation ID
deleteProgramWeek- Permission
workout_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Responses
POST /programs/{programId}/weeks/{weekNumber}/copy
Copy a week while resetting athlete completion data
- Operation ID
copyProgramWeek- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
POST /programs/{programId}/weeks/{weekNumber}/days
Add a workout day to a program week
- Operation ID
addProgramDay- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
201Workout day added (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PATCH /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}
Update selected workout-day fields without replacing the program
- Operation ID
patchProgramDay- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
200Workout day updated (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}
Delete a workout day
- Operation ID
deleteProgramDay- Permission
workout_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Responses
200Workout day deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/move
Move a workout day to another date, swapping with an occupied date
- Operation ID
moveProgramDay- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
200Workout day moved (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/complete
Atomically complete a workout and save its rating and intensity
- Operation ID
completeWorkoutSession- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
200Workout completed (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/copy
Copy a day to any week while resetting athlete completion data
- Operation ID
copyProgramDay- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
POST /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/exercises
Add an exercise to a workout day
- Operation ID
addProgramExercise- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
PATCH /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/exercises/{exerciseNumber}
Update selected exercise and set fields
- Operation ID
patchProgramExercise- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
exerciseNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Request Body
Required, JSON
Responses
200Exercise updated (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/exercises/{exerciseNumber}
Delete an exercise from a workout day
- Operation ID
deleteProgramExercise- Permission
workout_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programIdRequired | path | string | |
weekNumberRequired | path | integer | |
dayNumberRequired | path | integer | |
exerciseNumberRequired | path | integer | |
If-MatchRequired | header | integer | Revision returned by GET /programs/{programId} |
Responses
200Exercise deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Templates
GET /templates
List reusable program templates
- Operation ID
listTemplates- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
limit | query | integer | |
cursor | query | string |
Responses
200Templates (TemplatePageEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /templates
Create or update a reusable template by name
- Operation ID
saveTemplate- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
If-Match | header | integer | Required when replacing, moving, or deleting an existing template |
Request Body
Required, JSON
Responses
GET /templates/{templateId}
Get a reusable template
- Operation ID
getTemplate- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
templateIdRequired | path | string | |
If-None-Match | header | string | Return 304 when this revision ETag is still current |
Responses
200Template (TemplateEnvelope)304Template has not changed401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /templates/{templateId}
Delete a reusable template
- Operation ID
deleteTemplate- Permission
program_delete
Parameters
| Name | In | Type | Details |
|---|---|---|---|
templateIdRequired | path | string | |
If-MatchRequired | header | integer | Required when replacing, moving, or deleting an existing template |
Responses
200Template deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)412Program changed since it was read (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /templates/exists
Check whether a template name exists
- Operation ID
checkTemplateExists- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
programNameRequired | query | string |
Responses
200Existence result (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /templates/{templateId}/assign
Assign a template to an athlete as a dated program
- Operation ID
assignTemplate- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
templateIdRequired | path | string | |
Idempotency-Key | header | string |
Request Body
Required, JSON
Responses
201Program assigned (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PUT /templates/{templateId}/folder
Move a template into a folder or to the root
- Operation ID
setTemplateFolder- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
templateIdRequired | path | string | |
If-MatchRequired | header | integer | Required when replacing, moving, or deleting an existing template |
Request Body
Required, JSON
Responses
Template Folders
GET /template-folders
List program-library folders owned by the coach
- Operation ID
listTemplateFolders- Permission
read
Responses
200Template folders (TemplateFolderListEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /template-folders
Create a program-library folder
- Operation ID
createTemplateFolder- Permission
write
Request Body
Required, JSON
Responses
201Template folder created (TemplateFolderEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PATCH /template-folders/{folderId}
Rename a program-library folder
- Operation ID
updateTemplateFolder- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
folderIdRequired | path | string |
Request Body
Required, JSON
Responses
200Template folder renamed (TemplateFolderEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /template-folders/{folderId}
Delete a program-library folder and move its templates to the root
- Operation ID
deleteTemplateFolder- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
folderIdRequired | path | string |
Responses
200Template folder deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Exercise Library
Exercise Library Writes
Exercise writes follow the caller's Atlas role. A platform Super Admin token writes the shared Atlas library; scoped to a club, it gets 403 for a name that club already has. A club admin token with write writes that club's library. An assistant coach can add exercises and update only the ones they added, and gets 403 for deleting a club exercise or changing someone else's. Clubs see the Atlas library by default; a club admin can hide it from that club's reads.
Squat, Plyo, and Isometric are retired Primaries. A create, replace, or patch that sets one returns VALIDATION_ERROR: use Back Squat or Front Squat for squats and Accessory for the others. A write may keep a retired Primary the exercise already holds, so squats whose name does not say which squat they are can still be edited until a coach picks one.
GET /exercises
Browse or search the Atlas and club exercise libraries visible to this token
- Operation ID
listExercises- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
search | query | string | |
limit | query | integer | |
cursor | query | string |
Responses
200Exercises (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /exercises
Add an exercise. The Atlas administrator writes the Atlas library. A club admin or assistant writes that club's library. A YouTube video URL is required.
- Operation ID
addExercise- Permission
write
Request Body
Required, JSON
Responses
GET /exercises/{name}
Get an exercise from the Atlas or club library visible to this token
- Operation ID
getExerciseByName- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
nameRequired | path | string |
Responses
200Exercise (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Exercise not found429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PATCH /exercises/{name}
Update an exercise. The Atlas administrator updates the Atlas library. A club admin updates that club's library. An assistant updates only exercises they added.
- Operation ID
updateExercise- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
nameRequired | path | string |
Request Body
Required, JSON
Responses
200Exercise updated (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /exercises/{name}
Delete an exercise. The Atlas administrator deletes from the Atlas library. A club admin deletes from that club's library.
- Operation ID
deleteExercise- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
nameRequired | path | string |
Responses
200Exercise deleted (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Analytics And Activity
Session Activity
GET /session-activity returns sessions with work_logged or completed status, their loggedSetCount, and the stored exercises. A session becomes work_logged once it has a completed or missed set, even before the athlete finishes. Pass includePlanned=true to include untouched sessions. /completed-days returns finished workouts only.
Workout Start And Time Of Day
The app records when the athlete started the workout timer as sessionStartedAt (epoch milliseconds) and sessionStartUtcOffsetMinutes (minutes east of UTC, so UTC-5 is -300). /complete accepts the same pair; send both or neither.
Completed days and session activity return sessionTimeOfDay from the athlete's local start hour: morning is 04:00–11:59, afternoon 12:00–16:59, and evening 17:00–03:59. GET /analytics/time-of-day compares the buckets; sessions without a recorded start count in untimedSessions.
GET /dashboard
Get the latest-program summary for every athlete
- Operation ID
getCoachDashboard- Permission
read
Responses
200Coach dashboard summary (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /schedule-summaries
Get each athlete's last scheduled date and days remaining
- Operation ID
getScheduleSummaries- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
todayRequired | query | string |
Responses
200Schedule summaries (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /analytics
Get weekly training analytics for the coach or one athlete
- Operation ID
getAnalytics- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
rangeRequired | query | "1mo" | "3mo" | "6mo" | "1yr" | "All" | |
todayRequired | query | string | |
athleteName | query | string | |
athleteId | query | string |
Responses
200Weekly analytics (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /analytics/time-of-day
Compare completed sessions by the part of the athlete's day they started in
Buckets use the athlete's local start time: morning is 04:00-11:59, afternoon 12:00-16:59, and evening 17:00-03:59. Each bucket reports session count, average session RPE (0-10), average day rating (1-5), average duration, and made and missed sets. Sessions with no recorded start are counted in untimedSessions.
- Operation ID
getTimeOfDayAnalytics- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
rangeRequired | query | "1mo" | "3mo" | "6mo" | "1yr" | "All" | |
todayRequired | query | string | |
athleteName | query | string | |
athleteId | query | string |
Responses
200Session performance by time of day (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /completed-days
List completed workout days
- Operation ID
getCompletedDays- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteName | query | string | |
athleteId | query | string | |
limit | query | integer | |
timeOfDay | query | "morning" | "afternoon" | "evening" |
Responses
200Completed workout days (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /session-activity
List sessions with logged work or completion, with optional planned sessions
- Operation ID
getSessionActivity- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteName | query | string | |
athleteId | query | string | |
limit | query | integer | |
includePlanned | query | boolean |
Responses
200Session activity with planned, work_logged, or completed status and loggedSetCount (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Coach Settings
GET /settings
Get coach roster display settings
- Operation ID
getCoachSettings- Permission
read
Responses
PATCH /settings
Update coach roster display settings
- Operation ID
updateCoachSettings- Permission
write
Request Body
Required, JSON
Responses
200Updated coach settings (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Athlete Comments
Athlete Comment Rules
The comment routes act as the token's owner, with the same roster and access rules as the console's Comments page: an assistant sees only their assigned athletes' comments, and read marks belong to the coach who set them. They follow the club selected in Atlas; a token bound to another of the coach's clubs gets 409 until that club is selected.
GET /commentslists athletes' own workout and exercise comments, newest first, withreadfor this coach,unreadCount,hasMore, and the athletes who commented. Filter withathleteId,sinceDate(YYYY-MM-DD),unreadOnly=true, andlimit(up to 500). It needsread.- Each comment has a stable
keysuch asprogramId:1:2:sessionorprogramId:1:2:exercise:3. Percent-encode it in a path. A malformed key returns400; a key outside this coach's comments returns404. POSTandDELETE /comments/{commentKey}/readmark one comment read or unread. Both needwrite; unmarking needs no delete permission. Editing a comment brings it back as unread.POST /comments/read-alltakes an optional{ "athleteId", "sinceDate" }, marks up to 500 unread comments, and returns{ "marked", "remaining" }. Repeat untilremainingis0. It needswrite.POST /comments/{commentKey}/repliestakes{ "text": "..." }and a requiredIdempotency-Key. It sends the athlete a direct message from the token owner quoting the comment, marks the comment read, and returns{ "conversationId", "messageId" }; a retry with the same key returns the original reply. It needsmessaging_write, a token bound to a club, and Messaging turned on, and the athlete must have joined Atlas.
GET /comments
List athlete comments on the token owner's roster, newest first
- Operation ID
listAthleteComments- Permission
read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
athleteId | query | string | |
sinceDate | query | string | Only sessions on or after this date |
limit | query | integer | |
unreadOnly | query | boolean |
Responses
200Comment feed with the token owner's read state (AthleteCommentFeedEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)409Conflicting or duplicate resource (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /comments/read-all
Mark one batch of unread athlete comments read
Marks up to 500 unread comments, newest first. Repeat while remaining is above zero.
- Operation ID
markAllAthleteCommentsRead- Permission
write
Request Body
Optional, JSON
object
| Field | Type | Details |
|---|---|---|
athleteId | string | |
sinceDate | string | format date |
Responses
POST /comments/{commentKey}/read
Mark one athlete comment read for the token owner
- Operation ID
markAthleteCommentRead- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
commentKeyRequired | path | string | A comment key from GET /comments, percent-encoded |
Responses
200Comment marked read (CommentReadStateEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)409Conflicting or duplicate resource (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /comments/{commentKey}/read
Mark one athlete comment unread for the token owner
- Operation ID
markAthleteCommentUnread- Permission
write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
commentKeyRequired | path | string | A comment key from GET /comments, percent-encoded |
Responses
200Comment marked unread (CommentReadStateEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)409Conflicting or duplicate resource (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /comments/{commentKey}/replies
Reply to an athlete comment with a direct message
Sends the athlete a direct message from the token owner that quotes the comment, then marks the comment read.
- Operation ID
replyToAthleteComment- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
commentKeyRequired | path | string | A comment key from GET /comments, percent-encoded |
Idempotency-KeyRequired | header | string | Stable caller-generated key; retries return the original message |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
textRequired | string | min length 1, max length 8000 |
Responses
201Reply sent, or the original reply for a retry (object)401Missing or invalid token (Error)403Token lacks the required permission (Error)404Resource not found (Error)409Conflicting or duplicate resource (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Messaging
Messaging Rules
messaging_readlists the inbox and history;messaging_writecreates conversations, sends or replies (including replies to athlete comments), marks read, mutes, archives, and restores.- Sending needs a stable
Idempotency-Key; a retry returns the original message ID. Messages keep the token ID and Coach API attribution while the token owner stays the responsible sender. - To attach a photo, voice message, or file, create an upload, send the exact bytes with the same bearer token, then finalize it with its
storageId. Videos use presigned uploads that are finalized after the PUT completes. - Archive visibility expires after 30 days; restoring or a new message after that starts fresh history. Every read and delivery rechecks the coach's current club role and assignment.
GET /messages/conversations
List messaging conversations in the token's club
- Operation ID
listMessageConversations- Permission
messaging_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
cursor | query | string | |
limit | query | integer | |
archived | query | boolean |
Responses
200Paginated messaging inbox (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /messages/conversations/{conversationId}
List messages in a conversation
- Operation ID
listConversationMessages- Permission
messaging_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
conversationIdRequired | path | string | |
cursor | query | string | |
limit | query | integer |
Responses
200Paginated conversation messages (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/conversations/{conversationId}
Send a message or reply in a conversation
- Operation ID
sendConversationMessage- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
conversationIdRequired | path | string | |
Idempotency-KeyRequired | header | string | Stable caller-generated key; retries return the original message |
Request Body
Required, JSON
object
| Field | Type | Details | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
text | string | max length 8000 | ||||||||||||
replyToMessageId | string | |||||||||||||
attachmentIds | array of string | max items 8 | ||||||||||||
scheduledFor | number | Future epoch milliseconds, at most 365 days | ||||||||||||
mentions | array of string | max items 20 | ||||||||||||
trainingReference | object |
|
Responses
201Message sent or original retry result (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/conversations/{conversationId}/read
Mark a conversation read
- Operation ID
markConversationRead- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
conversationIdRequired | path | string |
Request Body
Optional, JSON
object
| Field | Type | Details |
|---|---|---|
throughMessageId | string |
Responses
200Conversation marked read (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/conversations/{conversationId}/attachments
Create an authenticated upload for a photo, voice message, or file
- Operation ID
createMessageAttachmentUpload- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
conversationIdRequired | path | string |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
fileNameRequired | string | |
mimeTypeRequired | string | |
byteSizeRequired | number | minimum 1, maximum 26214400 |
kindRequired | "photo" | "voice" | "file" | |
durationMs | number | minimum 1, maximum 600000 |
Responses
201Upload authorization created (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/attachments/{uploadAuthorizationId}/finalize
Finalize a completed messaging attachment upload
- Operation ID
finalizeMessageAttachment- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
uploadAuthorizationIdRequired | path | string |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
storageIdRequired | string |
Responses
201Attachment finalized (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/conversations/{conversationId}/videos
Create presigned video and optional poster uploads
- Operation ID
createMessageVideoUpload- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
conversationIdRequired | path | string |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
fileNameRequired | string | |
mimeTypeRequired | string | |
byteSizeRequired | number | minimum 1, maximum 167772160 |
durationMsRequired | number | minimum 1, maximum 600000 |
videoKindRequired | "source" | "review" | |
posterByteSize | number | minimum 1 |
Responses
201Video upload authorization created (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/videos/{uploadAuthorizationId}/finalize
Finalize a completed messaging video upload
- Operation ID
finalizeMessageVideo- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
uploadAuthorizationIdRequired | path | string |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
r2KeyRequired | string | |
byteSizeRequired | number | |
durationMsRequired | number | |
width | number | |
height | number | |
posterUploaded | boolean |
Responses
201Video attachment finalized (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /messages/attachments/{attachmentId}/transcript
Read a voice message's or video's transcript and summary
Transcripts and summaries are made on the sender's or a viewer's phone and can arrive after the message, so either may be null.
- Operation ID
getMessageAttachmentTranscript- Permission
messaging_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
attachmentIdRequired | path | string |
Responses
GET /messages/attachments/{attachmentId}/playback
Create a short-lived video playback grant
- Operation ID
getMessageVideoPlayback- Permission
messaging_read
Parameters
| Name | In | Type | Details |
|---|---|---|---|
attachmentIdRequired | path | string |
Responses
200Video playback grant (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PATCH /messages/conversations/{conversationId}/state
Mute, archive, or restore a conversation
- Operation ID
updateConversationState- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
conversationIdRequired | path | string |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
muted | boolean | |
archived | boolean |
Responses
200Conversation state updated (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
GET /messages/scheduled
List this token owner's scheduled messages in the club, soonest first
Returns up to 50 messages the token owner has scheduled, with the conversation each goes to. hasMore is true when more are scheduled than the list holds.
- Operation ID
listScheduledMessages- Permission
messaging_read
Responses
200Scheduled messages and hasMore (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
PATCH /messages/scheduled/{messageId}
Edit, reschedule, or send now a scheduled message created by this token owner
Give any of text, scheduledFor or sendNow. New text is applied first, so it goes out with sendNow. Repeating sendNow after the message went out succeeds.
- Operation ID
updateScheduledMessage- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
messageIdRequired | path | string | |
Idempotency-Key | header | string | Required when text is given; a retry with the same key applies the edit once |
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
text | string | max length 8000 |
scheduledFor | number | New future epoch milliseconds, at most 365 days; not with sendNow |
sendNow | true | Deliver the message now; not with scheduledFor |
Responses
200Scheduled message updated (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)428If-Match revision is required (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
DELETE /messages/scheduled/{messageId}
Cancel a scheduled message created by this token owner
- Operation ID
cancelScheduledMessage- Permission
messaging_write
Parameters
| Name | In | Type | Details |
|---|---|---|---|
messageIdRequired | path | string |
Responses
200Scheduled message cancelled (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/dms
Create or find a 1-1 direct message, including a thread with yourself
- Operation ID
createDirectMessage- Permission
messaging_write
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
otherUserIdRequired | string |
Responses
201Direct message conversation (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
POST /messages/groups
Create a custom in-club messaging group
- Operation ID
createMessageGroup- Permission
messaging_write
Request Body
Required, JSON
object
| Field | Type | Details |
|---|---|---|
nameRequired | string | max length 100 |
memberUserIdsRequired | array of string | max items 99 |
Responses
201Custom group conversation (DataEnvelope)401Missing or invalid token (Error)403Token lacks the required permission (Error)429Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
Schemas
Shared request and response shapes that the endpoints above link to.
TranscriptSummary
object
| Field | Type | Details |
|---|---|---|
textRequired | string | max length 1000 |
focusesRequired | array of string | Technique cues the coach gave in a video review; empty for every other recordingmax items 5 |
AttachmentTranscript
object
| Field | Type | Details |
|---|---|---|
attachmentIdRequired | string | |
messageIdRequired | string | |
conversationIdRequired | string | |
kindRequired | "voice" | "video" | |
videoKindRequired | "source" | "review" | null | |
exerciseNameRequired | string | null | |
transcriptRequired | string | null | max length 20000 |
transcriptSummaryRequired | TranscriptSummary | null |
RepTargets
object
| Field | Type | Details |
|---|---|---|
snatchRequired | string | |
cleanRequired | string | |
jerkRequired | string | |
frontSquatRequired | string | |
backSquatRequired | string | |
snatchPullRequired | string | |
cleanPullRequired | string |
RepTargetChange
object
Rep target percentages that take over from startWeek until the next change. Week 1 always uses the block's own repTargets.
| Field | Type | Details |
|---|---|---|
startWeekRequired | integer | Week number these targets start onminimum 2 |
repTargetsRequired | RepTargets |
RepTargetChanges
array of RepTargetChange
Later rep targets, in increasing startWeek order, each starting on or before the block's last week. On a replace, omit to keep the stored changes that still apply; send [] to clear them. Percentages are at most 16 characters.max items 52
IntensityMode
"percent" | "percent_range" | "rpe" | "rpe_range"
How working intensity is prescribed. Omit or percent for a single percent of a PR (existing default). Range modes store a lower and upper bound. Velocity is a separate optional overlay, not an intensity mode. Range is never inferred: send the matching *_range mode.
IntensityValue
number | array of number | array of array of number
A single value, a per-set array, or range pairs. For *_range modes a two-number array is one min/max used for every set, not two sets. Nested pairs vary the range per set.
Rpe
number | array of number | array of array of number
Rating of Perceived Exertion on a 1–10 scale. Same scalar, per-set, or range-pair shape as percent. Mutually exclusive with percent. May be combined with velocity.
Velocity
number | array of number | array of array of number
Bar velocity in meters per second, greater than 0 and at most 5. Same scalar, per-set, or range-pair shape as percent. Optional overlay that stacks with percent or RPE. Send velocityRange=true for a min/max used for every set; a two-number array without that flag is two per-set values.
Exercise
object
| Field | Type | Details |
|---|---|---|
exerciseNumber | number | |
exerciseNameRequired | string | |
exerciseCategory | string | |
exerciseNotes | string | max length 2000 |
supersetGroup | string | |
supersetOrder | number | |
sets | integer | minimum 1, maximum 99 |
repsRequired | string | array of string | Prescribed quantity per set, as numbers only. A string applies to every set; an array varies by set. Repetition ranges such as 10-12 are valid. Timed work uses an s suffix (30s, 30-45s) and/or prescriptionUnit=seconds with a bare quantity (30, 30-45). Distance work uses an m suffix (100m, 100-200m) and/or prescriptionUnit=meters with a bare quantity (100, 100-200). Text such as '10 each side', 'AMRAP', or '1+1' is rejected with INVALID_FORMAT; put instructions in exerciseNotes. |
prescriptionUnit | "reps" | "seconds" | "meters" | How to interpret reps. Omit or use reps for repetition counts. Use seconds for timed holds and isos. Use meters for distance work such as sprints and carries. Existing programs may omit this and encode time with an s suffix or distance with an m suffix on reps. |
repsRange | boolean | When true, each reps quantity is a low/high range (10-12, 30-45s, 100-200m). The program builder shows two fields. Omit or false for a single quantity per set. |
weights | number | |
setWeights | array of number | |
percent | IntensityValue | Percent of a personal record. Greater than 0 and at most 200. Mutually exclusive with rpe. May be combined with velocity. Omit intensityMode or set it to percent for a single-value prescription. |
intensityMode | IntensityMode | |
rpe | Rpe | |
velocity | Velocity | |
velocityRange | boolean | When true, velocity stores a lower and upper bound. A two-number array without this flag remains two per-set values. |
loggedVelocity | number | array of number | Athlete-measured bar speed in m/s. Written by the athlete app; independent of the coach velocity prescription. |
setStatuses | array of "pending" | "complete" | "miss" | |
completed | boolean | default false |
athleteComments | string | max length 1000 |
Day
object
| Field | Type | Details |
|---|---|---|
dayNumber | number | |
dayOfWeek | string | |
dayLabel | string | |
scheduledDate | string | format date |
completed | boolean | default false |
rating | "Trash" | "Below Average" | "Average" | "Above Average" | "Crushing It" | |
sessionIntensity | number | |
sessionDurationMs | number | minimum 0 |
sessionStartedAt | integer | When the athlete started the workout timer, in epoch milliseconds. Send with sessionStartUtcOffsetMinutes.minimum 1577836800000, less than 4102444800000 |
sessionStartUtcOffsetMinutes | integer | The athlete's UTC offset when the workout started, in minutes east of UTC (UTC-5 is -300). Send with sessionStartedAt.minimum -720, maximum 840 |
sessionComments | string | max length 2000 |
coachNotes | string | max length 2000 |
completedAt | number | |
exercisesRequired | array of Exercise |
DayPatch
object
| Field | Type | Details |
|---|---|---|
targetDayNumber | integer | minimum 1 |
dayOfWeek | string | null | |
dayLabel | string | null | |
scheduledDate | string | null | format date |
completed | boolean | |
rating | "Trash" | "Below Average" | "Average" | "Above Average" | "Crushing It" | null | |
sessionIntensity | number | null | |
sessionDurationMs | number | null | minimum 0 |
sessionComments | string | null | max length 2000 |
coachNotes | string | null | max length 2000 |
ExercisePatch
object
| Field | Type | Details |
|---|---|---|
targetExerciseNumber | integer | minimum 1 |
exerciseName | string | |
exerciseCategory | string | null | |
exerciseNotes | string | null | max length 2000 |
supersetGroup | string | null | |
supersetOrder | number | null | |
sets | integer | null | minimum 1, maximum 99 |
reps | string | array of string | Prescribed quantity per set, as numbers only. A string applies to every set; an array varies by set. Repetition ranges such as 10-12 are valid. Timed work uses an s suffix (30s, 30-45s) and/or prescriptionUnit=seconds with a bare quantity (30, 30-45). Distance work uses an m suffix (100m, 100-200m) and/or prescriptionUnit=meters with a bare quantity (100, 100-200). Text such as '10 each side', 'AMRAP', or '1+1' is rejected with INVALID_FORMAT; put instructions in exerciseNotes. |
prescriptionUnit | "reps" | "seconds" | "meters" | null | |
repsRange | boolean | null | Set true for a low/high quantity range. Null or false clears the range flag without removing reps values. |
weights | number | null | |
setWeights | array of number | null | |
percent | IntensityValue | null | Set to switch this exercise to percent intensity and clear rpe. Velocity is left unchanged. Null clears percent without changing mode unless intensityMode or rpe is also sent. |
intensityMode | IntensityMode | null | |
rpe | Rpe | null | |
velocity | Velocity | null | Optional velocity overlay. Null clears velocity and velocityRange without changing intensityMode, percent, or rpe. |
velocityRange | boolean | null | Set true to store velocity as a range. Null or false clears the range flag without removing velocity values. |
setStatuses | array of "pending" | "complete" | "miss" | null | |
completed | boolean | |
athleteComments | string | null | max length 1000 |
Week
object
| Field | Type | Details |
|---|---|---|
weekNumber | number | |
daysRequired | array of Day |
ProgramInput
any | any
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
athleteId | string | Stable roster ID; preferred over athleteName | |||||||||
athleteName | string | ||||||||||
programNameRequired | string | min length 1, max length 120 | |||||||||
startDateRequired | string | format date | |||||||||
weekCount | number | ||||||||||
repTargets | RepTargets | ||||||||||
repTargetChanges | RepTargetChanges | ||||||||||
weekTotals | array of object |
| |||||||||
weeksRequired | array of Week |
TemplateInput
object
| Field | Type | Details | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
programNameRequired | string | min length 1, max length 120 | ||||||||||||||||||||||||||||||
folderId | string | null | Template-folder ID. Omit when updating to preserve the current folder; use null to move the template to the root. | ||||||||||||||||||||||||||||||
weekCount | number | |||||||||||||||||||||||||||||||
repTargets | RepTargets | |||||||||||||||||||||||||||||||
repTargetChanges | RepTargetChanges | |||||||||||||||||||||||||||||||
weekTotals | array of object |
| ||||||||||||||||||||||||||||||
weeksRequired | array of object |
|
TemplateAssignmentInput
any | any
| Field | Type | Details |
|---|---|---|
athleteId | string | |
athleteName | string | |
programNameRequired | string | min length 1, max length 120 |
startDateRequired | string | format date |
PersonalRecordInput
object
| Field | Type | Details |
|---|---|---|
exerciseNameRequired | string | Normalized before it is stored. Spellings of snatch, clean, jerk, clean & jerk (including "C&J" and "clean and jerk"), push press, back squat, and front squat are stored as their ids: snatch, clean, jerk, clean_jerk, push_press, back_squat, front_squat. Any other exercise keeps its spelling, trimmed with whitespace collapsed, and matches an existing record regardless of case and punctuation.min length 1, max length 120 |
repMaxRequired | integer | minimum 1 |
weightRequired | number | Kilogramsminimum 0, maximum 1500 |
recordedAt | number | Unix timestamp in milliseconds; defaults to the time of the write when omittedminimum 0 |
ExerciseLibraryInput
object
| Field | Type | Details |
|---|---|---|
nameRequired | string | |
primary | string | Free-text movement category, such as Snatch, Clean, Back Squat, Front Squat, or Accessory. The retired Primaries Squat, Plyo, and Isometric are rejected with VALIDATION_ERROR (use Back Squat or Front Squat, or Accessory), unless the exercise already holds that value. |
secondary | string | |
linkRequired | string | YouTube video URL. Requests without a valid YouTube video are rejected.format uri |
ExerciseLibraryPatch
object
min properties 1
| Field | Type | Details |
|---|---|---|
primary | string | null | Free-text movement category, such as Snatch, Clean, Back Squat, Front Squat, or Accessory. The retired Primaries Squat, Plyo, and Isometric are rejected with VALIDATION_ERROR (use Back Squat or Front Squat, or Accessory), unless the exercise already holds that value. |
secondary | string | null | |
link | string | null | A non-null value must be a YouTube video URLformat uri |
BulkPersonalRecordInput
object
| Field | Type | Details |
|---|---|---|
recordsRequired | array of PersonalRecordInput | max items 100 |
MoveDayInput
object
| Field | Type | Details |
|---|---|---|
targetDateRequired | string | format date |
CompleteWorkoutInput
object
| Field | Type | Details |
|---|---|---|
ratingRequired | "Trash" | "Below Average" | "Average" | "Above Average" | "Crushing It" | |
sessionIntensityRequired | number | minimum 0, maximum 10 |
sessionDurationMs | number | minimum 0 |
sessionStartedAt | integer | When the athlete started the workout timer, in epoch milliseconds. Send with sessionStartUtcOffsetMinutes.minimum 1577836800000, less than 4102444800000 |
sessionStartUtcOffsetMinutes | integer | The athlete's UTC offset when the workout started, in minutes east of UTC (UTC-5 is -300). Send with sessionStartedAt.minimum -720, maximum 840 |
Error
object
| Field | Type | Details | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
errorRequired | object |
|
ProgramMutationResult
object
| Field | Type | Details | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
Athlete
object
| Field | Type | Details |
|---|---|---|
athleteIdRequired | string | null | |
nameRequired | string |
AthleteProfile
object
| Field | Type | Details |
|---|---|---|
athleteIdRequired | string | |
nameRequired | string | |
emailRequired | string | null | format email |
invitationStatusRequired | "not_invited" | "pending" | "accepted" | "failed" | "revoked" | |
invitedAtRequired | number | null | |
joinedAtRequired | number | null | |
inviteErrorRequired | string | null | |
outputAthleteIdRequired | string | null | |
outputAthleteNameRequired | string | null | |
isSelfRequired | boolean |
AthleteProfilePatch
object
min properties 1
| Field | Type | Details |
|---|---|---|
name | string | min length 2, max length 100 |
email | string | null | format email |
outputAthleteId | string | null | Update together with outputAthleteName; set both to null to disconnect |
outputAthleteName | string | null | Update together with outputAthleteId; set both to null to disconnect |
CoachSettings
object
| Field | Type | Details |
|---|---|---|
showSelfAsAthleteRequired | boolean |
Program
object
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
programIdRequired | string | ||||||||||
athleteIdRequired | string | null | ||||||||||
athleteNameRequired | string | ||||||||||
programNameRequired | string | ||||||||||
startDateRequired | string | format date | |||||||||
revisionRequired | integer | minimum 1 | |||||||||
weekCountRequired | integer | minimum 1 | |||||||||
repTargetsRequired | RepTargets | ||||||||||
repTargetChangesRequired | RepTargetChanges | ||||||||||
weekTotalsRequired | array of object |
| |||||||||
weeksRequired | array of Week |
Template
TemplateInput & object
object
| Field | Type | Details |
|---|---|---|
templateIdRequired | string | |
folderIdRequired | string | null | |
revisionRequired | integer | minimum 1 |
repTargetChangesRequired | RepTargetChanges |
TemplateFolder
object
| Field | Type | Details |
|---|---|---|
folderIdRequired | string | |
nameRequired | string | |
createdAtRequired | number |
TemplateFolderInput
object
| Field | Type | Details |
|---|---|---|
nameRequired | string |
TemplateFolderAssignmentInput
object
| Field | Type | Details |
|---|---|---|
folderIdRequired | string | null | Use null to move the template to the root. |
ProgramEnvelope
object
| Field | Type | Details |
|---|---|---|
dataRequired | Program |
NullableProgramEnvelope
object
| Field | Type | Details |
|---|---|---|
dataRequired | Program | null |
TemplateEnvelope
object
| Field | Type | Details |
|---|---|---|
dataRequired | Template |
TemplateFolderEnvelope
object
| Field | Type | Details |
|---|---|---|
dataRequired | TemplateFolder |
TemplateFolderListEnvelope
object
| Field | Type | Details |
|---|---|---|
dataRequired | array of TemplateFolder |
ProgramPageEnvelope
object
| Field | Type | Details | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
TemplatePageEnvelope
object
| Field | Type | Details | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
AthleteComment
object
An athlete's own comment on a workout or one exercise. Coach notes are never included.
| Field | Type | Details |
|---|---|---|
keyRequired | string | Stable comment key (programId:week:day:session or programId:week:day:exercise:N). Percent-encode it in a path.max length 200 |
programIdRequired | string | |
athleteIdRequired | string | |
athleteNameRequired | string | |
weekNumberRequired | integer | |
dayNumberRequired | integer | |
dayLabel | string | |
scheduledDateRequired | string | format date |
kindRequired | "session" | "exercise" | |
exerciseName | string | |
commentRequired | string | |
commentedAtRequired | number | When the athlete last saved the comment, in epoch milliseconds. Comments saved before save times were recorded use their session's completion time, or noon UTC on its scheduled date (see commentedAtPrecision). |
commentedAtPrecisionRequired | "time" | "day" | day when commentedAt only stands in for the scheduled date: show the date, not a clock time. |
readRequired | boolean | Whether the token owner marked this comment read since its text last changed |
AthleteCommentFeedEnvelope
object
| Field | Type | Details | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
CommentReadStateEnvelope
object
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
CurrentProgramSummaryEnvelope
object
| Field | Type | Details |
|---|---|---|
dataRequired | object | null |
DataEnvelope
object
| Field | Type | Details |
|---|---|---|
dataRequired | any |
WeekPatch
object
| Field | Type | Details |
|---|---|---|
targetWeekNumber | integer | minimum 1 |
weekTotal | string |
CopyWeekInput
object
| Field | Type | Details |
|---|---|---|
targetWeekNumberRequired | integer | minimum 1 |
CopyDayInput
object
| Field | Type | Details |
|---|---|---|
targetWeekNumberRequired | integer | minimum 1 |
targetDayNumberRequired | integer | minimum 1 |
targetDate | string | format date |
WeightCalculationInput
object
| Field | Type | Details |
|---|---|---|
exerciseNameRequired | string | |
repMax | integer | minimum 1 |
percentagesRequired | array of number | min items 1, max items 50 |
roundingIncrement | number | greater than 0 |
MeetInput
object
| Field | Type | Details |
|---|---|---|
meetNameRequired | string | min length 1, max length 120 |
meetDateRequired | string | format date |
WeekNoteInput
object
| Field | Type | Details |
|---|---|---|
noteRequired | string | min length 1, max length 280 |
MeetPlanLift
object
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
opener | number | greater than 0, maximum 1000 | |||||||||
second | number | greater than 0, maximum 1000 | |||||||||
third | number | greater than 0, maximum 1000 | |||||||||
warmupsRequired | array of object | max items 30
|
MeetPlanTotals
object
| Field | Type | Details |
|---|---|---|
snatch | number | greater than 0, maximum 1000 |
cleanAndJerk | number | greater than 0, maximum 1000 |
total | number | greater than 0, maximum 1000 |
MeetPlanInput
object
| Field | Type | Details |
|---|---|---|
meetNameRequired | string | max length 120 |
meetDate | string | format date |
weightClass | string | max length 40 |
entryTotal | number | greater than 0, maximum 1000 |
coachName | string | max length 80 |
snatch | MeetPlanLift | |
cleanAndJerk | MeetPlanLift | |
competitionAfterSnatch | string | max length 2000 |
competitionBests | MeetPlanTotals | |
trainingBests | MeetPlanTotals | |
competitionGoals | MeetPlanTotals |
MeetPlanSummary
object
| Field | Type | Details |
|---|---|---|
_idRequired | string | |
meetNameRequired | string | |
meetDate | string | format date |
weightClassRequired | string | |
entryTotal | number | |
updatedAtRequired | number |
MeetPlan
MeetPlanInput & object
object
| Field | Type | Details |
|---|---|---|
_idRequired | string | |
_creationTime | number | |
userIdRequired | string | |
athleteId | string | |
athleteNameRequired | string | |
updatedAtRequired | number |
MeetPlanPageExport
object
Full meet-plan page payload used for PDF export: worksheet fields plus recent lifts, check-in flags, last meet, and two-year history.
| Field | Type | Details |
|---|---|---|
athleteNameRequired | string | |
exportedAtRequired | string | format date-time |
todayRequired | string | format date |
planIdRequired | string | |
metaRequired | object | |
attemptsRequired | object | |
totalsRequired | array of object | |
recentLiftsRequired | array of object | |
checkInFlagsRequired | array of object | |
lastMeetRequired | object | null | |
historyRequired | object | null |
SessionCheckIn
object
| Field | Type | Details | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
checkInIdRequired | string | ||||||||||||||||||||||
dateRequired | string | format date | |||||||||||||||||||||
programIdRequired | string | ||||||||||||||||||||||
weekNumberRequired | integer | minimum 1 | |||||||||||||||||||||
dayNumberRequired | integer | minimum 1 | |||||||||||||||||||||
preRequired | object | null |
| |||||||||||||||||||||
postRequired | object | null |
|
OuraMetricPoint
object
| Field | Type | Details |
|---|---|---|
dateRequired | string | format date |
sleepDurationHoursRequired | number | null | |
averageHrvMsRequired | number | null | |
averageHeartRateBpmRequired | number | null | |
readinessScoreRequired | number | null |
OuraMetricsEnvelope
object
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
WhoopMetricPoint
object
| Field | Type | Details |
|---|---|---|
dateRequired | string | format date |
recoveryScoreRequired | number | null | |
sleepDurationHoursRequired | number | null | |
sleepPerformancePercentageRequired | number | null | |
sleepEfficiencyPercentageRequired | number | null | |
strainScoreRequired | number | null | |
hrvMsRequired | number | null | |
restingHeartRateBpmRequired | number | null | |
respiratoryRateRequired | number | null |
WhoopMetricsEnvelope
object
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
NutritionDailyPoint
object
Daily food-diary totals from the athlete's connected nutrition app (currently FatSecret). Days without diary entries are omitted.
| Field | Type | Details |
|---|---|---|
dateRequired | string | format date |
caloriesRequired | number | null | Energy intake in kcal |
proteinGramsRequired | number | null | |
carbohydrateGramsRequired | number | null | |
fatGramsRequired | number | null |
NutritionMetricsEnvelope
object
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
NutritionFoodEntry
object
One logged food item with its meal slot and nutrients as recorded by the athlete.
| Field | Type | Details |
|---|---|---|
entryIdRequired | string | |
dateRequired | string | format date |
mealRequired | "breakfast" | "lunch" | "dinner" | "other" | |
nameRequired | string | max length 300 |
descriptionRequired | string | Serving and food, for example "1 cup Instant Oatmeal"max length 300 |
caloriesRequired | number | null | |
proteinGramsRequired | number | null | |
carbohydrateGramsRequired | number | null | |
fatGramsRequired | number | null | |
fiberGramsRequired | number | null | |
sugarGramsRequired | number | null | |
sodiumMilligramsRequired | number | null |
NutritionFoodEntriesEnvelope
object
| Field | Type | Details | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
dataRequired | object |
|
MeetResultInput
object
| Field | Type | Details |
|---|---|---|
sourceKeyRequired | string | |
kindRequired | "local" | "override" | |
federationRequired | string | |
meetRequired | string | |
dateRequired | string | format date |
nameRequired | string | |
ageRequired | string | |
bodyWeightRequired | number | |
snatch1Required | number | |
snatch2Required | number | |
snatch3Required | number | |
cj1Required | number | |
cj2Required | number | |
cj3Required | number |