Workout data model
How a workout nests from blocks down to repetitions, and how prescribed and executed values relate.
GET /workouts/{id} returns a workout with its full tree. The list endpoint GET /workouts returns workouts without this content, so list first, then fetch the ones you need.
workout
└── blocks[] ordered
└── prescriptionsGroups[] ordered; more than one prescription = superset
└── prescriptions[] one exercise each (exerciseId, trainingType, note)
├── seriePrescriptions[] the parameters: prescriptionTypeId + unitId
└── series[] ordered sets, with completedAt
├── serieValues[] per seriePrescriptionId: valuePrescripted,
│ valuePrescriptedInf / Sup (ranges), valueExecuted
├── metricValues[] metrics measured for the whole set
└── repetitions[] repNumber, repIndex, type, metricValues[]What each level means
| Level | Meaning |
|---|---|
| Workout | One session for one athlete. completedAt is null until it is performed. |
| Block | A section of the session, in order. |
| Prescriptions group | Exercises performed together. More than one prescription makes a superset. |
| Prescription | One exercise with its trainingType (vbt, jump, sprint, reaction). |
| Serie prescription | A parameter of the prescription, for example load or target reps, as a prescriptionTypeId with a unitId. |
| Serie | One set actually performed. |
| Serie value | The prescribed and executed value of one parameter in one set. |
| Repetition | One repetition of a set, with its own measured metrics. |
Prescribed versus executed
For each set and each parameter, serieValues holds:
| Field | Meaning |
|---|---|
valuePrescripted | What the coach prescribed. |
valuePrescriptedInf, valuePrescriptedSup | Lower and upper bound when a range was prescribed. |
valueExecuted | What the athlete did. null if not performed. |
Join serieValues[].seriePrescriptionId to the prescription's seriePrescriptions[].id to know which parameter it is (prescriptionTypeId) and in which unit it is expressed (unitId).
Units
serieValuesare expressed in theunitIdof their serie prescription.metricValues[].valueis expressed in the unit of the metric: readunitIdonGET /metrics/{id}.- To convert between units of the same dimension use
conversionFactor:base = value × conversionFactor, where the base unit isbaseUnitId. See Units.
Metric values at two levels
Measurements attach to a whole set or to each repetition. Each value appears once:
| Level | Where it appears |
|---|---|
| Repetition | series[].repetitions[].metricValues[] |
| Set | series[].metricValues[] |
Standalone athlete measurements, such as body weight, are not part of a workout: read them aggregated with Analytics.
Older rows
Workouts written before trainingType existed carry trainingType: null and isVbt: true on VBT prescriptions. GET /workouts?trainingType=vbt includes them.