Create a timed race-style workout: HYROX-style or DEKA-style sims, AMRAPs, EMOMs, or “for time” WODs.
Full description and JSON Schema
Create a race-style workout in PeakSets.
Use this for race-style workouts where the user trains against a clock with no rest between stations — Hyrox, DEKA, CrossFit Hero WODs, AMRAPs, EMOMs, "for time" workouts. NOT for strength training (use create_plan for that).
Use intensity (0.1–1.0) to scale a full race down — generally scale distances linearly and weights in 5lb/2.5kg increments. Use your judgment about whether to scale distance, reps, or weight based on what is practical for the user.
Patterns:
- HYROX: alternate run stations with work stations. Standard layout is 8 runs interleaved with SkiErg, Sled Push, Sled Pull, Burpee Broad Jump, Row, Farmers Carry, Sandbag Lunges, Wall Balls (in that order). For a 60% sim, use 600m runs and scale work stations.
- AMRAP (e.g. Cindy: 5 pull_ups + 10 push_ups + 15 squats AMRAP 20:00): emit one round of stations with labels "Round 1" / "Round 2" / ... and set timeCap to the AMRAP duration in seconds. The app cycles rounds until timeCap expires.
- EMOM: emit stations with target.duration = 60 each. Set timeCap = stations.length * 60.
- Murph: emit one ordered list — Run 1mi, 100 pull_ups, 200 push_ups, 300 squats, Run 1mi.
- "for time" CrossFit WODs: emit movements as ordered stations with rep/weight targets; no timeCap.
To edit an existing race plan (intensity, stations, date, etc.) use update_race_simulation — do not delete and recreate.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"raceType": {
"type": "string",
"enum": [
"hyrox",
"deka",
"crossfit_wod",
"amrap",
"emom",
"for_time",
"custom"
],
"description": "hyrox | deka | crossfit_wod | amrap | emom | for_time | custom"
},
"raceName": {
"type": "string",
"description": "Display name, e.g. \"Hyrox 60% Simulation\", \"Murph\", \"Cindy\""
},
"intensity": {
"default": 1,
"description": "Scaling factor 0.1–1.0 relative to a full race. 1.0 = full intensity.",
"type": "number",
"minimum": 0.1,
"maximum": 1
},
"timeCap": {
"description": "Time cap in seconds. Required for amrap and emom; optional for everything else.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"scheduledDate": {
"description": "YYYY-MM-DD. Defaults to today if omitted.",
"type": "string"
},
"stations": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"run",
"ski_erg",
"sled_push",
"sled_pull",
"burpee_broad_jump",
"row",
"farmers_carry",
"sandbag_lunges",
"wall_balls",
"pull_ups",
"push_ups",
"squats",
"box_jumps",
"kb_swings",
"thruster",
"deadlift",
"clean",
"jerk",
"custom"
],
"description": "Station movement type"
},
"label": {
"type": "string",
"description": "Display label, e.g. \"Run 1\", \"Sled Push\", \"Round 1\" (for AMRAPs use \"Round N\")"
},
"target": {
"type": "object",
"properties": {
"distance": {
"description": "Target distance in meters (for run, row, ski_erg, sled, etc.)",
"type": "number"
},
"reps": {
"description": "Target reps (for wall_balls, burpees, push_ups, etc.)",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"duration": {
"description": "Target duration in seconds (for fixed-time stations like a 60s plank)",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"weight": {
"description": "Weight in user's preferred unit (sled push, farmers carry, sandbag, thruster, etc.)",
"type": "number"
}
},
"description": "What the user is racing against. At least one of distance/reps/duration should be set."
},
"notes": {
"description": "Optional pacing tips or coaching cues",
"type": "string"
}
},
"required": [
"type",
"label",
"target"
]
},
"description": "Ordered list of stations. Order is the array index."
},
"notes": {
"description": "Overall race coaching notes shown to the user before they start.",
"type": "string"
}
},
"required": [
"raceType",
"raceName",
"stations"
]
}