Workout
vidextract.predefined.workout.v1
A workout or exercise routine extracted from a video — gym sessions, home workouts, mobility flows, stretching, yoga. Each exercise is parsed into a structured row with sets/reps or a timed hold. Optional fields are omitted when the creator does not state them — do not infer numbers that were never said.
Fields
The name or title of the workout, e.g. '20-minute full-body HIIT'.
One or two sentences describing the session and who it is for.
Primary training style. Pick the single best fit. Omit if unclear.
Difficulty level if the creator states it. Omit otherwise.
Total session length in whole minutes if stated or shown. Omit otherwise.
Equipment needed across the whole session, lowercased — e.g. 'dumbbells', 'resistance band', 'mat'. Use ['none'] if the creator explicitly says no equipment.
Main muscle groups trained, lowercased — e.g. 'glutes', 'core', 'hamstrings', 'shoulders'.
Approximate calories burned, only if the creator states a number. Omit otherwise.
Ordered list of exercises/movements. Keep them in the order performed. Group warmup/cooldown moves with the rest in order.
If the whole exercise list is repeated as a circuit, how many total rounds. Omit for straight-set workouts.
Recommended frequency if stated, e.g. 'daily', '3x per week'. Omit otherwise.
Coaching notes, modifications, or safety advice mentioned outside the per-exercise cues.
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "vidextract.predefined.workout.v1",
"title": "Workout",
"description": "A workout or exercise routine extracted from a video — gym sessions, home workouts, mobility flows, stretching, yoga. Each exercise is parsed into a structured row with sets/reps or a timed hold. Optional fields are omitted when the creator does not state them — do not infer numbers that were never said.",
"type": "object",
"required": [
"name",
"exercises"
],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "The name or title of the workout, e.g. '20-minute full-body HIIT'."
},
"description": {
"type": "string",
"description": "One or two sentences describing the session and who it is for."
},
"discipline": {
"type": "string",
"enum": [
"strength",
"hypertrophy",
"hiit",
"cardio",
"mobility",
"stretching",
"yoga",
"pilates",
"calisthenics",
"crossfit",
"rehab",
"warmup",
"cooldown"
],
"description": "Primary training style. Pick the single best fit. Omit if unclear."
},
"level": {
"type": "string",
"enum": [
"beginner",
"intermediate",
"advanced"
],
"description": "Difficulty level if the creator states it. Omit otherwise."
},
"durationMinutes": {
"type": "integer",
"description": "Total session length in whole minutes if stated or shown. Omit otherwise."
},
"equipment": {
"type": "array",
"description": "Equipment needed across the whole session, lowercased — e.g. 'dumbbells', 'resistance band', 'mat'. Use ['none'] if the creator explicitly says no equipment.",
"items": {
"type": "string"
}
},
"targetMuscles": {
"type": "array",
"description": "Main muscle groups trained, lowercased — e.g. 'glutes', 'core', 'hamstrings', 'shoulders'.",
"items": {
"type": "string"
}
},
"caloriesEstimate": {
"type": "integer",
"description": "Approximate calories burned, only if the creator states a number. Omit otherwise."
},
"exercises": {
"type": "array",
"description": "Ordered list of exercises/movements. Keep them in the order performed. Group warmup/cooldown moves with the rest in order.",
"minItems": 1,
"items": {
"type": "object",
"required": [
"name"
],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "Exercise name, e.g. 'goblet squat', 'figure-four stretch', 'mountain climbers'."
},
"sets": {
"type": "integer",
"description": "Number of sets if stated. Omit for single-round or timed-only moves."
},
"reps": {
"type": "string",
"description": "Reps as a string so ranges ('8-12') and per-side notes ('10 per side') round-trip. Omit when the move is purely time-based."
},
"holdSeconds": {
"type": "integer",
"description": "Hold or work duration in seconds for timed moves (planks, stretches). Omit for rep-based moves."
},
"restSeconds": {
"type": "integer",
"description": "Rest after this exercise in seconds, if stated. Omit otherwise."
},
"targetMuscle": {
"type": "string",
"description": "Primary muscle this exercise targets, lowercased. Omit if not clear."
},
"tempo": {
"type": "string",
"description": "Tempo or cadence cue if given, e.g. '3s down, 1s up', 'slow and controlled'. Omit otherwise."
},
"formCue": {
"type": "string",
"description": "Key form/technique cue the creator emphasizes for this move. Omit if none."
},
"videoTimestamp": {
"type": "string",
"description": "Start timestamp of this exercise in the source video, 'mm:ss' or 'h:mm:ss'. Omit if unknown.",
"pattern": "^(\\d{1,2}:)?\\d{1,2}:\\d{2}$"
}
}
}
},
"rounds": {
"type": "integer",
"description": "If the whole exercise list is repeated as a circuit, how many total rounds. Omit for straight-set workouts."
},
"frequency": {
"type": "string",
"description": "Recommended frequency if stated, e.g. 'daily', '3x per week'. Omit otherwise."
},
"tips": {
"type": "array",
"description": "Coaching notes, modifications, or safety advice mentioned outside the per-exercise cues.",
"items": {
"type": "string"
}
}
}
}Use it via the API
Pass schemaId: "vidextract.predefined.workout.v1" when you submit an extraction. The call returns an id immediately. Poll GET /v1/extractions/{id}/result (or register a webhook) for the structured result.
curl -s -X POST https://postreef.com/v1/extractions \
-H "x-api-key: $VIDEXTRACT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"inputs": ["transcript", "comments"],
"schemaId": "vidextract.predefined.workout.v1"}'Full request/response shape in the API reference; copy-paste poll loops in the API quickstart.
Pass schemaId: "vidextract.predefined.workout.v1" in your request to extract with this schema.