Open Workout Schema v0
Two documents. Loads keep the unit the person gave; distances are metres and durations seconds. Every field a server did not get from the person is listed in estimates.
Open Workout Schema v0: workout
One workout: exercise entries with their sets, plus where the record came from. Draft; may change until v1. Schema: https://openworkout.dev/schema/v0/workout.json.
| Field | Type | Meaning |
|---|---|---|
$schema | the constant https://openworkout.dev/schema/v0/workout.json | |
ended_at | string (date-time) | |
estimates | array of string | JSON pointers (RFC 6901) to values that were inferred or assumed rather than given. |
exercises required | array of entry | |
id | string | Assigned by the server that stores the workout. |
merged_sources | array of source | Other records of the same session, merged into this one: the same run from two apps, say. This workout is the fullest of them. |
notes | string | |
program | object | The program day this workout was part of: a label, which changes nothing else here. listed false means the program was withdrawn, and says nothing more. |
source required | source | |
started_at required | string (date-time) | |
title | string |
entry
One exercise in a workout.
| Field | Type | Meaning |
|---|---|---|
exercise required | exercise | |
id | string | Assigned by the server; used to edit the entry. |
notes | string | |
sets required | array of set | |
text | string | What the user called the exercise. |
exercise
The exercise an entry was matched to. catalogue and custom are confirmed; close and unmatched need confirmation and never count toward records.
| Field | Type | Meaning |
|---|---|---|
id required | string or null | Open Exercise Catalogue ID (oec:<slug>) or a custom exercise ID; null when nothing matched. |
match required | one of catalogue, close, custom, unmatched | |
name required | string |
load
A weight in the unit the user gave it.
| Field | Type | Meaning |
|---|---|---|
unit required | one of kg, lb | |
value required | number |
set
| Field | Type | Meaning |
|---|---|---|
distance_m | number | |
duration_s | integer | |
id | string | Assigned by the server; used to edit the set. |
load | load | |
reps | integer | |
rpe | number | |
type | one of working, warmup, backoff, amrap, failure, drop |
source
Provenance: where the record came from.
| Field | Type | Meaning |
|---|---|---|
client | string | The client or app, e.g. claude, strong, hevy. |
external_id | string or null | The workout's ID in the app it was imported from. |
kind required | one of app, mcp, api, import |
Open Workout Schema v0: program
What a workout or multi-week program prescribes: weeks, then days, then slots. A single workout has one week with one day. A prescription, never performed work: loads are rules, not weights. Draft; may change until v1. Schema: https://openworkout.dev/schema/v0/program.json.
| Field | Type | Meaning |
|---|---|---|
$schema required | the constant https://openworkout.dev/schema/v0/program.json | |
progression required | string | How the targets change over time, in words. |
schedule | string | How the days fall across a week, in words. |
weeks required | array of week | The weeks of one cycle, repeating. |
day
| Field | Type | Meaning |
|---|---|---|
key required | string | Stable within a version; what a link to this day names. |
name required | string | |
slots required | array of slot |
exerciseRef
| Field | Type | Meaning |
|---|---|---|
id required | string | An Open Exercise Catalogue ID (oec:…). |
name | string |
loadPrescription
How to pick the load. Value and unit depend on the type: percent_training_max and rpe take a value, last_plus a value and unit, choice neither.
| Field | Type | Meaning |
|---|---|---|
after_misses | integer | A failure rule on last_plus: after this many sessions short at one weight. |
drop_percent | number | Take this much off when the failure rule applies. |
type required | one of percent_training_max, rpe, last_plus, choice | |
unit | one of kg, lb | |
value | number |
setGroup
A run of identical sets. Reps or a duration, not both.
| Field | Type | Meaning |
|---|---|---|
amrap | boolean | As many reps as possible, reps_min at least. |
count required | integer | |
duration_s | integer | |
reps_max | integer | |
reps_min | integer |
slot
| Field | Type | Meaning |
|---|---|---|
exercise required | exerciseRef | |
load required | loadPrescription | |
notes | string | |
rest_seconds | integer | |
sets required | array of setGroup | |
substitutes | array of exerciseRef |
week
| Field | Type | Meaning |
|---|---|---|
days required | array of day |