Exercise Events
Events for individual exercise tracking.
| Event | Description |
| exercise_completed | Individual exercise completed |
| exercise_overview | All exercises summary (array) |
| exercise_auto_skipped | The SDK skipped a stalled exercise on its own (see below) |
exercise_completed Data Structure:
1{
2 exercise_title: string, // Exercise name
3 time_spent: number, // Seconds spent
4 repeats: number, // Reps completed
5 total_reps: number, // Required reps
6 total_duration: number, // Countdown time
7 perfect_hold_position: number, // Time in perfect hold position (seconds).
8 // 0 for non-hold exercises
9 calories: number, // Calories burned
10 exercise_id: string, // Exercise ID
11 exercise_index: number, // 1-based position in the workout, rest periods included
12 total_exercises: number, // Total entries in the workout, rest periods included
13 mistakes: Array<{ // Mistakes made
14 mistake: string,
15 count: number
16 }>,
17 average_accuracy?: number // Average accuracy (0-1, optional)
18}exercise_index and total_exercises count rest periods here, unlike workout_progress. In the Gym Log, editing a set that was already reported sends exercise_completed again for the same exercise, so treat it as an update.
exercise_auto_skipped: sent when the SDK moves past an exercise because the user made 7 form mistakes in a row (a correct rep resets the count), or no rep or mistake was detected for 30 seconds in a rep-based exercise. A 5-second warning comes first, and a correct rep during it cancels the skip. The usual exercise_completed and workout_progress for that exercise follow. Only in Workout, Plan, Personalized Plan and Custom Workout. It cannot be turned off; includePhrases can only drop the spoken auto_skip line.
1{
2 type: "exercise_auto_skipped",
3 data: {
4 exercise_id: string,
5 exercise_title: string,
6 trigger: "mistake_count" | "inactivity",
7 exercise_index: number, // 1-based, rest periods included
8 total_exercises: number
9 },
10 date: string // "DD MM YYYY HH:MM:SS"
11}exercise_overview Item Structure:
1{
2 exercise_title: string, // Exercise name
3 exercise_id: string, // Unique exercise ID
4 time_spent: number, // Time on exercise (seconds)
5 perfect_hold_position: number, // Time in correct position (timer-based)
6 repeats: number, // Reps completed
7 total_required_reps: number, // Target reps
8 total_required_time: number, // Target time (seconds)
9 calories: number, // Calories (2 decimal places)
10 mistakes: Array<{ // Detailed mistake breakdown
11 mistake: string,
12 count: number
13 }>,
14 mistake_count: number, // Total mistakes for exercise
15 accuracy_reps?: number[], // Per-rep accuracy scores (optional)
16 average_accuracy?: number // Average accuracy 0-100 (optional)
17}