AtlasAtlasBack To Atlas
  • Getting Started
  • Coach API Reference
    • Account And Health
    • Roster
    • Athletes
    • Personal Records
    • Meets And Annual Plans
    • Meet Plans
    • Week Notes
    • Session Check-Ins
    • Wearables And Nutrition
    • Athlete Workouts
    • Programs
    • Templates
    • Template Folders
    • Exercise Library
    • Analytics And Activity
    • Coach Settings
    • Athlete Comments
    • Messaging
    • Schemas
  • Atlas CLI
  • Agent Skill

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/v1

This page is generated from the OpenAPI document, which agents and tools can import directly:

https://graceful-tortoise-95.convex.site/api/v1/openapi.json

Account And Health

GET /health

Check API availability

Operation ID
health
Permission
None (public)
CLI
atlas health

Responses

  • 200 API is available (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-agent-account

Responses

  • 200 Authenticated token context (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-roster

Parameters

NameInTypeDetails
limitqueryinteger
cursorquerystring

Responses

  • 200 Paginated roster with page, continueCursor, and isDone (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-athletes

Responses

  • 200 Coach roster (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

POST /athletes

Create or adopt a stable coach-owned roster entry

Operation ID
createAthlete
Permission
write
CLI
atlas create-athlete

Request Body

Required, JSON

object

FieldTypeDetails
nameRequiredstring

Responses

  • 201 Athlete created or adopted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-athlete-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Athlete profile (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

PATCH /athletes/by-id/{athleteId}

Update an athlete name, email, or Output connection

Operation ID
updateAthleteProfileById
Permission
write
CLI
atlas update-athlete-profile-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Request Body

Required, JSON

AthleteProfilePatch

Responses

  • 200 Updated athlete profile (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

DELETE /athletes/by-id/{athleteId}

Archive an athlete roster profile without deleting its history

Operation ID
archiveAthleteProfileById
Permission
athlete_data_delete
CLI
atlas archive-athlete-profile-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Athlete profile archived (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas delete-athlete-data

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Responses

  • 200 Athlete data deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-athlete-data-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Athlete data deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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.
  • repMax is a positive integer and weight is 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-weights rounds 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
CLI
atlas get-recent-bests

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
todayRequiredquerystring

Responses

  • 200 Recent bests keyed by exercise (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas calculate-training-weights

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Request Body

Required, JSON

WeightCalculationInput

Responses

  • 200 Calculated raw and rounded weights (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas list-personal-records

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
exerciseNamequerystring

Responses

  • 200 Personal records (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas upsert-personal-record

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Request Body

Required, JSON

PersonalRecordInput

Responses

  • 200 Personal record saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-all-personal-records

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Responses

  • 200 Personal records deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas bulk-upsert-personal-records

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Request Body

Required, JSON

BulkPersonalRecordInput

Responses

  • 200 Personal records saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-personal-record

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
personalRecordIdRequiredpathstring

Responses

  • 200 Personal record deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-recent-bests-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
todayRequiredquerystring

Responses

  • 200 Recent bests keyed by exercise (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas calculate-training-weights-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Request Body

Required, JSON

WeightCalculationInput

Responses

  • 200 Calculated raw and rounded weights (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas list-personal-records-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
exerciseNamequerystring

Responses

  • 200 Personal records (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas upsert-personal-record-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Request Body

Required, JSON

PersonalRecordInput

Responses

  • 200 Personal record saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-all-personal-records-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Personal records deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas bulk-upsert-personal-records-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Request Body

Required, JSON

BulkPersonalRecordInput

Responses

  • 200 Personal records saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-personal-record-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
personalRecordIdRequiredpathstring

Responses

  • 200 Personal record deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-annual-plan

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
startDateRequiredquerystring
endDateRequiredquerystring

Responses

  • 200 Annual plan range (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-meet

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Responses

  • 200 Meets (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas upsert-meet

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Request Body

Required, JSON

MeetInput

Responses

  • 200 Meet saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-meet

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Responses

  • 200 Meets deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-meet-results

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Responses

  • 200 Meet results (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas upsert-meet-result

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Request Body

Required, JSON

MeetResultInput

Responses

  • 200 Meet result saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas remove-meet-result

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
sourceKeyRequiredpathstring

Responses

  • 200 Meet result removed or hidden (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas update-athlete-meet

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
meetIdRequiredpathstring

Request Body

Required, JSON

MeetInput

Responses

  • 200 Meet saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-athlete-meet

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
meetIdRequiredpathstring

Responses

  • 200 Meet deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-annual-plan-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
startDateRequiredquerystring
endDateRequiredquerystring

Responses

  • 200 Annual plan range (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-meet-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Meets (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas upsert-meet-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Request Body

Required, JSON

MeetInput

Responses

  • 200 Meet saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-meet-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Meets deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-meet-results-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Meet results (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas upsert-meet-result-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Request Body

Required, JSON

MeetResultInput

Responses

  • 200 Meet result saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas remove-meet-result-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
sourceKeyRequiredpathstring

Responses

  • 200 Meet result removed or hidden (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas update-athlete-meet-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
meetIdRequiredpathstring

Request Body

Required, JSON

MeetInput

Responses

  • 200 Meet saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-athlete-meet-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
meetIdRequiredpathstring

Responses

  • 200 Meet deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-meet-plans

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Responses

  • 200 Meet plan summaries (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-meet-plan

Parameters

NameInTypeDetails
athleteNameRequiredpathstring

Request Body

Required, JSON

MeetPlanInput

Responses

  • 200 Meet plan created (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-meet-plan

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
meetPlanIdRequiredpathstring

Responses

  • 200 Meet plan (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas update-meet-plan

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
meetPlanIdRequiredpathstring

Request Body

Required, JSON

MeetPlanInput

Responses

  • 200 Meet plan saved (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

DELETE /athletes/{athleteName}/meet-plans/{meetPlanId}

Delete one meet-day worksheet

Operation ID
deleteMeetPlan
Permission
athlete_data_delete
CLI
atlas delete-meet-plan

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
meetPlanIdRequiredpathstring

Responses

  • 200 Meet plan deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas export-meet-plan

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
meetPlanIdRequiredpathstring
todayRequiredquerystringAnchor date for recent-lift and meet-history windows
formatquery"json" | "pdf"Use pdf or send Accept: application/pdf for a binary PDF download

Responses

  • 200 Meet plan page export (MeetPlanPageExport) as application/pdf
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas list-meet-plans-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Responses

  • 200 Meet plan summaries (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-meet-plan-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring

Request Body

Required, JSON

MeetPlanInput

Responses

  • 200 Meet plan created (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-meet-plan-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
meetPlanIdRequiredpathstring

Responses

  • 200 Meet plan (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas update-meet-plan-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
meetPlanIdRequiredpathstring

Request Body

Required, JSON

MeetPlanInput

Responses

  • 200 Meet plan saved (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

DELETE /athletes/id/{athleteId}/meet-plans/{meetPlanId}

Delete one meet-day worksheet

Operation ID
deleteMeetPlanById
Permission
athlete_data_delete
CLI
atlas delete-meet-plan-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
meetPlanIdRequiredpathstring

Responses

  • 200 Meet plan deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas export-meet-plan-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
meetPlanIdRequiredpathstring
todayRequiredquerystringAnchor date for recent-lift and meet-history windows
formatquery"json" | "pdf"Use pdf or send Accept: application/pdf for a binary PDF download

Responses

  • 200 Meet plan page export (MeetPlanPageExport) as application/pdf
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas upsert-athlete-week-note

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
weekStartDateRequiredpathstring

Request Body

Required, JSON

WeekNoteInput

Responses

  • 200 Week note saved (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-athlete-week-note

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
weekStartDateRequiredpathstring

Responses

  • 200 Week note removed (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas upsert-athlete-week-note-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
weekStartDateRequiredpathstring

Request Body

Required, JSON

WeekNoteInput

Responses

  • 200 Week note saved (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-athlete-week-note-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
weekStartDateRequiredpathstring

Responses

  • 200 Week note removed (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-session-check-ins

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
fromquerystring
toquerystring
limitqueryinteger

Responses

  • 200 Session check-ins newest-last (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

GET /athletes/id/{athleteId}/session-check-ins

List pre- and post-workout check-ins for an athlete

Operation ID
listSessionCheckInsById
Permission
read
CLI
atlas list-session-check-ins-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
fromquerystring
toquerystring
limitqueryinteger

Responses

  • 200 Session check-ins newest-last (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

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
CLI
atlas get-oura-metrics

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
fromRequiredquerystring
toRequiredquerystring

Responses

  • 200 Live Oura metrics, or an empty result when not connected (OuraMetricsEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 Oura 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
CLI
atlas get-whoop-metrics

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
fromRequiredquerystringInclusive start date; the WHOOP range may not exceed 90 days
toRequiredquerystring

Responses

  • 200 Live WHOOP metrics, or an empty result when not connected (WhoopMetricsEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 WHOOP 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
CLI
atlas get-nutrition-metrics

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
fromRequiredquerystringInclusive start date; the range may not exceed 366 days
toRequiredquerystring

Responses

  • 200 Live nutrition totals, or an empty result when not connected (NutritionMetricsEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 The 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
CLI
atlas get-nutrition-food-entries

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
dateRequiredquerystring

Responses

  • 200 Live food entries for the day, or an empty result when not connected (NutritionFoodEntriesEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 The 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
CLI
atlas get-oura-metrics-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
fromRequiredquerystring
toRequiredquerystring

Responses

  • 200 Live Oura metrics, or an empty result when not connected (OuraMetricsEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 Oura 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
CLI
atlas get-whoop-metrics-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
fromRequiredquerystringInclusive start date; the WHOOP range may not exceed 90 days
toRequiredquerystring

Responses

  • 200 Live WHOOP metrics, or an empty result when not connected (WhoopMetricsEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 WHOOP 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
CLI
atlas get-nutrition-metrics-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
fromRequiredquerystringInclusive start date; the range may not exceed 366 days
toRequiredquerystring

Responses

  • 200 Live nutrition totals, or an empty result when not connected (NutritionMetricsEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 The 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
CLI
atlas get-nutrition-food-entries-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
dateRequiredquerystring

Responses

  • 200 Live food entries for the day, or an empty result when not connected (NutritionFoodEntriesEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)
  • 502 The 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
CLI
atlas get-workouts-for-analytics

Parameters

NameInTypeDetails
athleteNameRequiredpathstring
programNamequerystring

Responses

  • 200 Flattened workouts (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-workouts-for-analytics-by-id

Parameters

NameInTypeDetails
athleteIdRequiredpathstring
programNamequerystring

Responses

  • 200 Flattened workouts (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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 returns null when 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/validate before 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, returns 409.
  • 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.

ShapeExampleMeaning
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.

FieldTypeNotes
intensityModepercent, percent_range, rpe, or rpe_rangeOmit or use percent for a single percent of a PR. Range modes store a lower and upper bound.
percentnumber, number array, or array of pairsGreater 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.
rpenumber, number array, or array of pairsRating of perceived exertion from 1 to 10, in the same shapes as percent.
velocitynumber, number array, or array of pairsOptional bar speed in m/s, greater than 0 and at most 5. Independent of intensityMode.
velocityRangebooleanWhen true, velocity stores a lower and upper bound. Without it, a two-number array is two per-set values.
loggedVelocitynumber or number arrayAthlete-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
CLI
atlas list-programs

Parameters

NameInTypeDetails
athleteNamequerystring
athleteIdquerystring
limitqueryinteger
cursorquerystring

Responses

  • 200 Programs (ProgramPageEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-program

Parameters

NameInTypeDetails
Idempotency-Keyheaderstring

Request Body

Required, JSON

ProgramInput

Responses

  • 200 Existing idempotent result (ProgramMutationResult)
  • 201 Program created (ProgramMutationResult)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 422 Invalid request (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

GET /programs/{programId}

Get a complete program

Operation ID
getProgram
Permission
read
CLI
atlas get-program

Parameters

NameInTypeDetails
programIdRequiredpathstring
If-None-MatchheaderstringReturn 304 when this revision ETag is still current

Responses

  • 200 Program (ProgramEnvelope)
  • 304 Program has not changed
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Not found
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

PUT /programs/{programId}

Replace a complete program

Operation ID
updateProgram
Permission
write
CLI
atlas update-program

Parameters

NameInTypeDetails
programIdRequiredpathstring
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

ProgramInput

Responses

  • 200 Program updated (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 412 Program changed since it was read (Error)
  • 422 Invalid request (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas patch-program-metadata

Parameters

NameInTypeDetails
programIdRequiredpathstring
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

object

FieldTypeDetails
athleteNamestring
programNamestringmin length 1, max length 120
startDatestringformat date
athleteIdstring
shiftScheduledDatesbooleanShift every explicit scheduledDate by the same delta as startDate
repTargetsRepTargets
weekTotalsarray of object
repTargetChangesRepTargetChangesReplaces the whole schedule; [] clears it

Responses

  • 200 Program metadata updated (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

DELETE /programs/{programId}

Delete a program

Operation ID
deleteProgram
Permission
program_delete
CLI
atlas delete-program

Parameters

NameInTypeDetails
programIdRequiredpathstring
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Responses

  • 200 Program deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas get-current-program

Parameters

NameInTypeDetails
todayRequiredquerystring
athleteNamequerystring
athleteIdquerystring

Responses

  • 200 Current program or null (NullableProgramEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-current-program-summary

Parameters

NameInTypeDetails
todayRequiredquerystring
athleteIdquerystring
athleteNamequerystring

Responses

  • 200 Program summary, or null when the athlete has no program (CurrentProgramSummaryEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas check-program-exists

Parameters

NameInTypeDetails
athleteNamequerystring
athleteIdquerystring
programNameRequiredquerystring
startDateRequiredquerystring

Responses

  • 200 Existence result (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas validate-program

Request Body

Required, JSON

ProgramInput

Responses

  • 200 Validation issues and normalized payload (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas add-program-week

Parameters

NameInTypeDetails
programIdRequiredpathstring
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

Week

Responses

  • 201 Week added (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

PATCH /programs/{programId}/weeks/{weekNumber}

Renumber a week or update its total

Operation ID
patchProgramWeek
Permission
write
CLI
atlas patch-program-week

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

WeekPatch

Responses

  • 200 Week updated (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

DELETE /programs/{programId}/weeks/{weekNumber}

Delete a week

Operation ID
deleteProgramWeek
Permission
workout_delete
CLI
atlas delete-program-week

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Responses

  • 200 Week deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

POST /programs/{programId}/weeks/{weekNumber}/copy

Copy a week while resetting athlete completion data

Operation ID
copyProgramWeek
Permission
write
CLI
atlas copy-program-week

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

CopyWeekInput

Responses

  • 201 Week copied (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

POST /programs/{programId}/weeks/{weekNumber}/days

Add a workout day to a program week

Operation ID
addProgramDay
Permission
write
CLI
atlas add-program-day

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

Day

Responses

  • 201 Workout day added (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas patch-program-day

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

DayPatch

Responses

  • 200 Workout day updated (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas delete-program-day

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Responses

  • 200 Workout day deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas move-program-day

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

MoveDayInput

Responses

  • 200 Workout day moved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas complete-workout-session

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

CompleteWorkoutInput

Responses

  • 200 Workout completed (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas copy-program-day

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

CopyDayInput

Responses

  • 201 Day copied (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

POST /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/exercises

Add an exercise to a workout day

Operation ID
addProgramExercise
Permission
write
CLI
atlas add-program-exercise

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

Exercise

Responses

  • 201 Exercise added (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

PATCH /programs/{programId}/weeks/{weekNumber}/days/{dayNumber}/exercises/{exerciseNumber}

Update selected exercise and set fields

Operation ID
patchProgramExercise
Permission
write
CLI
atlas patch-program-exercise

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
exerciseNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Request Body

Required, JSON

ExercisePatch

Responses

  • 200 Exercise updated (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas delete-program-exercise

Parameters

NameInTypeDetails
programIdRequiredpathstring
weekNumberRequiredpathinteger
dayNumberRequiredpathinteger
exerciseNumberRequiredpathinteger
If-MatchRequiredheaderintegerRevision returned by GET /programs/{programId}

Responses

  • 200 Exercise deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

Templates

GET /templates

List reusable program templates

Operation ID
listTemplates
Permission
read
CLI
atlas list-templates

Parameters

NameInTypeDetails
limitqueryinteger
cursorquerystring

Responses

  • 200 Templates (TemplatePageEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas save-template

Parameters

NameInTypeDetails
If-MatchheaderintegerRequired when replacing, moving, or deleting an existing template

Request Body

Required, JSON

TemplateInput

Responses

  • 200 Template saved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

GET /templates/{templateId}

Get a reusable template

Operation ID
getTemplate
Permission
read
CLI
atlas get-template

Parameters

NameInTypeDetails
templateIdRequiredpathstring
If-None-MatchheaderstringReturn 304 when this revision ETag is still current

Responses

  • 200 Template (TemplateEnvelope)
  • 304 Template has not changed
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-template

Parameters

NameInTypeDetails
templateIdRequiredpathstring
If-MatchRequiredheaderintegerRequired when replacing, moving, or deleting an existing template

Responses

  • 200 Template deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas check-template-exists

Parameters

NameInTypeDetails
programNameRequiredquerystring

Responses

  • 200 Existence result (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas assign-template

Parameters

NameInTypeDetails
templateIdRequiredpathstring
Idempotency-Keyheaderstring

Request Body

Required, JSON

TemplateAssignmentInput

Responses

  • 201 Program assigned (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas set-template-folder

Parameters

NameInTypeDetails
templateIdRequiredpathstring
If-MatchRequiredheaderintegerRequired when replacing, moving, or deleting an existing template

Request Body

Required, JSON

TemplateFolderAssignmentInput

Responses

  • 200 Template moved (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 412 Program changed since it was read (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

Template Folders

GET /template-folders

List program-library folders owned by the coach

Operation ID
listTemplateFolders
Permission
read
CLI
atlas list-template-folders

Responses

  • 200 Template folders (TemplateFolderListEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-template-folder

Request Body

Required, JSON

TemplateFolderInput

Responses

  • 201 Template folder created (TemplateFolderEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas update-template-folder

Parameters

NameInTypeDetails
folderIdRequiredpathstring

Request Body

Required, JSON

TemplateFolderInput

Responses

  • 200 Template folder renamed (TemplateFolderEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas delete-template-folder

Parameters

NameInTypeDetails
folderIdRequiredpathstring

Responses

  • 200 Template folder deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-exercises

Parameters

NameInTypeDetails
searchquerystring
limitqueryinteger
cursorquerystring

Responses

  • 200 Exercises (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas add-exercise

Request Body

Required, JSON

ExerciseLibraryInput

Responses

  • 201 Exercise added (DataEnvelope)
  • 400 Invalid request (Error)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

GET /exercises/{name}

Get an exercise from the Atlas or club library visible to this token

Operation ID
getExerciseByName
Permission
read
CLI
atlas get-exercise-by-name

Parameters

NameInTypeDetails
nameRequiredpathstring

Responses

  • 200 Exercise (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Exercise not found
  • 429 Token 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
CLI
atlas update-exercise

Parameters

NameInTypeDetails
nameRequiredpathstring

Request Body

Required, JSON

ExerciseLibraryPatch

Responses

  • 200 Exercise updated (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas delete-exercise

Parameters

NameInTypeDetails
nameRequiredpathstring

Responses

  • 200 Exercise deleted (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token 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
CLI
atlas get-coach-dashboard

Responses

  • 200 Coach dashboard summary (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-schedule-summaries

Parameters

NameInTypeDetails
todayRequiredquerystring

Responses

  • 200 Schedule summaries (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-analytics

Parameters

NameInTypeDetails
rangeRequiredquery"1mo" | "3mo" | "6mo" | "1yr" | "All"
todayRequiredquerystring
athleteNamequerystring
athleteIdquerystring

Responses

  • 200 Weekly analytics (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-time-of-day-analytics

Parameters

NameInTypeDetails
rangeRequiredquery"1mo" | "3mo" | "6mo" | "1yr" | "All"
todayRequiredquerystring
athleteNamequerystring
athleteIdquerystring

Responses

  • 200 Session performance by time of day (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

GET /completed-days

List completed workout days

Operation ID
getCompletedDays
Permission
read
CLI
atlas get-completed-days

Parameters

NameInTypeDetails
athleteNamequerystring
athleteIdquerystring
limitqueryinteger
timeOfDayquery"morning" | "afternoon" | "evening"

Responses

  • 200 Completed workout days (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-session-activity

Parameters

NameInTypeDetails
athleteNamequerystring
athleteIdquerystring
limitqueryinteger
includePlannedqueryboolean

Responses

  • 200 Session activity with planned, work_logged, or completed status and loggedSetCount (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-coach-settings

Responses

  • 200 Coach settings (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

PATCH /settings

Update coach roster display settings

Operation ID
updateCoachSettings
Permission
write
CLI
atlas update-coach-settings

Request Body

Required, JSON

CoachSettings

Responses

  • 200 Updated coach settings (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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 /comments lists athletes' own workout and exercise comments, newest first, with read for this coach, unreadCount, hasMore, and the athletes who commented. Filter with athleteId, sinceDate (YYYY-MM-DD), unreadOnly=true, and limit (up to 500). It needs read.
  • Each comment has a stable key such as programId:1:2:session or programId:1:2:exercise:3. Percent-encode it in a path. A malformed key returns 400; a key outside this coach's comments returns 404.
  • POST and DELETE /comments/{commentKey}/read mark one comment read or unread. Both need write; unmarking needs no delete permission. Editing a comment brings it back as unread.
  • POST /comments/read-all takes an optional { "athleteId", "sinceDate" }, marks up to 500 unread comments, and returns { "marked", "remaining" }. Repeat until remaining is 0. It needs write.
  • POST /comments/{commentKey}/replies takes { "text": "..." } and a required Idempotency-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 needs messaging_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
CLI
atlas list-athlete-comments

Parameters

NameInTypeDetails
athleteIdquerystring
sinceDatequerystringOnly sessions on or after this date
limitqueryinteger
unreadOnlyqueryboolean

Responses

  • 200 Comment feed with the token owner's read state (AthleteCommentFeedEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 429 Token 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
CLI
atlas mark-all-athlete-comments-read

Request Body

Optional, JSON

object

FieldTypeDetails
athleteIdstring
sinceDatestringformat date

Responses

  • 200 Comments marked and unread comments left (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

POST /comments/{commentKey}/read

Mark one athlete comment read for the token owner

Operation ID
markAthleteCommentRead
Permission
write
CLI
atlas mark-athlete-comment-read

Parameters

NameInTypeDetails
commentKeyRequiredpathstringA comment key from GET /comments, percent-encoded

Responses

  • 200 Comment marked read (CommentReadStateEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 429 Token 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
CLI
atlas mark-athlete-comment-unread

Parameters

NameInTypeDetails
commentKeyRequiredpathstringA comment key from GET /comments, percent-encoded

Responses

  • 200 Comment marked unread (CommentReadStateEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 429 Token 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
CLI
atlas reply-to-athlete-comment

Parameters

NameInTypeDetails
commentKeyRequiredpathstringA comment key from GET /comments, percent-encoded
Idempotency-KeyRequiredheaderstringStable caller-generated key; retries return the original message

Request Body

Required, JSON

object

FieldTypeDetails
textRequiredstringmin length 1, max length 8000

Responses

  • 201 Reply sent, or the original reply for a retry (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 409 Conflicting or duplicate resource (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

Messaging

Messaging Rules

  • messaging_read lists the inbox and history; messaging_write creates 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
CLI
atlas list-message-conversations

Parameters

NameInTypeDetails
cursorquerystring
limitqueryinteger
archivedqueryboolean

Responses

  • 200 Paginated messaging inbox (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-conversation-messages

Parameters

NameInTypeDetails
conversationIdRequiredpathstring
cursorquerystring
limitqueryinteger

Responses

  • 200 Paginated conversation messages (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas send-conversation-message

Parameters

NameInTypeDetails
conversationIdRequiredpathstring
Idempotency-KeyRequiredheaderstringStable caller-generated key; retries return the original message

Request Body

Required, JSON

object

FieldTypeDetails
textstringmax length 8000
replyToMessageIdstring
attachmentIdsarray of stringmax items 8
scheduledFornumberFuture epoch milliseconds, at most 365 days
mentionsarray of stringmax items 20
trainingReferenceobject
FieldTypeDetails
kindRequired"exercise" | "workout" | "program" | "meet"
entityIdRequiredstring
labelRequiredstring

Responses

  • 201 Message sent or original retry result (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas mark-conversation-read

Parameters

NameInTypeDetails
conversationIdRequiredpathstring

Request Body

Optional, JSON

object

FieldTypeDetails
throughMessageIdstring

Responses

  • 200 Conversation marked read (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-message-attachment-upload

Parameters

NameInTypeDetails
conversationIdRequiredpathstring

Request Body

Required, JSON

object

FieldTypeDetails
fileNameRequiredstring
mimeTypeRequiredstring
byteSizeRequirednumberminimum 1, maximum 26214400
kindRequired"photo" | "voice" | "file"
durationMsnumberminimum 1, maximum 600000

Responses

  • 201 Upload authorization created (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas finalize-message-attachment

Parameters

NameInTypeDetails
uploadAuthorizationIdRequiredpathstring

Request Body

Required, JSON

object

FieldTypeDetails
storageIdRequiredstring

Responses

  • 201 Attachment finalized (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-message-video-upload

Parameters

NameInTypeDetails
conversationIdRequiredpathstring

Request Body

Required, JSON

object

FieldTypeDetails
fileNameRequiredstring
mimeTypeRequiredstring
byteSizeRequirednumberminimum 1, maximum 167772160
durationMsRequirednumberminimum 1, maximum 600000
videoKindRequired"source" | "review"
posterByteSizenumberminimum 1

Responses

  • 201 Video upload authorization created (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas finalize-message-video

Parameters

NameInTypeDetails
uploadAuthorizationIdRequiredpathstring

Request Body

Required, JSON

object

FieldTypeDetails
r2KeyRequiredstring
byteSizeRequirednumber
durationMsRequirednumber
widthnumber
heightnumber
posterUploadedboolean

Responses

  • 201 Video attachment finalized (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas get-message-attachment-transcript

Parameters

NameInTypeDetails
attachmentIdRequiredpathstring

Responses

  • 200 Attachment transcript and summary (object)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 404 Resource not found (Error)
  • 429 Token rate limit exceeded. Sharded accounting cannot expose an exact remaining count. (Error)

GET /messages/attachments/{attachmentId}/playback

Create a short-lived video playback grant

Operation ID
getMessageVideoPlayback
Permission
messaging_read
CLI
atlas get-message-video-playback

Parameters

NameInTypeDetails
attachmentIdRequiredpathstring

Responses

  • 200 Video playback grant (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas update-conversation-state

Parameters

NameInTypeDetails
conversationIdRequiredpathstring

Request Body

Required, JSON

object

FieldTypeDetails
mutedboolean
archivedboolean

Responses

  • 200 Conversation state updated (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas list-scheduled-messages

Responses

  • 200 Scheduled messages and hasMore (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas update-scheduled-message

Parameters

NameInTypeDetails
messageIdRequiredpathstring
Idempotency-KeyheaderstringRequired when text is given; a retry with the same key applies the edit once

Request Body

Required, JSON

object

FieldTypeDetails
textstringmax length 8000
scheduledFornumberNew future epoch milliseconds, at most 365 days; not with sendNow
sendNowtrueDeliver the message now; not with scheduledFor

Responses

  • 200 Scheduled message updated (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 428 If-Match revision is required (Error)
  • 429 Token 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
CLI
atlas cancel-scheduled-message

Parameters

NameInTypeDetails
messageIdRequiredpathstring

Responses

  • 200 Scheduled message cancelled (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-direct-message

Request Body

Required, JSON

object

FieldTypeDetails
otherUserIdRequiredstring

Responses

  • 201 Direct message conversation (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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
CLI
atlas create-message-group

Request Body

Required, JSON

object

FieldTypeDetails
nameRequiredstringmax length 100
memberUserIdsRequiredarray of stringmax items 99

Responses

  • 201 Custom group conversation (DataEnvelope)
  • 401 Missing or invalid token (Error)
  • 403 Token lacks the required permission (Error)
  • 429 Token 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

FieldTypeDetails
textRequiredstringmax length 1000
focusesRequiredarray of stringTechnique cues the coach gave in a video review; empty for every other recordingmax items 5

AttachmentTranscript

object

FieldTypeDetails
attachmentIdRequiredstring
messageIdRequiredstring
conversationIdRequiredstring
kindRequired"voice" | "video"
videoKindRequired"source" | "review" | null
exerciseNameRequiredstring | null
transcriptRequiredstring | nullmax length 20000
transcriptSummaryRequiredTranscriptSummary | null

RepTargets

object

FieldTypeDetails
snatchRequiredstring
cleanRequiredstring
jerkRequiredstring
frontSquatRequiredstring
backSquatRequiredstring
snatchPullRequiredstring
cleanPullRequiredstring

RepTargetChange

object

Rep target percentages that take over from startWeek until the next change. Week 1 always uses the block's own repTargets.

FieldTypeDetails
startWeekRequiredintegerWeek number these targets start onminimum 2
repTargetsRequiredRepTargets

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

FieldTypeDetails
exerciseNumbernumber
exerciseNameRequiredstring
exerciseCategorystring
exerciseNotesstringmax length 2000
supersetGroupstring
supersetOrdernumber
setsintegerminimum 1, maximum 99
repsRequiredstring | array of stringPrescribed 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.
repsRangebooleanWhen 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.
weightsnumber
setWeightsarray of number
percentIntensityValuePercent 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.
intensityModeIntensityMode
rpeRpe
velocityVelocity
velocityRangebooleanWhen true, velocity stores a lower and upper bound. A two-number array without this flag remains two per-set values.
loggedVelocitynumber | array of numberAthlete-measured bar speed in m/s. Written by the athlete app; independent of the coach velocity prescription.
setStatusesarray of "pending" | "complete" | "miss"
completedbooleandefault false
athleteCommentsstringmax length 1000

Day

object

FieldTypeDetails
dayNumbernumber
dayOfWeekstring
dayLabelstring
scheduledDatestringformat date
completedbooleandefault false
rating"Trash" | "Below Average" | "Average" | "Above Average" | "Crushing It"
sessionIntensitynumber
sessionDurationMsnumberminimum 0
sessionStartedAtintegerWhen the athlete started the workout timer, in epoch milliseconds. Send with sessionStartUtcOffsetMinutes.minimum 1577836800000, less than 4102444800000
sessionStartUtcOffsetMinutesintegerThe athlete's UTC offset when the workout started, in minutes east of UTC (UTC-5 is -300). Send with sessionStartedAt.minimum -720, maximum 840
sessionCommentsstringmax length 2000
coachNotesstringmax length 2000
completedAtnumber
exercisesRequiredarray of Exercise

DayPatch

object

FieldTypeDetails
targetDayNumberintegerminimum 1
dayOfWeekstring | null
dayLabelstring | null
scheduledDatestring | nullformat date
completedboolean
rating"Trash" | "Below Average" | "Average" | "Above Average" | "Crushing It" | null
sessionIntensitynumber | null
sessionDurationMsnumber | nullminimum 0
sessionCommentsstring | nullmax length 2000
coachNotesstring | nullmax length 2000

ExercisePatch

object

FieldTypeDetails
targetExerciseNumberintegerminimum 1
exerciseNamestring
exerciseCategorystring | null
exerciseNotesstring | nullmax length 2000
supersetGroupstring | null
supersetOrdernumber | null
setsinteger | nullminimum 1, maximum 99
repsstring | array of stringPrescribed 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
repsRangeboolean | nullSet true for a low/high quantity range. Null or false clears the range flag without removing reps values.
weightsnumber | null
setWeightsarray of number | null
percentIntensityValue | nullSet 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.
intensityModeIntensityMode | null
rpeRpe | null
velocityVelocity | nullOptional velocity overlay. Null clears velocity and velocityRange without changing intensityMode, percent, or rpe.
velocityRangeboolean | nullSet true to store velocity as a range. Null or false clears the range flag without removing velocity values.
setStatusesarray of "pending" | "complete" | "miss" | null
completedboolean
athleteCommentsstring | nullmax length 1000

Week

object

FieldTypeDetails
weekNumbernumber
daysRequiredarray of Day

ProgramInput

any | any

FieldTypeDetails
athleteIdstringStable roster ID; preferred over athleteName
athleteNamestring
programNameRequiredstringmin length 1, max length 120
startDateRequiredstringformat date
weekCountnumber
repTargetsRepTargets
repTargetChangesRepTargetChanges
weekTotalsarray of object
FieldTypeDetails
weekNumberRequirednumber
totalRequiredstring
weeksRequiredarray of Week

TemplateInput

object

FieldTypeDetails
programNameRequiredstringmin length 1, max length 120
folderIdstring | nullTemplate-folder ID. Omit when updating to preserve the current folder; use null to move the template to the root.
weekCountnumber
repTargetsRepTargets
repTargetChangesRepTargetChanges
weekTotalsarray of object
FieldTypeDetails
weekNumberRequirednumber
totalRequiredstring
weeksRequiredarray of object
FieldTypeDetails
weekNumbernumber
daysRequiredarray of object
FieldTypeDetails
dayNumbernumber
dayOfWeekstring
dayLabelstring
scheduledDatestringformat date
coachNotesstringmax length 2000
exercisesRequiredarray of object

TemplateAssignmentInput

any | any

FieldTypeDetails
athleteIdstring
athleteNamestring
programNameRequiredstringmin length 1, max length 120
startDateRequiredstringformat date

PersonalRecordInput

object

FieldTypeDetails
exerciseNameRequiredstringNormalized 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
repMaxRequiredintegerminimum 1
weightRequirednumberKilogramsminimum 0, maximum 1500
recordedAtnumberUnix timestamp in milliseconds; defaults to the time of the write when omittedminimum 0

ExerciseLibraryInput

object

FieldTypeDetails
nameRequiredstring
primarystringFree-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.
secondarystring
linkRequiredstringYouTube video URL. Requests without a valid YouTube video are rejected.format uri

ExerciseLibraryPatch

object

min properties 1

FieldTypeDetails
primarystring | nullFree-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.
secondarystring | null
linkstring | nullA non-null value must be a YouTube video URLformat uri

BulkPersonalRecordInput

object

FieldTypeDetails
recordsRequiredarray of PersonalRecordInputmax items 100

MoveDayInput

object

FieldTypeDetails
targetDateRequiredstringformat date

CompleteWorkoutInput

object

FieldTypeDetails
ratingRequired"Trash" | "Below Average" | "Average" | "Above Average" | "Crushing It"
sessionIntensityRequirednumberminimum 0, maximum 10
sessionDurationMsnumberminimum 0
sessionStartedAtintegerWhen the athlete started the workout timer, in epoch milliseconds. Send with sessionStartUtcOffsetMinutes.minimum 1577836800000, less than 4102444800000
sessionStartUtcOffsetMinutesintegerThe 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

FieldTypeDetails
errorRequiredobject
FieldTypeDetails
codeRequired"UNAUTHENTICATED" | "FORBIDDEN" | "NOT_FOUND" | "CONFLICT" | "VALIDATION_ERROR" | "PAYLOAD_TOO_LARGE" | "RATE_LIMITED" | "PRECONDITION_REQUIRED" | "PRECONDITION_FAILED" | "RESULT_SET_TOO_LARGE" | "UPSTREAM_ERROR" | "INTERNAL_ERROR"
messageRequiredstring
detailsany

ProgramMutationResult

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
programIdRequiredstring
createdRequiredboolean
revisionRequiredintegerminimum 1

Athlete

object

FieldTypeDetails
athleteIdRequiredstring | null
nameRequiredstring

AthleteProfile

object

FieldTypeDetails
athleteIdRequiredstring
nameRequiredstring
emailRequiredstring | nullformat email
invitationStatusRequired"not_invited" | "pending" | "accepted" | "failed" | "revoked"
invitedAtRequirednumber | null
joinedAtRequirednumber | null
inviteErrorRequiredstring | null
outputAthleteIdRequiredstring | null
outputAthleteNameRequiredstring | null
isSelfRequiredboolean

AthleteProfilePatch

object

min properties 1

FieldTypeDetails
namestringmin length 2, max length 100
emailstring | nullformat email
outputAthleteIdstring | nullUpdate together with outputAthleteName; set both to null to disconnect
outputAthleteNamestring | nullUpdate together with outputAthleteId; set both to null to disconnect

CoachSettings

object

FieldTypeDetails
showSelfAsAthleteRequiredboolean

Program

object

FieldTypeDetails
programIdRequiredstring
athleteIdRequiredstring | null
athleteNameRequiredstring
programNameRequiredstring
startDateRequiredstringformat date
revisionRequiredintegerminimum 1
weekCountRequiredintegerminimum 1
repTargetsRequiredRepTargets
repTargetChangesRequiredRepTargetChanges
weekTotalsRequiredarray of object
FieldTypeDetails
weekNumberRequiredintegerminimum 1
totalRequiredstring
weeksRequiredarray of Week

Template

TemplateInput & object

object

FieldTypeDetails
templateIdRequiredstring
folderIdRequiredstring | null
revisionRequiredintegerminimum 1
repTargetChangesRequiredRepTargetChanges

TemplateFolder

object

FieldTypeDetails
folderIdRequiredstring
nameRequiredstring
createdAtRequirednumber

TemplateFolderInput

object

FieldTypeDetails
nameRequiredstring

TemplateFolderAssignmentInput

object

FieldTypeDetails
folderIdRequiredstring | nullUse null to move the template to the root.

ProgramEnvelope

object

FieldTypeDetails
dataRequiredProgram

NullableProgramEnvelope

object

FieldTypeDetails
dataRequiredProgram | null

TemplateEnvelope

object

FieldTypeDetails
dataRequiredTemplate

TemplateFolderEnvelope

object

FieldTypeDetails
dataRequiredTemplateFolder

TemplateFolderListEnvelope

object

FieldTypeDetails
dataRequiredarray of TemplateFolder

ProgramPageEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
pageRequiredarray of Program
isDoneRequiredboolean
continueCursorRequiredstring

TemplatePageEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
pageRequiredarray of Template
isDoneRequiredboolean
continueCursorRequiredstring

AthleteComment

object

An athlete's own comment on a workout or one exercise. Coach notes are never included.

FieldTypeDetails
keyRequiredstringStable comment key (programId:week:day:session or programId:week:day:exercise:N). Percent-encode it in a path.max length 200
programIdRequiredstring
athleteIdRequiredstring
athleteNameRequiredstring
weekNumberRequiredinteger
dayNumberRequiredinteger
dayLabelstring
scheduledDateRequiredstringformat date
kindRequired"session" | "exercise"
exerciseNamestring
commentRequiredstring
commentedAtRequirednumberWhen 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.
readRequiredbooleanWhether the token owner marked this comment read since its text last changed

AthleteCommentFeedEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
commentsRequiredarray of AthleteCommentmax items 500
hasMoreRequiredboolean
unreadCountRequiredintegerUnread comments matching athleteId and sinceDate, on this page or not
athletesRequiredarray of objectEvery athlete with at least one comment, for filtering. With athleteId, only that athlete's programs are read, so it lists that athlete alone when they have a comment
FieldTypeDetails
athleteIdRequiredstring
nameRequiredstring

CommentReadStateEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
keyRequiredstring
readRequiredboolean

CurrentProgramSummaryEnvelope

object

FieldTypeDetails
dataRequiredobject | null

DataEnvelope

object

FieldTypeDetails
dataRequiredany

WeekPatch

object

FieldTypeDetails
targetWeekNumberintegerminimum 1
weekTotalstring

CopyWeekInput

object

FieldTypeDetails
targetWeekNumberRequiredintegerminimum 1

CopyDayInput

object

FieldTypeDetails
targetWeekNumberRequiredintegerminimum 1
targetDayNumberRequiredintegerminimum 1
targetDatestringformat date

WeightCalculationInput

object

FieldTypeDetails
exerciseNameRequiredstring
repMaxintegerminimum 1
percentagesRequiredarray of numbermin items 1, max items 50
roundingIncrementnumbergreater than 0

MeetInput

object

FieldTypeDetails
meetNameRequiredstringmin length 1, max length 120
meetDateRequiredstringformat date

WeekNoteInput

object

FieldTypeDetails
noteRequiredstringmin length 1, max length 280

MeetPlanLift

object

FieldTypeDetails
openernumbergreater than 0, maximum 1000
secondnumbergreater than 0, maximum 1000
thirdnumbergreater than 0, maximum 1000
warmupsRequiredarray of objectmax items 30
FieldTypeDetails
attemptsOutRequiredintegerminimum 1, maximum 30
valueRequiredstringmax length 12

MeetPlanTotals

object

FieldTypeDetails
snatchnumbergreater than 0, maximum 1000
cleanAndJerknumbergreater than 0, maximum 1000
totalnumbergreater than 0, maximum 1000

MeetPlanInput

object

FieldTypeDetails
meetNameRequiredstringmax length 120
meetDatestringformat date
weightClassstringmax length 40
entryTotalnumbergreater than 0, maximum 1000
coachNamestringmax length 80
snatchMeetPlanLift
cleanAndJerkMeetPlanLift
competitionAfterSnatchstringmax length 2000
competitionBestsMeetPlanTotals
trainingBestsMeetPlanTotals
competitionGoalsMeetPlanTotals

MeetPlanSummary

object

FieldTypeDetails
_idRequiredstring
meetNameRequiredstring
meetDatestringformat date
weightClassRequiredstring
entryTotalnumber
updatedAtRequirednumber

MeetPlan

MeetPlanInput & object

object

FieldTypeDetails
_idRequiredstring
_creationTimenumber
userIdRequiredstring
athleteIdstring
athleteNameRequiredstring
updatedAtRequirednumber

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.

FieldTypeDetails
athleteNameRequiredstring
exportedAtRequiredstringformat date-time
todayRequiredstringformat date
planIdRequiredstring
metaRequiredobject
attemptsRequiredobject
totalsRequiredarray of object
recentLiftsRequiredarray of object
checkInFlagsRequiredarray of object
lastMeetRequiredobject | null
historyRequiredobject | null

SessionCheckIn

object

FieldTypeDetails
checkInIdRequiredstring
dateRequiredstringformat date
programIdRequiredstring
weekNumberRequiredintegerminimum 1
dayNumberRequiredintegerminimum 1
preRequiredobject | null
FieldTypeDetails
sleepintegerminimum 1, maximum 5
energyintegerminimum 1, maximum 5
sorenessinteger1 is none, 5 is extrememinimum 1, maximum 5
stressinteger1 is none, 5 is extrememinimum 1, maximum 5
goalstring
submittedAtnumber
postRequiredobject | null
FieldTypeDetails
movementQualityintegerminimum 1, maximum 5
focusintegerminimum 1, maximum 5
misses"0" | "1" | "2" | "3" | "4" | "5+"
bodyFeelintegerminimum 1, maximum 5
cuesstring
submittedAtnumber

OuraMetricPoint

object

FieldTypeDetails
dateRequiredstringformat date
sleepDurationHoursRequirednumber | null
averageHrvMsRequirednumber | null
averageHeartRateBpmRequirednumber | null
readinessScoreRequirednumber | null

OuraMetricsEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
connectedRequiredboolean
pointsRequiredarray of OuraMetricPointmax items 400

WhoopMetricPoint

object

FieldTypeDetails
dateRequiredstringformat date
recoveryScoreRequirednumber | null
sleepDurationHoursRequirednumber | null
sleepPerformancePercentageRequirednumber | null
sleepEfficiencyPercentageRequirednumber | null
strainScoreRequirednumber | null
hrvMsRequirednumber | null
restingHeartRateBpmRequirednumber | null
respiratoryRateRequirednumber | null

WhoopMetricsEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
connectedRequiredboolean
pointsRequiredarray of WhoopMetricPointmax items 400

NutritionDailyPoint

object

Daily food-diary totals from the athlete's connected nutrition app (currently FatSecret). Days without diary entries are omitted.

FieldTypeDetails
dateRequiredstringformat date
caloriesRequirednumber | nullEnergy intake in kcal
proteinGramsRequirednumber | null
carbohydrateGramsRequirednumber | null
fatGramsRequirednumber | null

NutritionMetricsEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
connectedRequiredboolean
pointsRequiredarray of NutritionDailyPointmax items 400

NutritionFoodEntry

object

One logged food item with its meal slot and nutrients as recorded by the athlete.

FieldTypeDetails
entryIdRequiredstring
dateRequiredstringformat date
mealRequired"breakfast" | "lunch" | "dinner" | "other"
nameRequiredstringmax length 300
descriptionRequiredstringServing and food, for example "1 cup Instant Oatmeal"max length 300
caloriesRequirednumber | null
proteinGramsRequirednumber | null
carbohydrateGramsRequirednumber | null
fatGramsRequirednumber | null
fiberGramsRequirednumber | null
sugarGramsRequirednumber | null
sodiumMilligramsRequirednumber | null

NutritionFoodEntriesEnvelope

object

FieldTypeDetails
dataRequiredobject
FieldTypeDetails
connectedRequiredboolean
entriesRequiredarray of NutritionFoodEntrymax items 200

MeetResultInput

object

FieldTypeDetails
sourceKeyRequiredstring
kindRequired"local" | "override"
federationRequiredstring
meetRequiredstring
dateRequiredstringformat date
nameRequiredstring
ageRequiredstring
bodyWeightRequirednumber
snatch1Requirednumber
snatch2Requirednumber
snatch3Requirednumber
cj1Requirednumber
cj2Requirednumber
cj3Requirednumber