├── version ├── .gitignore ├── img └── sample.png ├── sample ├── graphs │ ├── Push Up-reps.png │ ├── Sit Up-reps.png │ ├── Ab Wheel-reps.png │ ├── Face Pull-reps.png │ ├── Dumbbell Row-reps.png │ ├── Face Pull-volume.png │ ├── Face Pull-weight.png │ ├── Pistol Squat-reps.png │ ├── Decline Crunch-reps.png │ ├── Dumbbell Row-volume.png │ ├── Dumbbell Row-weight.png │ ├── Lying Leg Raise-reps.png │ ├── Hanging Leg Raise-reps.png │ ├── Kettlebell Swing-reps.png │ ├── Lunge (Dumbbell)-reps.png │ ├── Seated Cable Row-reps.png │ ├── Seated Calf Raise-reps.png │ ├── Bicep Curl (Barbell)-reps.png │ ├── Chest Fly (Dumbbell)-reps.png │ ├── Chest Fly (Machine)-reps.png │ ├── Front Raise (Cable)-reps.png │ ├── Hack Squat (Machine)-reps.png │ ├── Hammer Curl (Cable)-reps.png │ ├── Hip Thrust (Barbell)-reps.png │ ├── Kettlebell Swing-volume.png │ ├── Kettlebell Swing-weight.png │ ├── Lat Pulldown (Cable)-reps.png │ ├── Leg Press (Machine)-reps.png │ ├── Lunge (Dumbbell)-volume.png │ ├── Lunge (Dumbbell)-weight.png │ ├── Pullover (Dumbbell)-reps.png │ ├── Seated Cable Row-volume.png │ ├── Seated Cable Row-weight.png │ ├── Seated Calf Raise-volume.png │ ├── Seated Calf Raise-weight.png │ ├── Bench Press (Barbell)-reps.png │ ├── Bench Press (Dumbbell)-reps.png │ ├── Bicep Curl (Barbell)-volume.png │ ├── Bicep Curl (Barbell)-weight.png │ ├── Bicep Curl (Dumbbell)-reps.png │ ├── Chest Fly (Dumbbell)-volume.png │ ├── Chest Fly (Dumbbell)-weight.png │ ├── Chest Fly (Machine)-volume.png │ ├── Chest Fly (Machine)-weight.png │ ├── Front Raise (Cable)-volume.png │ ├── Front Raise (Cable)-weight.png │ ├── Front Raise (Dumbbell)-reps.png │ ├── Hack Squat (Machine)-volume.png │ ├── Hack Squat (Machine)-weight.png │ ├── Hammer Curl (Cable)-volume.png │ ├── Hammer Curl (Cable)-weight.png │ ├── Hip Thrust (Barbell)-volume.png │ ├── Hip Thrust (Barbell)-weight.png │ ├── Lat Pulldown (Cable)-volume.png │ ├── Lat Pulldown (Cable)-weight.png │ ├── Lateral Raise (Cable)-reps.png │ ├── Leg Press (Machine)-volume.png │ ├── Leg Press (Machine)-weight.png │ ├── Pullover (Dumbbell)-volume.png │ ├── Pullover (Dumbbell)-weight.png │ ├── Bench Press (Barbell)-volume.png │ ├── Bench Press (Barbell)-weight.png │ ├── Bench Press (Dumbbell)-volume.png │ ├── Bench Press (Dumbbell)-weight.png │ ├── Bent Over Row (Barbell)-reps.png │ ├── Bent Over Row (Barbell)-volume.png │ ├── Bent Over Row (Barbell)-weight.png │ ├── Bicep Curl (Dumbbell)-volume.png │ ├── Bicep Curl (Dumbbell)-weight.png │ ├── Cable Twist (Up to down)-reps.png │ ├── Decline Crunch (Weighted)-reps.png │ ├── Front Raise (Dumbbell)-volume.png │ ├── Front Raise (Dumbbell)-weight.png │ ├── Hip Abduction (Machine)-reps.png │ ├── Hip Abduction (Machine)-volume.png │ ├── Hip Abduction (Machine)-weight.png │ ├── Lateral Raise (Cable)-volume.png │ ├── Lateral Raise (Cable)-weight.png │ ├── Lateral Raise (Dumbbell)-reps.png │ ├── Leg Extension (Machine)-reps.png │ ├── Leg Extension (Machine)-volume.png │ ├── Leg Extension (Machine)-weight.png │ ├── Overhead Press (Barbell)-reps.png │ ├── Overhead Press (Dumbbell)-reps.png │ ├── Seated Leg Curl (Machine)-reps.png │ ├── Triceps Extension (Cable)-reps.png │ ├── Cable Twist (Up to down)-volume.png │ ├── Cable Twist (Up to down)-weight.png │ ├── Decline Crunch (Weighted)-volume.png │ ├── Decline Crunch (Weighted)-weight.png │ ├── Lateral Raise (Dumbbell)-volume.png │ ├── Lateral Raise (Dumbbell)-weight.png │ ├── Overhead Press (Barbell)-volume.png │ ├── Overhead Press (Barbell)-weight.png │ ├── Overhead Press (Dumbbell)-volume.png │ ├── Overhead Press (Dumbbell)-weight.png │ ├── Seated Leg Curl (Machine)-volume.png │ ├── Seated Leg Curl (Machine)-weight.png │ ├── Triceps Extension (Barbell)-reps.png │ ├── Triceps Extension (Cable)-volume.png │ ├── Triceps Extension (Cable)-weight.png │ ├── Leg Press Horizontal (Machine)-reps.png │ ├── Standing Calf Raise (Machine)-reps.png │ ├── Triceps Extension (Barbell)-volume.png │ ├── Triceps Extension (Barbell)-weight.png │ ├── Leg Press Horizontal (Machine)-volume.png │ ├── Leg Press Horizontal (Machine)-weight.png │ ├── Standing Calf Raise (Machine)-volume.png │ ├── Standing Calf Raise (Machine)-weight.png │ ├── Chest Supported Incline Row (Dumbbell)-reps.png │ ├── Chest Supported Incline Row (Dumbbell)-volume.png │ └── Chest Supported Incline Row (Dumbbell)-weight.png ├── README.md ├── 6.workouts.html ├── 1.login.py ├── 4.create-stats.py ├── 2.workout-history.py ├── 3.create-charts.py └── 5.chart.html ├── .github └── workflows │ ├── main.yml │ └── ai-responder.yml ├── api ├── workoutcount.md ├── login.md ├── user_preferences.md ├── account.md ├── new-routine.md ├── update-routine.md ├── routines_sync_batch.md ├── workouts_batch.md └── feed_workouts_paged.md ├── README.md └── LICENSE /version: -------------------------------------------------------------------------------- 1 | version=0.0.16 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | sample/exports.sh 2 | -------------------------------------------------------------------------------- /img/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/img/sample.png -------------------------------------------------------------------------------- /sample/graphs/Push Up-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Push Up-reps.png -------------------------------------------------------------------------------- /sample/graphs/Sit Up-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Sit Up-reps.png -------------------------------------------------------------------------------- /sample/graphs/Ab Wheel-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Ab Wheel-reps.png -------------------------------------------------------------------------------- /sample/graphs/Face Pull-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Face Pull-reps.png -------------------------------------------------------------------------------- /sample/graphs/Dumbbell Row-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Dumbbell Row-reps.png -------------------------------------------------------------------------------- /sample/graphs/Face Pull-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Face Pull-volume.png -------------------------------------------------------------------------------- /sample/graphs/Face Pull-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Face Pull-weight.png -------------------------------------------------------------------------------- /sample/graphs/Pistol Squat-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Pistol Squat-reps.png -------------------------------------------------------------------------------- /sample/graphs/Decline Crunch-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Decline Crunch-reps.png -------------------------------------------------------------------------------- /sample/graphs/Dumbbell Row-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Dumbbell Row-volume.png -------------------------------------------------------------------------------- /sample/graphs/Dumbbell Row-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Dumbbell Row-weight.png -------------------------------------------------------------------------------- /sample/graphs/Lying Leg Raise-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lying Leg Raise-reps.png -------------------------------------------------------------------------------- /sample/graphs/Hanging Leg Raise-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hanging Leg Raise-reps.png -------------------------------------------------------------------------------- /sample/graphs/Kettlebell Swing-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Kettlebell Swing-reps.png -------------------------------------------------------------------------------- /sample/graphs/Lunge (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lunge (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Seated Cable Row-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Cable Row-reps.png -------------------------------------------------------------------------------- /sample/graphs/Seated Calf Raise-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Calf Raise-reps.png -------------------------------------------------------------------------------- /sample/graphs/Bicep Curl (Barbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bicep Curl (Barbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Chest Fly (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Fly (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Chest Fly (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Fly (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Front Raise (Cable)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Front Raise (Cable)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Hack Squat (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hack Squat (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Hammer Curl (Cable)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hammer Curl (Cable)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Hip Thrust (Barbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hip Thrust (Barbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Kettlebell Swing-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Kettlebell Swing-volume.png -------------------------------------------------------------------------------- /sample/graphs/Kettlebell Swing-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Kettlebell Swing-weight.png -------------------------------------------------------------------------------- /sample/graphs/Lat Pulldown (Cable)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lat Pulldown (Cable)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Leg Press (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Press (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Lunge (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lunge (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Lunge (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lunge (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Pullover (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Pullover (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Seated Cable Row-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Cable Row-volume.png -------------------------------------------------------------------------------- /sample/graphs/Seated Cable Row-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Cable Row-weight.png -------------------------------------------------------------------------------- /sample/graphs/Seated Calf Raise-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Calf Raise-volume.png -------------------------------------------------------------------------------- /sample/graphs/Seated Calf Raise-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Calf Raise-weight.png -------------------------------------------------------------------------------- /sample/graphs/Bench Press (Barbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bench Press (Barbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Bench Press (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bench Press (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Bicep Curl (Barbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bicep Curl (Barbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Bicep Curl (Barbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bicep Curl (Barbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Bicep Curl (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bicep Curl (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Chest Fly (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Fly (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Chest Fly (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Fly (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Chest Fly (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Fly (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Chest Fly (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Fly (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Front Raise (Cable)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Front Raise (Cable)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Front Raise (Cable)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Front Raise (Cable)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Front Raise (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Front Raise (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Hack Squat (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hack Squat (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Hack Squat (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hack Squat (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Hammer Curl (Cable)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hammer Curl (Cable)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Hammer Curl (Cable)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hammer Curl (Cable)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Hip Thrust (Barbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hip Thrust (Barbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Hip Thrust (Barbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hip Thrust (Barbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Lat Pulldown (Cable)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lat Pulldown (Cable)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Lat Pulldown (Cable)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lat Pulldown (Cable)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Lateral Raise (Cable)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lateral Raise (Cable)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Leg Press (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Press (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Leg Press (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Press (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Pullover (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Pullover (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Pullover (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Pullover (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Bench Press (Barbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bench Press (Barbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Bench Press (Barbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bench Press (Barbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Bench Press (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bench Press (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Bench Press (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bench Press (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Bent Over Row (Barbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bent Over Row (Barbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Bent Over Row (Barbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bent Over Row (Barbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Bent Over Row (Barbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bent Over Row (Barbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Bicep Curl (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bicep Curl (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Bicep Curl (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Bicep Curl (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Cable Twist (Up to down)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Cable Twist (Up to down)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Decline Crunch (Weighted)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Decline Crunch (Weighted)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Front Raise (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Front Raise (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Front Raise (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Front Raise (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Hip Abduction (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hip Abduction (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Hip Abduction (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hip Abduction (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Hip Abduction (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Hip Abduction (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Lateral Raise (Cable)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lateral Raise (Cable)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Lateral Raise (Cable)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lateral Raise (Cable)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Lateral Raise (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lateral Raise (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Leg Extension (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Extension (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Leg Extension (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Extension (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Leg Extension (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Extension (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Overhead Press (Barbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Overhead Press (Barbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Overhead Press (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Overhead Press (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Seated Leg Curl (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Leg Curl (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Triceps Extension (Cable)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Triceps Extension (Cable)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Cable Twist (Up to down)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Cable Twist (Up to down)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Cable Twist (Up to down)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Cable Twist (Up to down)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Decline Crunch (Weighted)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Decline Crunch (Weighted)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Decline Crunch (Weighted)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Decline Crunch (Weighted)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Lateral Raise (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lateral Raise (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Lateral Raise (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Lateral Raise (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Overhead Press (Barbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Overhead Press (Barbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Overhead Press (Barbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Overhead Press (Barbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Overhead Press (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Overhead Press (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Overhead Press (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Overhead Press (Dumbbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Seated Leg Curl (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Leg Curl (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Seated Leg Curl (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Seated Leg Curl (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Triceps Extension (Barbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Triceps Extension (Barbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Triceps Extension (Cable)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Triceps Extension (Cable)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Triceps Extension (Cable)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Triceps Extension (Cable)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Leg Press Horizontal (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Press Horizontal (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Standing Calf Raise (Machine)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Standing Calf Raise (Machine)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Triceps Extension (Barbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Triceps Extension (Barbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Triceps Extension (Barbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Triceps Extension (Barbell)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Leg Press Horizontal (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Press Horizontal (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Leg Press Horizontal (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Leg Press Horizontal (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Standing Calf Raise (Machine)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Standing Calf Raise (Machine)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Standing Calf Raise (Machine)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Standing Calf Raise (Machine)-weight.png -------------------------------------------------------------------------------- /sample/graphs/Chest Supported Incline Row (Dumbbell)-reps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Supported Incline Row (Dumbbell)-reps.png -------------------------------------------------------------------------------- /sample/graphs/Chest Supported Incline Row (Dumbbell)-volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Supported Incline Row (Dumbbell)-volume.png -------------------------------------------------------------------------------- /sample/graphs/Chest Supported Incline Row (Dumbbell)-weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmzoneill/hevyapp-api/HEAD/sample/graphs/Chest Supported Incline Row (Dumbbell)-weight.png -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: CICD 3 | 4 | on: 5 | push: 6 | branches: [ "main" ] 7 | pull_request: 8 | branches: [ "main" ] 9 | 10 | permissions: write-all 11 | 12 | jobs: 13 | cicd: 14 | secrets: inherit 15 | uses: dmzoneill/dmzoneill/.github/workflows/dispatch.yaml@main 16 | with: 17 | basic: "true" 18 | -------------------------------------------------------------------------------- /api/workoutcount.md: -------------------------------------------------------------------------------- 1 | ## Workout count 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'accept': 'application/json, text/plain, */*', 10 | 'x-api-key': 'klean_kanteen_insulated', 11 | 'auth-token': '.......-.....-....-....-.............', 12 | 'Host': 'api.hevyapp.com', 13 | 'User-Agent': 'okhttp/4.9.3', 14 | 'Pragma': 'no-cache', 15 | 'Cache-Control': 'no-cache', 16 | } 17 | 18 | response = requests.get('https://api.hevyapp.com/workout_count', headers=headers) 19 | ``` 20 | 21 | ### response 22 | ``` 23 | { 24 | "workout_count": 0 25 | } 26 | ``` -------------------------------------------------------------------------------- /sample/README.md: -------------------------------------------------------------------------------- 1 | # hevy-api 2 | 3 | ## Welcome 4 | 5 | - 1.login.py - fairly self explanatory 6 | - 2.workout-history.py - slightly larger exmaple, also saves workouts.json, used for the following examples 7 | - 3.create-charts.py - uses workouts.json and matplotlib.pyplot to create charts found in graphs/ 8 | - 4.create-stats.py - takes workouts and simplifies the data 9 | - 5.chart.html - uses stats.json and chartjs to give and clean example of use in webpage. 10 | 11 | ## You will need to define these: 12 | 13 | - export hevy_device_uuid=$(uuidgen) 14 | - export hevy_application_id=$(date | sha1sum | awk '{print $1}') 15 | - export hevy_username="ddddddddddddddddd" 16 | - export hevy_password="gggggggggggggggggg" -------------------------------------------------------------------------------- /.github/workflows/ai-responder.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: AI Issue Responder 3 | 4 | on: 5 | issues: 6 | types: [opened] 7 | 8 | permissions: 9 | issues: write 10 | 11 | jobs: 12 | ai-respond: 13 | if: github.actor != 'dependabot[bot]' 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Download AI responder script 18 | run: | 19 | curl -sSL "https://raw.githubusercontent.com/dmzoneill/dmzoneill/main/ai-responder.py" -o ai-responder.py 20 | chmod +x ai-responder.py 21 | 22 | - name: Run AI responder 23 | env: 24 | OPENAI_API_KEY: ${{ secrets.AI_API_KEY }} 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 26 | GITHUB_REPOSITORY: ${{ github.repository }} 27 | ISSUE_NUMBER: ${{ github.event.issue.number }} 28 | ISSUE_REPO_URL: "https://github.com/${{ github.repository }}" 29 | run: ./ai-responder.py 30 | -------------------------------------------------------------------------------- /api/login.md: -------------------------------------------------------------------------------- 1 | ## login 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'Accept': 'application/json, text/plain, */*', 10 | 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8', 11 | 'Cache-Control': 'no-cache', 12 | 'Connection': 'keep-alive', 13 | 'Content-Type': 'application/json', 14 | 'DNT': '1', 15 | 'Origin': 'https://www.hevy.com', 16 | 'Pragma': 'no-cache', 17 | 'Referer': 'https://www.hevy.com/', 18 | 'Sec-Fetch-Dest': 'empty', 19 | 'Sec-Fetch-Mode': 'cors', 20 | 'Sec-Fetch-Site': 'cross-site', 21 | 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 22 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 23 | 'sec-ch-ua-mobile': '?0', 24 | 'sec-ch-ua-platform': '"Linux"', 25 | 'x-api-key': 'shelobs_hevy_web', 26 | } 27 | 28 | json_data = { 29 | 'emailOrUsername': '................', 30 | 'password': '................', 31 | } 32 | 33 | response = requests.post('https://api.hevyapp.com/login', headers=headers, json=json_data) 34 | 35 | ``` 36 | 37 | ### response 38 | ``` 39 | { 40 | "auth_token":".......-.....-....-....-............." 41 | } 42 | ``` -------------------------------------------------------------------------------- /sample/6.workouts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | My Hevy Stats 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 19 | 22 | 25 | 28 | 31 | 32 | 33 | 34 | 35 |
14 | Short Id 15 | 17 | Start Time 18 | 20 | End Time 21 | 23 | Name 24 | 26 | Exercises 27 | 29 | Total volume 30 |
36 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /sample/1.login.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | import requests 3 | import os 4 | import sys 5 | 6 | hevy_username = os.getenv("hevy_username") 7 | hevy_password = os.environ.get("hevy_password") 8 | 9 | if hevy_username is None: 10 | sys.exit(1) 11 | 12 | if hevy_password is None: 13 | sys.exit(2) 14 | 15 | headers = { 16 | "Accept": "application/json, text/plain, */*", 17 | "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", 18 | "Cache-Control": "no-cache", 19 | "Connection": "keep-alive", 20 | "Content-Type": "application/json", 21 | "DNT": "1", 22 | "Origin": "https://www.hevy.com", 23 | "Pragma": "no-cache", 24 | "Referer": "https://www.hevy.com/", 25 | "Sec-Fetch-Dest": "empty", 26 | "Sec-Fetch-Mode": "cors", 27 | "Sec-Fetch-Site": "cross-site", 28 | "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", 29 | "sec-ch-ua": '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 30 | "sec-ch-ua-mobile": "?0", 31 | "sec-ch-ua-platform": '"Linux"', 32 | "x-api-key": "shelobs_hevy_web", 33 | } 34 | 35 | json_data = { 36 | "emailOrUsername": hevy_username, 37 | "password": hevy_password, 38 | } 39 | 40 | response = requests.post( 41 | "https://api.hevyapp.com/login", headers=headers, json=json_data 42 | ) 43 | 44 | pprint(headers) 45 | pprint(json_data) 46 | pprint(response.json()) 47 | pprint(response.ok) 48 | pprint(response.status_code) 49 | -------------------------------------------------------------------------------- /api/user_preferences.md: -------------------------------------------------------------------------------- 1 | ## User preferences 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'Accept': 'application/json, text/plain, */*', 10 | 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8', 11 | 'Cache-Control': 'no-cache', 12 | 'Connection': 'keep-alive', 13 | 'DNT': '1', 14 | 'Origin': 'https://www.hevy.com', 15 | 'Pragma': 'no-cache', 16 | 'Referer': 'https://www.hevy.com/', 17 | 'Sec-Fetch-Dest': 'empty', 18 | 'Sec-Fetch-Mode': 'cors', 19 | 'Sec-Fetch-Site': 'cross-site', 20 | 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 21 | 'auth-token': '.......-.....-....-....-.............', 22 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 23 | 'sec-ch-ua-mobile': '?0', 24 | 'sec-ch-ua-platform': '"Linux"', 25 | 'x-api-key': 'shelobs_hevy_web', 26 | } 27 | 28 | response = requests.get('https://api.hevyapp.com/user_preferences', headers=headers) 29 | ``` 30 | 31 | ### response 32 | ``` 33 | { 34 | "username": "ddddddddddd", 35 | "language": null, 36 | "weight_unit": "kg", 37 | "distance_unit": "kilometers", 38 | "body_measurement_unit": "cm", 39 | "first_weekday": null, 40 | "default_rest_timer_seconds": null, 41 | "workout_keep_awake": null, 42 | "disabled_review_request": null, 43 | "superset_scrolling": false, 44 | "plate_calculator_enabled": true, 45 | "previous_workout_values_from_routine": null, 46 | "rpe_enabled": false, 47 | "timer_volume": null, 48 | "inline_set_timer_enabled": true 49 | } 50 | ``` -------------------------------------------------------------------------------- /sample/4.create-stats.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | stats = {} 4 | 5 | names = [] 6 | workout_exercises = {} 7 | workout_time = {} 8 | workout_volume = {} 9 | 10 | wos = json.loads(open("workouts.json").read()) 11 | 12 | for X in wos: 13 | index = X["nth_workout"] 14 | name = X["name"] 15 | names.append(name.replace(" ", "")) 16 | workout_time[index] = round((X["end_time"] - X["start_time"]) / 60) 17 | workout_volume[index] = round(X["estimated_volume_kg"]) 18 | 19 | for exercise in X["exercises"]: 20 | exercise_title = exercise["title"] 21 | 22 | if exercise_title not in workout_exercises.keys(): 23 | workout_exercises[exercise_title] = {} 24 | 25 | volume = 0 26 | max = 0 27 | reps = 0 28 | 29 | for set in exercise["sets"]: 30 | if set["weight_kg"] is not None and set["reps"] is not None: 31 | volume += round(set["weight_kg"] * set["reps"]) 32 | else: 33 | volume += 0 34 | 35 | reps += set["reps"] if set["reps"] is not None else 0 36 | 37 | if set["weight_kg"] is not None: 38 | max = set["weight_kg"] if set["weight_kg"] > max else max 39 | 40 | workout_exercises[exercise_title][index] = {} 41 | workout_exercises[exercise_title][index]["total_volume"] = round(volume) 42 | workout_exercises[exercise_title][index]["max_weight"] = max 43 | workout_exercises[exercise_title][index]["total_reps"] = reps 44 | 45 | 46 | names.sort() 47 | 48 | stats = { 49 | "workout_exercises": workout_exercises, 50 | "workout_time": workout_time, 51 | "workout_volume": workout_volume, 52 | } 53 | 54 | with open("stats.json", "w") as file1: 55 | file1.write(json.dumps(stats)) 56 | file1.close() 57 | -------------------------------------------------------------------------------- /api/account.md: -------------------------------------------------------------------------------- 1 | ## Feed workouts paged 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'Accept': 'application/json, text/plain, */*', 10 | 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8', 11 | 'Cache-Control': 'no-cache', 12 | 'Connection': 'keep-alive', 13 | 'DNT': '1', 14 | 'Origin': 'https://www.hevy.com', 15 | 'Pragma': 'no-cache', 16 | 'Referer': 'https://www.hevy.com/', 17 | 'Sec-Fetch-Dest': 'empty', 18 | 'Sec-Fetch-Mode': 'cors', 19 | 'Sec-Fetch-Site': 'cross-site', 20 | 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 21 | 'auth-token': '.......-.....-....-....-.............', 22 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 23 | 'sec-ch-ua-mobile': '?0', 24 | 'sec-ch-ua-platform': '"Linux"', 25 | 'x-api-key': 'shelobs_hevy_web', 26 | } 27 | 28 | response = requests.get('https://api.hevyapp.com/account', headers=headers) 29 | 30 | ``` 31 | 32 | ### response 33 | ``` 34 | { 35 | "id":".......-.....-....-....-.............", 36 | "username":"................", 37 | "email":"................", 38 | "full_name":"...............", 39 | "description":"Gym bro", 40 | "profile_pic":"https://pump-app.s3.eu-west-2.amazonaws.com/profile-images/.....................jpg", 41 | "likes_push_enabled":true, 42 | "follows_push_enabled":true, 43 | "comments_push_enabled":true, 44 | "comment_mention_push_enabled":true, 45 | "comment_discussion_push_enabled":true, 46 | "private_profile":true, 47 | "follower_count":0, 48 | "following_count":0, 49 | "created_at":"2023-03-05T17:50:28.769Z", 50 | "last_workout_at":"2023-03-15T10:49:39.873Z", 51 | "comment_replies_push_enabled":true, 52 | "accepted_terms_and_conditions":true, 53 | "is_coached":false 54 | } 55 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hevy-api 2 | 3 | ![Bench press](https://github.com/dmzoneill/hevyapp-api/blob/main/img/sample.png?raw=true) 4 | 5 | ## Samples 6 | 7 | - [Samples](https://github.com/dmzoneill/hevyapp-api/tree/main/sample) 8 | - [Python pyplot example](https://dmzoneill.github.io/hevyapp-api/sample/chart.html) 9 | - [Chart js example](https://dmzoneill.github.io/hevyapp-api/sample/5.chart.html) 10 | 11 | ## Overviews 12 | 13 | - [login.md](https://github.com/dmzoneill/hevyapp-api/blob/main/api/login.md) 14 | - [account.md](https://github.com/dmzoneill/hevyapp-api/blob/main/api/account.md) 15 | - [workoutcount.md](https://github.com/dmzoneill/hevyapp-api/blob/main/api/workoutcount.md) 16 | - [feed_workouts_paged.md](https://github.com/dmzoneill/hevyapp-api/blob/main/api/feed_workouts_paged.md) 17 | - [routines_sync_batched.md](https://github.com/dmzoneill/hevyapp-api/blob/main/api/routines_sync_batched.md) 18 | - [user_preferences.md](https://github.com/dmzoneill/hevyapp-api/blob/main/api/user_preferences.md) 19 | 20 | 21 | ## How to dissect https calls for yourself 22 | 23 | ### Download 24 | 25 | - Android studio 26 | - [Charles proxy](https://www.charlesproxy.com/) 27 | - [apk-mitm](https://www.npmjs.com/package/apk-mitm/) 28 | - [com.hevy apk](https://m.apkpure.com/hevy-gym-log-workout-tracker/com.hevy/download) 29 | 30 | ### Setup 31 | 32 | 1. Open android studio 33 | 2. Create an android virtual device 34 | 3. Boot the device 35 | 4. Download the hevy app apk 36 | 5. Download apk-mitm 37 | 6. Patch the apk as described on [apk-mitm](https://www.npmjs.com/package/apk-mitm/) 38 | 7. Install charles proxy 39 | 8. Install the certificate and setup the proxy on the android device as described here: 40 | https://blog.logrocket.com/test-debug-android-apps-with-charles-web-proxy/ 41 | 9. Using android studio upload the patched APK to the android device and then install it 42 | 10. open hevy app and login 43 | 44 | Hevy should use the proxy with the previously installed certificate and in charles you can now see the decrypted https requests. -------------------------------------------------------------------------------- /api/new-routine.md: -------------------------------------------------------------------------------- 1 | ## New routine 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'accept': 'application/json, text/plain, */*', 10 | 'x-api-key': 'klean_kanteen_insulated', 11 | 'auth-token': '.......-.....-....-....-.............', 12 | 'Content-Type': 'application/json', 13 | 'Host': 'api.hevyapp.com', 14 | 'User-Agent': 'okhttp/4.9.3', 15 | 'Pragma': 'no-cache', 16 | 'Cache-Control': 'no-cache', 17 | } 18 | 19 | json_data = { 20 | 'routine': { 21 | 'title': '2. Quads/Calves', 22 | 'folder_id': None, 23 | 'index': -1, 24 | 'exercises': [ 25 | { 26 | 'exercise_template_id': '3303376C', 27 | 'notes': '', 28 | 'sets': [ 29 | { 30 | 'index': 0, 31 | 'indicator': 'normal', 32 | 'distance_meters': 0, 33 | 'duration_seconds': 15, 34 | }, 35 | ], 36 | 'rest_seconds': 0, 37 | }, 38 | { 39 | 'exercise_template_id': '062AB91A', 40 | 'notes': '', 41 | 'sets': [ 42 | { 43 | 'index': 0, 44 | 'indicator': 'normal', 45 | 'weight_kg': 86, 46 | 'reps': 8, 47 | }, 48 | { 49 | 'index': 1, 50 | 'indicator': 'normal', 51 | 'weight_kg': 81, 52 | 'reps': 8, 53 | }, 54 | { 55 | 'index': 2, 56 | 'indicator': 'normal', 57 | 'weight_kg': 76, 58 | 'reps': 8, 59 | }, 60 | ], 61 | 'rest_seconds': 120, 62 | }, 63 | { 64 | 'exercise_template_id': '75A4F6C4', 65 | 'notes': '', 66 | 'sets': [ 67 | { 68 | 'index': 0, 69 | 'indicator': 'normal', 70 | 'weight_kg': 69, 71 | 'reps': 8, 72 | }, 73 | { 74 | 'index': 1, 75 | 'indicator': 'normal', 76 | 'weight_kg': 69, 77 | 'reps': 8, 78 | }, 79 | { 80 | 'index': 2, 81 | 'indicator': 'normal', 82 | 'weight_kg': 69, 83 | 'reps': 8, 84 | }, 85 | ], 86 | 'rest_seconds': 120, 87 | }, 88 | ], 89 | 'program_id': None, 90 | }, 91 | } 92 | 93 | response = requests.post('https://api.hevyapp.com/routine', headers=headers, json=json_data) 94 | ``` 95 | 96 | ### response 97 | ``` 98 | 99 | ``` -------------------------------------------------------------------------------- /sample/2.workout-history.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | import requests 3 | from requests_toolbelt.utils import dump 4 | import os 5 | import sys 6 | import json 7 | 8 | 9 | class Hevy: 10 | def __init__(self): 11 | self.endpoint = "https://api.hevyapp.com" 12 | self.hevy_username = os.getenv("hevy_username") 13 | self.hevy_password = os.environ.get("hevy_password") 14 | self.request_no = 0 15 | 16 | if self.hevy_username is None: 17 | sys.exit(1) 18 | 19 | if self.hevy_password is None: 20 | sys.exit(2) 21 | 22 | self.headers = { 23 | "Accept": "application/json, text/plain, */*", 24 | "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", 25 | "Cache-Control": "no-cache", 26 | "Connection": "keep-alive", 27 | "Content-Type": "application/json", 28 | "DNT": "1", 29 | "Origin": "https://www.hevy.com", 30 | "Pragma": "no-cache", 31 | "Referer": "https://www.hevy.com/", 32 | "Sec-Fetch-Dest": "empty", 33 | "Sec-Fetch-Mode": "cors", 34 | "Sec-Fetch-Site": "cross-site", 35 | "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", 36 | "sec-ch-ua": '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 37 | "sec-ch-ua-mobile": "?0", 38 | "sec-ch-ua-platform": '"Linux"', 39 | "x-api-key": "shelobs_hevy_web", 40 | } 41 | 42 | def WebRequest(self, method, query, data=None): 43 | self.request_no += 1 44 | print("==================" + str(self.request_no) + "===================") 45 | 46 | if method == "POST": 47 | self.response = requests.post( 48 | self.endpoint + query, json=data, headers=self.headers 49 | ) 50 | else: 51 | self.response = requests.get(self.endpoint + query, headers=self.headers) 52 | 53 | data = dump.dump_all(self.response) 54 | print(data.decode("utf-8")) 55 | 56 | print(self.response.status_code) 57 | pprint(self.response.text) 58 | 59 | def Login(self): 60 | data = {} 61 | data["password"] = self.hevy_password 62 | data["emailOrUsername"] = self.hevy_username 63 | 64 | self.WebRequest("POST", "/login", data) 65 | 66 | self.headers["x-api-key"] = "klean_kanteen_insulated" 67 | self.headers["auth-token"] = self.response.json()["auth_token"] 68 | 69 | def GetUser(self): 70 | self.WebRequest("GET", "/account") 71 | 72 | def GetWorkouts(self): 73 | all_workouts = [] 74 | workouts = [] 75 | cache_file = "workouts.json" 76 | 77 | if os.path.isfile(cache_file): 78 | with open(cache_file) as f: 79 | return json.loads(f.read()) 80 | 81 | self.WebRequest("GET", "/workouts_batch/0") 82 | workouts = self.response.json() 83 | all_workouts += workouts 84 | 85 | while len(workouts) == 20: 86 | self.WebRequest("GET", "/workouts_batch/" + str(workouts[19]["index"])) 87 | workouts = self.response.json() 88 | all_workouts += workouts 89 | 90 | with open(cache_file, "w") as file1: 91 | file1.write(json.dumps(all_workouts)) 92 | file1.close() 93 | 94 | def GetWorkOutsCount(self): 95 | self.WebRequest("GET", "/workout_count") 96 | 97 | 98 | s = Hevy() 99 | s.Login() 100 | s.GetUser() 101 | s.GetWorkouts() 102 | s.GetWorkOutsCount() 103 | -------------------------------------------------------------------------------- /sample/3.create-charts.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import pandas as pd 3 | import json 4 | 5 | path = "graphs/" 6 | 7 | plt.style.use( 8 | "https://github.com/dhaitz/matplotlib-stylesheets/raw/master/pitayasmoothie-dark.mplstyle" 9 | ) 10 | 11 | stats = { 12 | "skip": { 13 | "date": { 14 | "total_volume": "(kilo * reps) + set", 15 | "total_reps": "add up all repos from each set", 16 | "max_weight": "max", 17 | "average_weight": "average", 18 | "median": "", 19 | } 20 | } 21 | } 22 | 23 | del stats["skip"] 24 | 25 | names = [] 26 | workout_time = {} 27 | workout_volume = {} 28 | 29 | workouts = open("workouts.json").read() 30 | wos = json.loads(workouts) 31 | 32 | for X in wos: 33 | index = X["nth_workout"] 34 | name = X["name"] 35 | names.append(name.replace(" ", "")) 36 | workout_time[index] = round((X["end_time"] - X["start_time"]) / 60) 37 | workout_volume[index] = round(X["estimated_volume_kg"]) 38 | 39 | for exercise in X["exercises"]: 40 | exercise_title = exercise["title"] 41 | 42 | if exercise_title not in stats.keys(): 43 | stats[exercise_title] = {} 44 | 45 | volume = 0 46 | max = 0 47 | reps = 0 48 | 49 | for set in exercise["sets"]: 50 | if set["weight_kg"] is not None and set["reps"] is not None: 51 | volume += round(set["weight_kg"] * set["reps"]) 52 | else: 53 | volume += 0 54 | 55 | reps += set["reps"] if set["reps"] is not None else 0 56 | 57 | if set["weight_kg"] is not None: 58 | max = set["weight_kg"] if set["weight_kg"] > max else max 59 | 60 | stats[exercise_title][index] = {} 61 | stats[exercise_title][index]["total_volume"] = round(volume) 62 | stats[exercise_title][index]["max_weight"] = max 63 | stats[exercise_title][index]["total_reps"] = reps 64 | stats[exercise_title][index]["average_weight"] = reps 65 | 66 | 67 | for exercise in stats.keys(): 68 | if len(list(stats[exercise].keys())) < 10: 69 | continue 70 | if all(x["total_volume"] == 0 for x in stats[exercise].values()): 71 | continue 72 | 73 | pdate = list(stats[exercise].keys()) 74 | pdate = pdate[len(pdate) - 20 :] if len(pdate) > 19 else pdate 75 | pvolume = [x["total_volume"] for x in stats[exercise].values()] 76 | pvolume = pvolume[len(pvolume) - 20 :] if len(pvolume) > 19 else pvolume 77 | 78 | data = {"date": pdate, "volume": pvolume} 79 | 80 | df = pd.DataFrame(data) 81 | plt.figure() 82 | plt.plot(df["date"], df["volume"], color="red", marker="o") 83 | plt.title(exercise + " volume", fontsize=14) 84 | plt.xlabel("Date", fontsize=12) 85 | plt.ylabel("Kilos", fontsize=12) 86 | plt.xticks(rotation=45, ha="right") 87 | plt.grid(True) 88 | # plt.show() 89 | plt.savefig(path + exercise + "-volume.png", bbox_inches="tight") 90 | plt.close() 91 | 92 | 93 | for exercise in stats.keys(): 94 | if len(list(stats[exercise].keys())) < 10: 95 | continue 96 | if all(x["total_reps"] == 0 for x in stats[exercise].values()): 97 | continue 98 | 99 | pdate = list(stats[exercise].keys()) 100 | pdate = pdate[len(pdate) - 20 :] if len(pdate) > 19 else pdate 101 | preps = [x["total_reps"] for x in stats[exercise].values()] 102 | preps = preps[len(preps) - 20 :] if len(preps) > 19 else preps 103 | 104 | data = {"date": pdate, "reps": preps} 105 | 106 | df = pd.DataFrame(data) 107 | plt.figure() 108 | plt.plot(df["date"], df["reps"], color="red", marker="o") 109 | plt.title(exercise + " reps", fontsize=14) 110 | plt.xlabel("Date", fontsize=12) 111 | plt.ylabel("Reps", fontsize=12) 112 | plt.xticks(rotation=45, ha="right") 113 | plt.grid(True) 114 | # plt.show() 115 | plt.savefig(path + exercise + "-reps.png", bbox_inches="tight") 116 | plt.close() 117 | 118 | 119 | for exercise in stats.keys(): 120 | if len(list(stats[exercise].keys())) < 10: 121 | continue 122 | if all(x["max_weight"] == 0 for x in stats[exercise].values()): 123 | continue 124 | 125 | pdate = list(stats[exercise].keys()) 126 | pdate = pdate[len(pdate) - 20 :] if len(pdate) > 19 else pdate 127 | pweight = [x["max_weight"] for x in stats[exercise].values()] 128 | pweight = pweight[len(pweight) - 20 :] if len(pweight) > 19 else pweight 129 | 130 | data = {"date": pdate, "weight": pweight} 131 | 132 | df = pd.DataFrame(data) 133 | plt.figure() 134 | plt.plot(df["date"], df["weight"], color="red", marker="o") 135 | plt.title(exercise + " max weight", fontsize=14) 136 | plt.xlabel("Date", fontsize=12) 137 | plt.ylabel("Kilos", fontsize=12) 138 | plt.xticks(rotation=45, ha="right") 139 | plt.grid(True) 140 | # plt.show() 141 | plt.savefig(path + exercise + "-weight.png", bbox_inches="tight") 142 | plt.close() 143 | -------------------------------------------------------------------------------- /sample/5.chart.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | My Hevy Stats 5 | 6 | 7 |
8 |
9 | 10 | 11 | 147 | 148 | -------------------------------------------------------------------------------- /api/update-routine.md: -------------------------------------------------------------------------------- 1 | ## Update routine 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'accept': 'application/json, text/plain, */*', 10 | 'x-api-key': 'klean_kanteen_insulated', 11 | 'auth-token': '.......-.....-....-....-.............', 12 | 'Content-Type': 'application/json', 13 | 'Host': 'api.hevyapp.com', 14 | 'User-Agent': 'okhttp/4.9.3', 15 | 'Pragma': 'no-cache', 16 | 'Cache-Control': 'no-cache', 17 | } 18 | 19 | json_data = { 20 | 'routine': { 21 | 'title': '1. Shoulders/Lats', 22 | 'folder_id': None, 23 | 'index': -1, 24 | 'exercises': [ 25 | { 26 | 'exercise_template_id': '3303376C', 27 | 'notes': '', 28 | 'sets': [ 29 | { 30 | 'index': 0, 31 | 'indicator': 'normal', 32 | 'distance_meters': 0, 33 | 'duration_seconds': 15, 34 | }, 35 | ], 36 | 'rest_seconds': 0, 37 | }, 38 | { 39 | 'exercise_template_id': '67280085', 40 | 'notes': '', 41 | 'sets': [ 42 | { 43 | 'index': 0, 44 | 'indicator': 'normal', 45 | 'weight_kg': 35, 46 | 'reps': 8, 47 | }, 48 | { 49 | 'index': 1, 50 | 'indicator': 'normal', 51 | 'weight_kg': 35, 52 | 'reps': 8, 53 | }, 54 | { 55 | 'index': 2, 56 | 'indicator': 'normal', 57 | 'weight_kg': 35, 58 | 'reps': 8, 59 | }, 60 | ], 61 | 'rest_seconds': 0, 62 | }, 63 | { 64 | 'exercise_template_id': 'F1E57334', 65 | 'notes': '', 66 | 'sets': [ 67 | { 68 | 'index': 0, 69 | 'indicator': 'normal', 70 | 'weight_kg': 40, 71 | 'reps': 8, 72 | }, 73 | { 74 | 'index': 1, 75 | 'indicator': 'normal', 76 | 'weight_kg': 40, 77 | 'reps': 8, 78 | }, 79 | { 80 | 'index': 2, 81 | 'indicator': 'normal', 82 | 'weight_kg': 40, 83 | 'reps': 8, 84 | }, 85 | ], 86 | 'rest_seconds': 0, 87 | }, 88 | { 89 | 'exercise_template_id': '3601968B', 90 | 'notes': '', 91 | 'sets': [ 92 | { 93 | 'index': 0, 94 | 'indicator': 'normal', 95 | 'weight_kg': 50, 96 | 'reps': 8, 97 | }, 98 | { 99 | 'index': 1, 100 | 'indicator': 'normal', 101 | 'weight_kg': 50, 102 | 'reps': 8, 103 | }, 104 | { 105 | 'index': 2, 106 | 'indicator': 'normal', 107 | 'weight_kg': 50, 108 | 'reps': 8, 109 | }, 110 | ], 111 | 'rest_seconds': 0, 112 | }, 113 | { 114 | 'exercise_template_id': 'F1D60854', 115 | 'notes': '', 116 | 'sets': [ 117 | { 118 | 'index': 0, 119 | 'indicator': 'normal', 120 | 'weight_kg': 91, 121 | 'reps': 8, 122 | }, 123 | { 124 | 'index': 1, 125 | 'indicator': 'normal', 126 | 'weight_kg': 91, 127 | 'reps': 8, 128 | }, 129 | { 130 | 'index': 2, 131 | 'indicator': 'normal', 132 | 'weight_kg': 91, 133 | 'reps': 8, 134 | }, 135 | ], 136 | 'rest_seconds': 0, 137 | }, 138 | { 139 | 'exercise_template_id': '36E8F14E', 140 | 'notes': '', 141 | 'sets': [ 142 | { 143 | 'index': 0, 144 | 'indicator': 'normal', 145 | 'weight_kg': 50, 146 | 'reps': 8, 147 | }, 148 | { 149 | 'index': 1, 150 | 'indicator': 'normal', 151 | 'weight_kg': 50, 152 | 'reps': 8, 153 | }, 154 | { 155 | 'index': 2, 156 | 'indicator': 'normal', 157 | 'weight_kg': 50, 158 | 'reps': 8, 159 | }, 160 | ], 161 | 'rest_seconds': 0, 162 | }, 163 | { 164 | 'exercise_template_id': '6A6C31A5', 165 | 'notes': '', 166 | 'sets': [ 167 | { 168 | 'index': 0, 169 | 'indicator': 'normal', 170 | 'weight_kg': 68, 171 | 'reps': 8, 172 | }, 173 | { 174 | 'index': 1, 175 | 'indicator': 'normal', 176 | 'weight_kg': 68, 177 | 'reps': 8, 178 | }, 179 | { 180 | 'index': 2, 181 | 'indicator': 'normal', 182 | 'weight_kg': 68, 183 | 'reps': 8, 184 | }, 185 | ], 186 | 'rest_seconds': 0, 187 | }, 188 | { 189 | 'exercise_template_id': '08A2974E', 190 | 'notes': '', 191 | 'sets': [ 192 | { 193 | 'index': 0, 194 | 'indicator': 'normal', 195 | 'weight_kg': 25, 196 | 'reps': 8, 197 | }, 198 | { 199 | 'index': 1, 200 | 'indicator': 'normal', 201 | 'weight_kg': 25, 202 | 'reps': 8, 203 | }, 204 | { 205 | 'index': 2, 206 | 'indicator': 'normal', 207 | 'weight_kg': 25, 208 | 'reps': 8, 209 | }, 210 | ], 211 | 'rest_seconds': 0, 212 | }, 213 | { 214 | 'exercise_template_id': 'BC10A922', 215 | 'notes': '', 216 | 'sets': [ 217 | { 218 | 'index': 0, 219 | 'indicator': 'normal', 220 | 'reps': 8, 221 | }, 222 | { 223 | 'index': 1, 224 | 'indicator': 'normal', 225 | 'reps': 8, 226 | }, 227 | { 228 | 'index': 2, 229 | 'indicator': 'normal', 230 | 'reps': 8, 231 | }, 232 | ], 233 | 'rest_seconds': 0, 234 | }, 235 | { 236 | 'exercise_template_id': 'F8356514', 237 | 'notes': '', 238 | 'sets': [ 239 | { 240 | 'index': 0, 241 | 'indicator': 'normal', 242 | 'reps': 8, 243 | }, 244 | { 245 | 'index': 1, 246 | 'indicator': 'normal', 247 | 'reps': 8, 248 | }, 249 | { 250 | 'index': 2, 251 | 'indicator': 'normal', 252 | 'reps': 8, 253 | }, 254 | ], 255 | 'rest_seconds': 0, 256 | }, 257 | { 258 | 'exercise_template_id': '09C9F635', 259 | 'notes': '', 260 | 'sets': [ 261 | { 262 | 'index': 0, 263 | 'indicator': 'normal', 264 | 'reps': 8, 265 | }, 266 | { 267 | 'index': 1, 268 | 'indicator': 'normal', 269 | 'reps': 8, 270 | }, 271 | { 272 | 'index': 2, 273 | 'indicator': 'normal', 274 | 'reps': 8, 275 | }, 276 | ], 277 | 'rest_seconds': 0, 278 | }, 279 | ], 280 | 'program_id': None, 281 | }, 282 | } 283 | 284 | response = requests.put('https://api.hevyapp.com/routine/89db8e68-e28b-4ce6-b8fe-aef4b236db21', headers=headers, json=json_data) 285 | ``` 286 | 287 | ### response 288 | ``` 289 | 290 | ``` -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /api/routines_sync_batch.md: -------------------------------------------------------------------------------- 1 | ## Feed workouts paged 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'accept': 'application/json, text/plain, */*', 10 | 'x-api-key': 'klean_kanteen_insulated', 11 | 'auth-token': '.......-.....-....-....-.............', 12 | 'Host': 'api.hevyapp.com', 13 | 'User-Agent': 'okhttp/4.9.3', 14 | 'Pragma': 'no-cache', 15 | 'Cache-Control': 'no-cache', 16 | } 17 | 18 | json_data = {} 19 | 20 | response = requests.post('https://api.hevyapp.com/routines_sync_batch', headers=headers, json=json_data) 21 | 22 | ``` 23 | 24 | ### response 25 | ``` 26 | { 27 | "updated": [{ 28 | "id": "89db8e68-e28b-4ce6-b8fe-aef4b236db21", 29 | "title": "Shoulders/Lats", 30 | "username": "ssssssssssss", 31 | "profile_pic": null, 32 | "exercises": [{ 33 | "id": "de57c53e-387b-4120-9c5d-13b3e4b5f97a", 34 | "username": "hevy", 35 | "exercise_template_id": "3303376C", 36 | "warmup_set_count": 0, 37 | "normal_set_count": 0, 38 | "title": "Elliptical Trainer", 39 | "es_title": "Entrenador Elíptico", 40 | "de_title": "Crosstrainer", 41 | "fr_title": "Vélo Elliptique", 42 | "it_title": "Ellittica", 43 | "pt_title": "Elíptica ", 44 | "ko_title": null, 45 | "ja_title": null, 46 | "tr_title": "Eliptik Bisiklet", 47 | "ru_title": null, 48 | "zh_cn_title": null, 49 | "zh_tw_title": null, 50 | "muscle_group": "cardio", 51 | "other_muscles": [], 52 | "exercise_type": "distance_duration", 53 | "equipment_category": "machine", 54 | "sets": [{ 55 | "id": 411889220, 56 | "index": 0, 57 | "indicator": "normal", 58 | "weight_kg": null, 59 | "reps": null, 60 | "distance_meters": null, 61 | "duration_seconds": 15 62 | }], 63 | "notes": "", 64 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/21921201-Elliptical-Machine-Walk_Cardio.mp4", 65 | "custom_exercise_image_url": null, 66 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/21921201-Elliptical-Machine-Walk_Cardio_thumbnail@3x.jpg", 67 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/21921201-Elliptical-Machine-Walk_Cardio_thumbnail@3x.jpg", 68 | "media_type": "video", 69 | "superset_id": null, 70 | "rest_seconds": 0 71 | }, { 72 | "id": "1d5097f0-0b19-48e6-9938-a44eb7827c12", 73 | "username": "hevy", 74 | "exercise_template_id": "67280085", 75 | "warmup_set_count": 0, 76 | "normal_set_count": 0, 77 | "title": "Pullover (Dumbbell)", 78 | "es_title": "Pull Over", 79 | "de_title": "Überzüge", 80 | "fr_title": "Pull-Over", 81 | "it_title": "Pullover (Manubrio)", 82 | "pt_title": "Pullover (Haltere)", 83 | "ko_title": null, 84 | "ja_title": null, 85 | "tr_title": "Pullover (Dambıl)", 86 | "ru_title": null, 87 | "zh_cn_title": null, 88 | "zh_tw_title": null, 89 | "muscle_group": "chest", 90 | "other_muscles": [], 91 | "exercise_type": "weight_reps", 92 | "equipment_category": "dumbbell", 93 | "sets": [{ 94 | "id": 411889221, 95 | "index": 0, 96 | "indicator": "normal", 97 | "weight_kg": 35, 98 | "reps": 8, 99 | "distance_meters": null, 100 | "duration_seconds": null 101 | }, { 102 | "id": 411889222, 103 | "index": 1, 104 | "indicator": "normal", 105 | "weight_kg": 35, 106 | "reps": 8, 107 | "distance_meters": null, 108 | "duration_seconds": null 109 | }, { 110 | "id": 411889223, 111 | "index": 2, 112 | "indicator": "normal", 113 | "weight_kg": 35, 114 | "reps": 8, 115 | "distance_meters": null, 116 | "duration_seconds": null 117 | }], 118 | "notes": "", 119 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/03751201-Dumbbell-Pullover_Chest.mp4", 120 | "custom_exercise_image_url": null, 121 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03751201-Dumbbell-Pullover_Chest_thumbnail@3x.jpg", 122 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03751201-Dumbbell-Pullover_Chest_thumbnail@3x.jpg", 123 | "media_type": "video", 124 | "superset_id": null, 125 | "rest_seconds": 0 126 | }, { 127 | "id": "2cf306ae-681f-4fa9-93e5-25c3df3eb495", 128 | "username": "hevy", 129 | "exercise_template_id": "F1E57334", 130 | "warmup_set_count": 0, 131 | "normal_set_count": 0, 132 | "title": "Dumbbell Row", 133 | "es_title": "Remo con Mancuerna", 134 | "de_title": "Kurzhantel Rudern", 135 | "fr_title": "Rowing Haltère", 136 | "it_title": "Rematore Manubrio", 137 | "pt_title": "Remada (Haltere)", 138 | "ko_title": null, 139 | "ja_title": null, 140 | "tr_title": "Dumbbell Row", 141 | "ru_title": null, 142 | "zh_cn_title": null, 143 | "zh_tw_title": null, 144 | "muscle_group": "upper_back", 145 | "other_muscles": [], 146 | "exercise_type": "weight_reps", 147 | "equipment_category": "dumbbell", 148 | "sets": [{ 149 | "id": 411889224, 150 | "index": 0, 151 | "indicator": "normal", 152 | "weight_kg": 40, 153 | "reps": 8, 154 | "distance_meters": null, 155 | "duration_seconds": null 156 | }, { 157 | "id": 411889225, 158 | "index": 1, 159 | "indicator": "normal", 160 | "weight_kg": 40, 161 | "reps": 8, 162 | "distance_meters": null, 163 | "duration_seconds": null 164 | }, { 165 | "id": 411889226, 166 | "index": 2, 167 | "indicator": "normal", 168 | "weight_kg": 40, 169 | "reps": 8, 170 | "distance_meters": null, 171 | "duration_seconds": null 172 | }], 173 | "notes": "", 174 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/02921201-Dumbbell-Bent-over-Row_Back.mp4", 175 | "custom_exercise_image_url": null, 176 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02921201-Dumbbell-Bent-over-Row_Back_thumbnail@3x.jpg", 177 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02921201-Dumbbell-Bent-over-Row_Back_thumbnail@3x.jpg", 178 | "media_type": "video", 179 | "superset_id": null, 180 | "rest_seconds": 0 181 | }, { 182 | "id": "9fdad100-a678-47c9-9534-7e4cf26634e4", 183 | "username": "hevy", 184 | "exercise_template_id": "3601968B", 185 | "warmup_set_count": 0, 186 | "normal_set_count": 0, 187 | "title": "Bench Press (Dumbbell)", 188 | "es_title": "Press de Banca (Mancuerna)", 189 | "de_title": "Bankdrücken (Kurzhantel)", 190 | "fr_title": "Développé Couché (Haltère)", 191 | "it_title": "Panca Piana (Manubrio)", 192 | "pt_title": "Supino (Haltere)", 193 | "ko_title": null, 194 | "ja_title": null, 195 | "tr_title": "Bench Press (Dambıl)", 196 | "ru_title": null, 197 | "zh_cn_title": null, 198 | "zh_tw_title": null, 199 | "muscle_group": "chest", 200 | "other_muscles": ["triceps", "shoulders"], 201 | "exercise_type": "weight_reps", 202 | "equipment_category": "dumbbell", 203 | "sets": [{ 204 | "id": 411889227, 205 | "index": 0, 206 | "indicator": "normal", 207 | "weight_kg": 50, 208 | "reps": 8, 209 | "distance_meters": null, 210 | "duration_seconds": null 211 | }, { 212 | "id": 411889228, 213 | "index": 1, 214 | "indicator": "normal", 215 | "weight_kg": 50, 216 | "reps": 8, 217 | "distance_meters": null, 218 | "duration_seconds": null 219 | }, { 220 | "id": 411889229, 221 | "index": 2, 222 | "indicator": "normal", 223 | "weight_kg": 50, 224 | "reps": 8, 225 | "distance_meters": null, 226 | "duration_seconds": null 227 | }], 228 | "notes": "", 229 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/02891201-Dumbbell-Bench-Press_Chest.mp4", 230 | "custom_exercise_image_url": null, 231 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02891201-Dumbbell-Bench-Press_Chest_thumbnail@3x.jpg", 232 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02891201-Dumbbell-Bench-Press_Chest_thumbnail@3x.jpg", 233 | "media_type": "video", 234 | "superset_id": null, 235 | "rest_seconds": 0 236 | }, { 237 | "id": "5dd12ecb-7226-4cf8-981f-7540643049e6", 238 | "username": "hevy", 239 | "exercise_template_id": "F1D60854", 240 | "warmup_set_count": 0, 241 | "normal_set_count": 0, 242 | "title": "Seated Cable Row", 243 | "es_title": "Remo Sentado con Cable", 244 | "de_title": "Rudern am Kabel sitzend", 245 | "fr_title": "Rowing Poulie Assis", 246 | "it_title": "Rematore al Cavo da Seduto", 247 | "pt_title": "Remada (Corda) Sentado", 248 | "ko_title": null, 249 | "ja_title": null, 250 | "tr_title": "Oturarak Cable Row", 251 | "ru_title": null, 252 | "zh_cn_title": null, 253 | "zh_tw_title": null, 254 | "muscle_group": "upper_back", 255 | "other_muscles": [], 256 | "exercise_type": "weight_reps", 257 | "equipment_category": "machine", 258 | "sets": [{ 259 | "id": 411889230, 260 | "index": 0, 261 | "indicator": "normal", 262 | "weight_kg": 91, 263 | "reps": 8, 264 | "distance_meters": null, 265 | "duration_seconds": null 266 | }, { 267 | "id": 411889231, 268 | "index": 1, 269 | "indicator": "normal", 270 | "weight_kg": 91, 271 | "reps": 8, 272 | "distance_meters": null, 273 | "duration_seconds": null 274 | }, { 275 | "id": 411889232, 276 | "index": 2, 277 | "indicator": "normal", 278 | "weight_kg": 91, 279 | "reps": 8, 280 | "distance_meters": null, 281 | "duration_seconds": null 282 | }], 283 | "notes": "", 284 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/01801201-Cable-Low-Seated-Row_Back.mp4", 285 | "custom_exercise_image_url": null, 286 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01801201-Cable-Low-Seated-Row_Back_thumbnail@3x.jpg", 287 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01801201-Cable-Low-Seated-Row_Back_thumbnail@3x.jpg", 288 | "media_type": "video", 289 | "superset_id": null, 290 | "rest_seconds": 0 291 | }, { 292 | "id": "96550a69-10a7-41e2-880e-81b947057532", 293 | "username": "hevy", 294 | "exercise_template_id": "36E8F14E", 295 | "warmup_set_count": 0, 296 | "normal_set_count": 0, 297 | "title": "Hammer Curl (Cable)", 298 | "es_title": "Curl Martillo (Cable)", 299 | "de_title": "Hammer Curl (Kabel)", 300 | "fr_title": "Curl Marteau (Poulie)", 301 | "it_title": "Bicipiti Martello (Cavo)", 302 | "pt_title": "Curl Em Martelo (Cabo)", 303 | "ko_title": null, 304 | "ja_title": null, 305 | "tr_title": "Hammer Curl (Cable)", 306 | "ru_title": null, 307 | "zh_cn_title": null, 308 | "zh_tw_title": null, 309 | "muscle_group": "biceps", 310 | "other_muscles": [], 311 | "exercise_type": "weight_reps", 312 | "equipment_category": "machine", 313 | "sets": [{ 314 | "id": 411889233, 315 | "index": 0, 316 | "indicator": "normal", 317 | "weight_kg": 50, 318 | "reps": 8, 319 | "distance_meters": null, 320 | "duration_seconds": null 321 | }, { 322 | "id": 411889234, 323 | "index": 1, 324 | "indicator": "normal", 325 | "weight_kg": 50, 326 | "reps": 8, 327 | "distance_meters": null, 328 | "duration_seconds": null 329 | }, { 330 | "id": 411889235, 331 | "index": 2, 332 | "indicator": "normal", 333 | "weight_kg": 50, 334 | "reps": 8, 335 | "distance_meters": null, 336 | "duration_seconds": null 337 | }], 338 | "notes": "", 339 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/01661201-Cable-Hammer-Curl_Forearm.mp4", 340 | "custom_exercise_image_url": null, 341 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01661201-Cable-Hammer-Curl_Forearm_thumbnail@3x.jpg", 342 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01661201-Cable-Hammer-Curl_Forearm_thumbnail@3x.jpg", 343 | "media_type": "video", 344 | "superset_id": null, 345 | "rest_seconds": 0 346 | }, { 347 | "id": "0afaa157-f653-4020-a979-d37344e335a9", 348 | "username": "hevy", 349 | "exercise_template_id": "6A6C31A5", 350 | "warmup_set_count": 0, 351 | "normal_set_count": 0, 352 | "title": "Lat Pulldown (Cable)", 353 | "es_title": "Jalón al Pecho (Cable)", 354 | "de_title": "Latzug (Kabel)", 355 | "fr_title": "Tirage Poitrine (Poulie)", 356 | "it_title": "Lat Pulldown (Cavo)", 357 | "pt_title": "Puxadas (Corda)", 358 | "ko_title": null, 359 | "ja_title": null, 360 | "tr_title": "Lat Pulldown (Cable)", 361 | "ru_title": null, 362 | "zh_cn_title": null, 363 | "zh_tw_title": null, 364 | "muscle_group": "lats", 365 | "other_muscles": [], 366 | "exercise_type": "weight_reps", 367 | "equipment_category": "machine", 368 | "sets": [{ 369 | "id": 411889236, 370 | "index": 0, 371 | "indicator": "normal", 372 | "weight_kg": 68, 373 | "reps": 8, 374 | "distance_meters": null, 375 | "duration_seconds": null 376 | }, { 377 | "id": 411889237, 378 | "index": 1, 379 | "indicator": "normal", 380 | "weight_kg": 68, 381 | "reps": 8, 382 | "distance_meters": null, 383 | "duration_seconds": null 384 | }, { 385 | "id": 411889238, 386 | "index": 2, 387 | "indicator": "normal", 388 | "weight_kg": 68, 389 | "reps": 8, 390 | "distance_meters": null, 391 | "duration_seconds": null 392 | }], 393 | "notes": "", 394 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/01501201-Cable-Bar-Lateral-Pulldown_Back.mp4", 395 | "custom_exercise_image_url": null, 396 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01501201-Cable-Bar-Lateral-Pulldown_Back_thumbnail@3x.jpg", 397 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01501201-Cable-Bar-Lateral-Pulldown_Back_thumbnail@3x.jpg", 398 | "media_type": "video", 399 | "superset_id": null, 400 | "rest_seconds": 0 401 | }, { 402 | "id": "f67c524c-49ac-4dca-93aa-f7605fd6abca", 403 | "username": "hevy", 404 | "exercise_template_id": "08A2974E", 405 | "warmup_set_count": 0, 406 | "normal_set_count": 0, 407 | "title": "T Bar Row", 408 | "es_title": "Remo en Punta", 409 | "de_title": "T-Bar Rudern", 410 | "fr_title": "Rowing Barre T", 411 | "it_title": "Rematore T Bar", 412 | "pt_title": "Remada T", 413 | "ko_title": null, 414 | "ja_title": null, 415 | "tr_title": "T Bar Row", 416 | "ru_title": null, 417 | "zh_cn_title": null, 418 | "zh_tw_title": null, 419 | "muscle_group": "upper_back", 420 | "other_muscles": [], 421 | "exercise_type": "weight_reps", 422 | "equipment_category": "barbell", 423 | "sets": [{ 424 | "id": 411889239, 425 | "index": 0, 426 | "indicator": "normal", 427 | "weight_kg": 25, 428 | "reps": 8, 429 | "distance_meters": null, 430 | "duration_seconds": null 431 | }, { 432 | "id": 411889240, 433 | "index": 1, 434 | "indicator": "normal", 435 | "weight_kg": 25, 436 | "reps": 8, 437 | "distance_meters": null, 438 | "duration_seconds": null 439 | }, { 440 | "id": 411889241, 441 | "index": 2, 442 | "indicator": "normal", 443 | "weight_kg": 25, 444 | "reps": 8, 445 | "distance_meters": null, 446 | "duration_seconds": null 447 | }], 448 | "notes": "", 449 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/06061201-Lever-T-bar-Row-(plate-loaded)_Back.mp4", 450 | "custom_exercise_image_url": null, 451 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/06061201-Lever-T-bar-Row-(plate-loaded)_Back_thumbnail@3x.jpg", 452 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/06061201-Lever-T-bar-Row-(plate-loaded)_Back_thumbnail@3x.jpg", 453 | "media_type": "video", 454 | "superset_id": null, 455 | "rest_seconds": 0 456 | }, { 457 | "id": "9ed1ae52-0b90-4389-8d7b-43341c6016c0", 458 | "username": "hevy", 459 | "exercise_template_id": "BC10A922", 460 | "warmup_set_count": 0, 461 | "normal_set_count": 0, 462 | "title": "Decline Crunch", 463 | "es_title": "Abdominal Corto en Banco Inclinado", 464 | "de_title": "Negativer Crunch", 465 | "fr_title": "Crunch Décliné", 466 | "it_title": "Crunch Declinato", 467 | "pt_title": "Abdominal Declinado", 468 | "ko_title": null, 469 | "ja_title": null, 470 | "tr_title": "Eğik Sehpada Yarım Mekik", 471 | "ru_title": null, 472 | "zh_cn_title": null, 473 | "zh_tw_title": null, 474 | "muscle_group": "abdominals", 475 | "other_muscles": [], 476 | "exercise_type": "reps_only", 477 | "equipment_category": "none", 478 | "sets": [{ 479 | "id": 411889242, 480 | "index": 0, 481 | "indicator": "normal", 482 | "weight_kg": null, 483 | "reps": 8, 484 | "distance_meters": null, 485 | "duration_seconds": null 486 | }, { 487 | "id": 411889243, 488 | "index": 1, 489 | "indicator": "normal", 490 | "weight_kg": null, 491 | "reps": 8, 492 | "distance_meters": null, 493 | "duration_seconds": null 494 | }, { 495 | "id": 411889244, 496 | "index": 2, 497 | "indicator": "normal", 498 | "weight_kg": null, 499 | "reps": 8, 500 | "distance_meters": null, 501 | "duration_seconds": null 502 | }], 503 | "notes": "", 504 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/02771201-Decline-Crunch_Waist.mp4", 505 | "custom_exercise_image_url": null, 506 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02771201-Decline-Crunch_Waist_thumbnail@3x.jpg", 507 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02771201-Decline-Crunch_Waist_thumbnail@3x.jpg", 508 | "media_type": "video", 509 | "superset_id": null, 510 | "rest_seconds": 0 511 | }, { 512 | "id": "84481e54-25e0-4709-aecd-42e13d699048", 513 | "username": "hevy", 514 | "exercise_template_id": "F8356514", 515 | "warmup_set_count": 0, 516 | "normal_set_count": 0, 517 | "title": "Hanging Leg Raise", 518 | "es_title": "Levantamiento de Piernas en Barra", 519 | "de_title": "Beinheben hängend", 520 | "fr_title": "Relevé de Jambes Suspendu", 521 | "it_title": "Leg Raise Appeso", 522 | "pt_title": "Elevação De Pernas Na Barra Fixa", 523 | "ko_title": null, 524 | "ja_title": null, 525 | "tr_title": "Hanging Leg Raise", 526 | "ru_title": null, 527 | "zh_cn_title": null, 528 | "zh_tw_title": null, 529 | "muscle_group": "abdominals", 530 | "other_muscles": [], 531 | "exercise_type": "reps_only", 532 | "equipment_category": "none", 533 | "sets": [{ 534 | "id": 411889245, 535 | "index": 0, 536 | "indicator": "normal", 537 | "weight_kg": null, 538 | "reps": 8, 539 | "distance_meters": null, 540 | "duration_seconds": null 541 | }, { 542 | "id": 411889246, 543 | "index": 1, 544 | "indicator": "normal", 545 | "weight_kg": null, 546 | "reps": 8, 547 | "distance_meters": null, 548 | "duration_seconds": null 549 | }, { 550 | "id": 411889247, 551 | "index": 2, 552 | "indicator": "normal", 553 | "weight_kg": null, 554 | "reps": 8, 555 | "distance_meters": null, 556 | "duration_seconds": null 557 | }], 558 | "notes": "", 559 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/17641201-Hanging-Leg-Hip-Raise_Waist.mp4", 560 | "custom_exercise_image_url": null, 561 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/17641201-Hanging-Leg-Hip-Raise_Waist_thumbnail@3x.jpg", 562 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/17641201-Hanging-Leg-Hip-Raise_Waist_thumbnail@3x.jpg", 563 | "media_type": "video", 564 | "superset_id": null, 565 | "rest_seconds": 0 566 | }, { 567 | "id": "de1632e3-cfa0-4642-86a4-5bd502f3ef6f", 568 | "username": "hevy", 569 | "exercise_template_id": "09C9F635", 570 | "warmup_set_count": 0, 571 | "normal_set_count": 0, 572 | "title": "Lying Leg Raise", 573 | "es_title": "Levantamiento de Piernas Tumbado", 574 | "de_title": "Liegendes Beinheben", 575 | "fr_title": "Relevé de Jambes Allongé", 576 | "it_title": "Leg Raise Sdraiato", 577 | "pt_title": "Elevação De Pernas (Deitado)", 578 | "ko_title": null, 579 | "ja_title": null, 580 | "tr_title": "Çakı Hareketi", 581 | "ru_title": null, 582 | "zh_cn_title": null, 583 | "zh_tw_title": null, 584 | "muscle_group": "abdominals", 585 | "other_muscles": [], 586 | "exercise_type": "reps_only", 587 | "equipment_category": "none", 588 | "sets": [{ 589 | "id": 411889248, 590 | "index": 0, 591 | "indicator": "normal", 592 | "weight_kg": null, 593 | "reps": 8, 594 | "distance_meters": null, 595 | "duration_seconds": null 596 | }, { 597 | "id": 411889249, 598 | "index": 1, 599 | "indicator": "normal", 600 | "weight_kg": null, 601 | "reps": 8, 602 | "distance_meters": null, 603 | "duration_seconds": null 604 | }, { 605 | "id": 411889250, 606 | "index": 2, 607 | "indicator": "normal", 608 | "weight_kg": null, 609 | "reps": 8, 610 | "distance_meters": null, 611 | "duration_seconds": null 612 | }], 613 | "notes": "", 614 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/11631201-Lying-Leg-Raise_Waist.mp4", 615 | "custom_exercise_image_url": null, 616 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11631201-Lying-Leg-Raise_Waist_thumbnail@3x.jpg", 617 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11631201-Lying-Leg-Raise_Waist_thumbnail@3x.jpg", 618 | "media_type": "video", 619 | "superset_id": null, 620 | "rest_seconds": 0 621 | }], 622 | "updated_at": "2023-03-05T20:34:31.432Z", 623 | "parent_routine_id": null, 624 | "index": null, 625 | "folder_id": null, 626 | "short_id": "O6hLrOcO8cb", 627 | "program_id": null 628 | }], 629 | "deleted": [], 630 | "isMore": false 631 | } 632 | ``` -------------------------------------------------------------------------------- /api/workouts_batch.md: -------------------------------------------------------------------------------- 1 | ## Feed workouts paged 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | all_workouts = [] 9 | workouts = [] 10 | 11 | headers = { 12 | 'accept': 'application/json, text/plain, */*', 13 | 'x-api-key': 'klean_kanteen_insulated', 14 | 'auth-token': '.......-.....-....-....-.............', 15 | 'Host': 'api.hevyapp.com', 16 | 'User-Agent': 'okhttp/4.9.3', 17 | 'Pragma': 'no-cache', 18 | 'Cache-Control': 'no-cache', 19 | } 20 | 21 | response = requests.get('https://api.hevyapp.com/workouts_batch/0', headers=headers) 22 | workouts = response.json() 23 | all_workouts += workouts 24 | 25 | while len(workouts) == 20: 26 | response = requests.get('https://api.hevyapp.com/workouts_batch/' + str(workouts[19].index), headers=headers) 27 | workouts = response.json() 28 | all_workouts += workouts 29 | 30 | pprint(all_workouts) 31 | 32 | ``` 33 | ### response 34 | 35 | ``` 36 | [ 37 | ..., 38 | ..., 39 | { 40 | "id": "70ba8b48-1525-4850-9902-219ba53bebe7", 41 | "short_id": "NVGtJMdNeQJ", 42 | "index": 12944844, 43 | "name": "Arm day dumbbell", 44 | "description": "Arms", 45 | "start_time": 1653042520, 46 | "end_time": 1653048880, 47 | "created_at": "2023-03-06T21:38:13.569Z", 48 | "updated_at": "2023-03-06T21:38:13.569Z", 49 | "apple_watch": false, 50 | "user_id": "93620a45-5bef-4a70-baab-5c1058a88046", 51 | "username": "bitwiseshift", 52 | "profile_image": "https://pump-app.s3.eu-west-2.amazonaws.com/profile-images/bitwiseshift-e4a12928-f0f3-4a87-adc5-99c1daae5951.jpg", 53 | "verified": false, 54 | "nth_workout": 20, 55 | "like_count": 0, 56 | "is_liked_by_user": false, 57 | "like_images": [], 58 | "comments": [], 59 | "comment_count": 0, 60 | "media": [], 61 | "image_urls": [], 62 | "exercises": [{ 63 | "id": "6b8b594e-60c7-4ae6-8e1b-03a2eaf748ef", 64 | "title": "Cycling", 65 | "es_title": "Bicicleta", 66 | "de_title": "Radfahren", 67 | "fr_title": "Cyclisme", 68 | "it_title": "Bicicletta", 69 | "pt_title": "Ciclismo", 70 | "ko_title": null, 71 | "ja_title": null, 72 | "tr_title": "Bisiklet", 73 | "ru_title": "Велоспорт", 74 | "zh_cn_title": "踩单车", 75 | "zh_tw_title": "踩單車", 76 | "superset_id": null, 77 | "rest_seconds": null, 78 | "notes": "", 79 | "exercise_template_id": "D8F7F851", 80 | "url": null, 81 | "exercise_type": "distance_duration", 82 | "equipment_category": "machine", 83 | "media_type": null, 84 | "custom_exercise_image_url": null, 85 | "custom_exercise_image_thumbnail_url": null, 86 | "thumbnail_url": null, 87 | "muscle_group": "cardio", 88 | "other_muscles": [], 89 | "priority": 0, 90 | "sets": [{ 91 | "id": 298257286, 92 | "index": 0, 93 | "indicator": "normal", 94 | "weight_kg": null, 95 | "reps": null, 96 | "distance_meters": 0, 97 | "duration_seconds": 22, 98 | "rpe": null, 99 | "prs": [], 100 | "personalRecords": [] 101 | }] 102 | }, { 103 | "id": "60c40ee1-8b09-4832-bc2c-0d5f9fc51c00", 104 | "title": "Incline Bench Press (Dumbbell)", 105 | "es_title": "Press de Banca Inclinado (Mancuerna)", 106 | "de_title": "Schrägbankdrücken (Kurzhantel)", 107 | "fr_title": "Développé Couché Incliné (Haltère)", 108 | "it_title": "Panca Inclinata (Manubrio)", 109 | "pt_title": "Supino Inclinado (Halter)", 110 | "ko_title": null, 111 | "ja_title": null, 112 | "tr_title": "Incline Bench Press (Dambıl)", 113 | "ru_title": "Жим в наклоне лежа (Гантель)", 114 | "zh_cn_title": "上斜推胸 (哑铃)", 115 | "zh_tw_title": "上斜推胸 (啞鈴)", 116 | "superset_id": null, 117 | "rest_seconds": null, 118 | "notes": "", 119 | "exercise_template_id": "07B38369", 120 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/03141201-Dumbbell-Incline-Bench-Press_Chest.mp4", 121 | "exercise_type": "weight_reps", 122 | "equipment_category": "dumbbell", 123 | "media_type": "video", 124 | "custom_exercise_image_url": null, 125 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03141201-Dumbbell-Incline-Bench-Press_Chest_thumbnail@3x.jpg", 126 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03141201-Dumbbell-Incline-Bench-Press_Chest_thumbnail@3x.jpg", 127 | "muscle_group": "chest", 128 | "other_muscles": ["triceps", "shoulders"], 129 | "priority": 10, 130 | "sets": [{ 131 | "id": 298257287, 132 | "index": 0, 133 | "indicator": "normal", 134 | "weight_kg": 45, 135 | "reps": 8, 136 | "distance_meters": null, 137 | "duration_seconds": null, 138 | "rpe": null, 139 | "prs": [{ 140 | "type": "best_weight", 141 | "value": 45 142 | }], 143 | "personalRecords": [{ 144 | "type": "best_weight", 145 | "value": 45 146 | }] 147 | }, { 148 | "id": 298257288, 149 | "index": 1, 150 | "indicator": "normal", 151 | "weight_kg": 45, 152 | "reps": 8, 153 | "distance_meters": null, 154 | "duration_seconds": null, 155 | "rpe": null, 156 | "prs": [], 157 | "personalRecords": [] 158 | }, { 159 | "id": 298257289, 160 | "index": 2, 161 | "indicator": "normal", 162 | "weight_kg": 45, 163 | "reps": 6, 164 | "distance_meters": null, 165 | "duration_seconds": null, 166 | "rpe": null, 167 | "prs": [], 168 | "personalRecords": [] 169 | }] 170 | }, { 171 | "id": "5b70b03f-10e9-4120-8acb-3fb52575b814", 172 | "title": "Bench Press (Dumbbell)", 173 | "es_title": "Press de Banca (Mancuerna)", 174 | "de_title": "Bankdrücken (Kurzhantel)", 175 | "fr_title": "Développé Couché (Haltère)", 176 | "it_title": "Panca Piana (Manubrio)", 177 | "pt_title": "Supino (Halter)", 178 | "ko_title": null, 179 | "ja_title": null, 180 | "tr_title": "Bench Press (Dambıl)", 181 | "ru_title": "Жима лежа (Гантель)", 182 | "zh_cn_title": "卧推 (哑铃)", 183 | "zh_tw_title": "臥推 (啞鈴)", 184 | "superset_id": null, 185 | "rest_seconds": null, 186 | "notes": "", 187 | "exercise_template_id": "3601968B", 188 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/02891201-Dumbbell-Bench-Press_Chest.mp4", 189 | "exercise_type": "weight_reps", 190 | "equipment_category": "dumbbell", 191 | "media_type": "video", 192 | "custom_exercise_image_url": null, 193 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02891201-Dumbbell-Bench-Press_Chest_thumbnail@3x.jpg", 194 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02891201-Dumbbell-Bench-Press_Chest_thumbnail@3x.jpg", 195 | "muscle_group": "chest", 196 | "other_muscles": ["triceps", "shoulders"], 197 | "priority": 9, 198 | "sets": [{ 199 | "id": 298257290, 200 | "index": 0, 201 | "indicator": "normal", 202 | "weight_kg": 35, 203 | "reps": 8, 204 | "distance_meters": null, 205 | "duration_seconds": null, 206 | "rpe": null, 207 | "prs": [], 208 | "personalRecords": [] 209 | }, { 210 | "id": 298257291, 211 | "index": 1, 212 | "indicator": "normal", 213 | "weight_kg": 40, 214 | "reps": 8, 215 | "distance_meters": null, 216 | "duration_seconds": null, 217 | "rpe": null, 218 | "prs": [], 219 | "personalRecords": [] 220 | }, { 221 | "id": 298257292, 222 | "index": 2, 223 | "indicator": "normal", 224 | "weight_kg": 40, 225 | "reps": 8, 226 | "distance_meters": null, 227 | "duration_seconds": null, 228 | "rpe": null, 229 | "prs": [], 230 | "personalRecords": [] 231 | }, { 232 | "id": 298257293, 233 | "index": 3, 234 | "indicator": "normal", 235 | "weight_kg": 45, 236 | "reps": 8, 237 | "distance_meters": null, 238 | "duration_seconds": null, 239 | "rpe": null, 240 | "prs": [], 241 | "personalRecords": [] 242 | }, { 243 | "id": 298257294, 244 | "index": 4, 245 | "indicator": "normal", 246 | "weight_kg": 45, 247 | "reps": 8, 248 | "distance_meters": null, 249 | "duration_seconds": null, 250 | "rpe": null, 251 | "prs": [], 252 | "personalRecords": [] 253 | }] 254 | }, { 255 | "id": "4cf87a7a-bacd-4e0a-a8ee-da85426b29f5", 256 | "title": "Dumbbell Row", 257 | "es_title": "Remo con Mancuerna", 258 | "de_title": "Kurzhantel Rudern", 259 | "fr_title": "Rowing Haltère", 260 | "it_title": "Rematore Manubrio", 261 | "pt_title": "Remada (Halter)", 262 | "ko_title": null, 263 | "ja_title": null, 264 | "tr_title": "Dumbbell Row", 265 | "ru_title": "Тяга гантелью", 266 | "zh_cn_title": "哑铃划船", 267 | "zh_tw_title": "啞鈴划船", 268 | "superset_id": null, 269 | "rest_seconds": null, 270 | "notes": "", 271 | "exercise_template_id": "F1E57334", 272 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/02921201-Dumbbell-Bent-over-Row_Back.mp4", 273 | "exercise_type": "weight_reps", 274 | "equipment_category": "dumbbell", 275 | "media_type": "video", 276 | "custom_exercise_image_url": null, 277 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02921201-Dumbbell-Bent-over-Row_Back_thumbnail@3x.jpg", 278 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02921201-Dumbbell-Bent-over-Row_Back_thumbnail@3x.jpg", 279 | "muscle_group": "upper_back", 280 | "other_muscles": [], 281 | "priority": 10, 282 | "sets": [{ 283 | "id": 298257295, 284 | "index": 0, 285 | "indicator": "normal", 286 | "weight_kg": 41, 287 | "reps": 8, 288 | "distance_meters": null, 289 | "duration_seconds": null, 290 | "rpe": null, 291 | "prs": [], 292 | "personalRecords": [] 293 | }, { 294 | "id": 298257296, 295 | "index": 1, 296 | "indicator": "normal", 297 | "weight_kg": 41, 298 | "reps": 8, 299 | "distance_meters": null, 300 | "duration_seconds": null, 301 | "rpe": null, 302 | "prs": [], 303 | "personalRecords": [] 304 | }, { 305 | "id": 298257297, 306 | "index": 2, 307 | "indicator": "normal", 308 | "weight_kg": 45, 309 | "reps": 8, 310 | "distance_meters": null, 311 | "duration_seconds": null, 312 | "rpe": null, 313 | "prs": [{ 314 | "type": "best_weight", 315 | "value": 45 316 | }], 317 | "personalRecords": [{ 318 | "type": "best_weight", 319 | "value": 45 320 | }] 321 | }, { 322 | "id": 298257298, 323 | "index": 3, 324 | "indicator": "normal", 325 | "weight_kg": 45, 326 | "reps": 8, 327 | "distance_meters": null, 328 | "duration_seconds": null, 329 | "rpe": null, 330 | "prs": [], 331 | "personalRecords": [] 332 | }, { 333 | "id": 298257299, 334 | "index": 4, 335 | "indicator": "normal", 336 | "weight_kg": 45, 337 | "reps": 8, 338 | "distance_meters": null, 339 | "duration_seconds": null, 340 | "rpe": null, 341 | "prs": [], 342 | "personalRecords": [] 343 | }, { 344 | "id": 298257300, 345 | "index": 5, 346 | "indicator": "normal", 347 | "weight_kg": 45, 348 | "reps": 8, 349 | "distance_meters": null, 350 | "duration_seconds": null, 351 | "rpe": null, 352 | "prs": [], 353 | "personalRecords": [] 354 | }, { 355 | "id": 298257301, 356 | "index": 6, 357 | "indicator": "normal", 358 | "weight_kg": 45, 359 | "reps": 8, 360 | "distance_meters": null, 361 | "duration_seconds": null, 362 | "rpe": null, 363 | "prs": [], 364 | "personalRecords": [] 365 | }, { 366 | "id": 298257302, 367 | "index": 7, 368 | "indicator": "normal", 369 | "weight_kg": 45, 370 | "reps": 8, 371 | "distance_meters": null, 372 | "duration_seconds": null, 373 | "rpe": null, 374 | "prs": [], 375 | "personalRecords": [] 376 | }, { 377 | "id": 298257303, 378 | "index": 8, 379 | "indicator": "normal", 380 | "weight_kg": 45, 381 | "reps": 8, 382 | "distance_meters": null, 383 | "duration_seconds": null, 384 | "rpe": null, 385 | "prs": [], 386 | "personalRecords": [] 387 | }, { 388 | "id": 298257304, 389 | "index": 9, 390 | "indicator": "normal", 391 | "weight_kg": 45, 392 | "reps": 8, 393 | "distance_meters": null, 394 | "duration_seconds": null, 395 | "rpe": null, 396 | "prs": [], 397 | "personalRecords": [] 398 | }] 399 | }, { 400 | "id": "81e50213-92a9-4d44-9bdc-beb26f6b7331", 401 | "title": "Front Raise (Dumbbell)", 402 | "es_title": "Elevacion Frontal (Mancuerna)", 403 | "de_title": "Frontheben (Kurzhantel)", 404 | "fr_title": "Élévation Frontale (Haltère)", 405 | "it_title": "Alzata Frontale (Manubrio)", 406 | "pt_title": "Elevação Frontal (Halter)", 407 | "ko_title": null, 408 | "ja_title": null, 409 | "tr_title": "Front Raise (Dambıl)", 410 | "ru_title": "Подъем перед собой (Гантель)", 411 | "zh_cn_title": "肩膀抬高 (哑铃)", 412 | "zh_tw_title": "肩膀抬高 (啞鈴)", 413 | "superset_id": null, 414 | "rest_seconds": null, 415 | "notes": "", 416 | "exercise_template_id": "8293E554", 417 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/03101201-Dumbbell-Front-Raise_Shoulders.mp4", 418 | "exercise_type": "weight_reps", 419 | "equipment_category": "dumbbell", 420 | "media_type": "video", 421 | "custom_exercise_image_url": null, 422 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03101201-Dumbbell-Front-Raise_Shoulders_thumbnail@3x.jpg", 423 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03101201-Dumbbell-Front-Raise_Shoulders_thumbnail@3x.jpg", 424 | "muscle_group": "shoulders", 425 | "other_muscles": [], 426 | "priority": 10, 427 | "sets": [{ 428 | "id": 298257305, 429 | "index": 0, 430 | "indicator": "normal", 431 | "weight_kg": 7.5, 432 | "reps": 8, 433 | "distance_meters": null, 434 | "duration_seconds": null, 435 | "rpe": null, 436 | "prs": [], 437 | "personalRecords": [] 438 | }, { 439 | "id": 298257306, 440 | "index": 1, 441 | "indicator": "normal", 442 | "weight_kg": 7.5, 443 | "reps": 8, 444 | "distance_meters": null, 445 | "duration_seconds": null, 446 | "rpe": null, 447 | "prs": [], 448 | "personalRecords": [] 449 | }, { 450 | "id": 298257307, 451 | "index": 2, 452 | "indicator": "normal", 453 | "weight_kg": 10, 454 | "reps": 8, 455 | "distance_meters": null, 456 | "duration_seconds": null, 457 | "rpe": null, 458 | "prs": [], 459 | "personalRecords": [] 460 | }, { 461 | "id": 298257308, 462 | "index": 3, 463 | "indicator": "normal", 464 | "weight_kg": 10, 465 | "reps": 8, 466 | "distance_meters": null, 467 | "duration_seconds": null, 468 | "rpe": null, 469 | "prs": [], 470 | "personalRecords": [] 471 | }, { 472 | "id": 298257309, 473 | "index": 4, 474 | "indicator": "normal", 475 | "weight_kg": 7.5, 476 | "reps": 8, 477 | "distance_meters": null, 478 | "duration_seconds": null, 479 | "rpe": null, 480 | "prs": [], 481 | "personalRecords": [] 482 | }, { 483 | "id": 298257310, 484 | "index": 5, 485 | "indicator": "normal", 486 | "weight_kg": 7.5, 487 | "reps": 8, 488 | "distance_meters": null, 489 | "duration_seconds": null, 490 | "rpe": null, 491 | "prs": [], 492 | "personalRecords": [] 493 | }, { 494 | "id": 298257311, 495 | "index": 6, 496 | "indicator": "normal", 497 | "weight_kg": 7.5, 498 | "reps": 8, 499 | "distance_meters": null, 500 | "duration_seconds": null, 501 | "rpe": null, 502 | "prs": [], 503 | "personalRecords": [] 504 | }, { 505 | "id": 298257312, 506 | "index": 7, 507 | "indicator": "normal", 508 | "weight_kg": 7.5, 509 | "reps": 8, 510 | "distance_meters": null, 511 | "duration_seconds": null, 512 | "rpe": null, 513 | "prs": [], 514 | "personalRecords": [] 515 | }, { 516 | "id": 298257313, 517 | "index": 8, 518 | "indicator": "normal", 519 | "weight_kg": 7.5, 520 | "reps": 4, 521 | "distance_meters": null, 522 | "duration_seconds": null, 523 | "rpe": null, 524 | "prs": [], 525 | "personalRecords": [] 526 | }, { 527 | "id": 298257314, 528 | "index": 9, 529 | "indicator": "normal", 530 | "weight_kg": 7.5, 531 | "reps": 4, 532 | "distance_meters": null, 533 | "duration_seconds": null, 534 | "rpe": null, 535 | "prs": [], 536 | "personalRecords": [] 537 | }] 538 | }, { 539 | "id": "897f9f44-3a61-4a8b-9b4e-62c359b0fea8", 540 | "title": "Lateral Raise (Dumbbell)", 541 | "es_title": "Elevacion Laterales (Mancuerna)", 542 | "de_title": "Seitheben (Kurzhantel)", 543 | "fr_title": "Élévation Latérale (Haltère)", 544 | "it_title": "Aperture Laterali (Manubrio)", 545 | "pt_title": "Elevação Lateral (Halter)", 546 | "ko_title": null, 547 | "ja_title": null, 548 | "tr_title": "Lateral Raise (Dambıl)", 549 | "ru_title": "Боковые подъемы (Гантель)", 550 | "zh_cn_title": "侧平举 (哑铃)", 551 | "zh_tw_title": "側平舉 (啞鈴)", 552 | "superset_id": null, 553 | "rest_seconds": null, 554 | "notes": "", 555 | "exercise_template_id": "422B08F1", 556 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/03341201-Dumbbell-Lateral-Raise_shoulder.mp4", 557 | "exercise_type": "weight_reps", 558 | "equipment_category": "dumbbell", 559 | "media_type": "video", 560 | "custom_exercise_image_url": null, 561 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03341201-Dumbbell-Lateral-Raise_shoulder_thumbnail@3x.jpg", 562 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03341201-Dumbbell-Lateral-Raise_shoulder_thumbnail@3x.jpg", 563 | "muscle_group": "shoulders", 564 | "other_muscles": [], 565 | "priority": 10, 566 | "sets": [{ 567 | "id": 298257315, 568 | "index": 0, 569 | "indicator": "normal", 570 | "weight_kg": 7.5, 571 | "reps": 8, 572 | "distance_meters": null, 573 | "duration_seconds": null, 574 | "rpe": null, 575 | "prs": [{ 576 | "type": "best_weight", 577 | "value": 7.5 578 | }], 579 | "personalRecords": [{ 580 | "type": "best_weight", 581 | "value": 7.5 582 | }] 583 | }, { 584 | "id": 298257316, 585 | "index": 1, 586 | "indicator": "normal", 587 | "weight_kg": 7.5, 588 | "reps": 8, 589 | "distance_meters": null, 590 | "duration_seconds": null, 591 | "rpe": null, 592 | "prs": [], 593 | "personalRecords": [] 594 | }, { 595 | "id": 298257317, 596 | "index": 2, 597 | "indicator": "normal", 598 | "weight_kg": 5, 599 | "reps": 10, 600 | "distance_meters": null, 601 | "duration_seconds": null, 602 | "rpe": null, 603 | "prs": [], 604 | "personalRecords": [] 605 | }, { 606 | "id": 298257318, 607 | "index": 3, 608 | "indicator": "normal", 609 | "weight_kg": 5, 610 | "reps": 10, 611 | "distance_meters": null, 612 | "duration_seconds": null, 613 | "rpe": null, 614 | "prs": [], 615 | "personalRecords": [] 616 | }, { 617 | "id": 298257319, 618 | "index": 4, 619 | "indicator": "normal", 620 | "weight_kg": 5, 621 | "reps": 8, 622 | "distance_meters": null, 623 | "duration_seconds": null, 624 | "rpe": null, 625 | "prs": [], 626 | "personalRecords": [] 627 | }, { 628 | "id": 298257320, 629 | "index": 5, 630 | "indicator": "normal", 631 | "weight_kg": 5, 632 | "reps": 8, 633 | "distance_meters": null, 634 | "duration_seconds": null, 635 | "rpe": null, 636 | "prs": [], 637 | "personalRecords": [] 638 | }] 639 | }, { 640 | "id": "b9067caf-7733-4e9a-bdf3-4607272eaf04", 641 | "title": "Pullover (Dumbbell)", 642 | "es_title": "Pull Over", 643 | "de_title": "Überzüge", 644 | "fr_title": "Pull-Over", 645 | "it_title": "Pullover (Manubrio)", 646 | "pt_title": "Pullover (Halter)", 647 | "ko_title": null, 648 | "ja_title": null, 649 | "tr_title": "Pullover (Dambıl)", 650 | "ru_title": "Пуловер (Гантель)", 651 | "zh_cn_title": "仰卧拉举(哑铃)", 652 | "zh_tw_title": "仰臥拉舉(啞鈴)", 653 | "superset_id": null, 654 | "rest_seconds": null, 655 | "notes": "", 656 | "exercise_template_id": "67280085", 657 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/03751201-Dumbbell-Pullover_Chest.mp4", 658 | "exercise_type": "weight_reps", 659 | "equipment_category": "dumbbell", 660 | "media_type": "video", 661 | "custom_exercise_image_url": null, 662 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03751201-Dumbbell-Pullover_Chest_thumbnail@3x.jpg", 663 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03751201-Dumbbell-Pullover_Chest_thumbnail@3x.jpg", 664 | "muscle_group": "chest", 665 | "other_muscles": [], 666 | "priority": 0, 667 | "sets": [{ 668 | "id": 298257321, 669 | "index": 0, 670 | "indicator": "normal", 671 | "weight_kg": 20, 672 | "reps": 8, 673 | "distance_meters": null, 674 | "duration_seconds": null, 675 | "rpe": null, 676 | "prs": [], 677 | "personalRecords": [] 678 | }, { 679 | "id": 298257322, 680 | "index": 1, 681 | "indicator": "normal", 682 | "weight_kg": 20, 683 | "reps": 8, 684 | "distance_meters": null, 685 | "duration_seconds": null, 686 | "rpe": null, 687 | "prs": [], 688 | "personalRecords": [] 689 | }, { 690 | "id": 298257323, 691 | "index": 2, 692 | "indicator": "normal", 693 | "weight_kg": 20, 694 | "reps": 8, 695 | "distance_meters": null, 696 | "duration_seconds": null, 697 | "rpe": null, 698 | "prs": [], 699 | "personalRecords": [] 700 | }, { 701 | "id": 298257324, 702 | "index": 3, 703 | "indicator": "normal", 704 | "weight_kg": 22.5, 705 | "reps": 8, 706 | "distance_meters": null, 707 | "duration_seconds": null, 708 | "rpe": null, 709 | "prs": [{ 710 | "type": "best_weight", 711 | "value": 22.5 712 | }], 713 | "personalRecords": [{ 714 | "type": "best_weight", 715 | "value": 22.5 716 | }] 717 | }, { 718 | "id": 298257325, 719 | "index": 4, 720 | "indicator": "normal", 721 | "weight_kg": 22.5, 722 | "reps": 4, 723 | "distance_meters": null, 724 | "duration_seconds": null, 725 | "rpe": null, 726 | "prs": [], 727 | "personalRecords": [] 728 | }] 729 | }, { 730 | "id": "7a80fd84-2fce-421e-8071-908b5e0f0546", 731 | "title": "Bicep Curl (Barbell)", 732 | "es_title": "Curl de Bicéps (Barra)", 733 | "de_title": "Bizepscurl (Langhantel)", 734 | "fr_title": "Curl Biceps (Barre)", 735 | "it_title": "Curl Bicipiti (Bilanciere)", 736 | "pt_title": "Rosca Direta (Barra)", 737 | "ko_title": null, 738 | "ja_title": null, 739 | "tr_title": "Bicep Curl (Bar)", 740 | "ru_title": "Сгибание на бицепс (Штанга)", 741 | "zh_cn_title": "二头弯举 (杠铃)", 742 | "zh_tw_title": "二頭彎舉(槓鈴)", 743 | "superset_id": null, 744 | "rest_seconds": null, 745 | "notes": "", 746 | "exercise_template_id": "A5AC6449", 747 | "url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/00311201-Barbell-Curl_Upper-Arms.mp4", 748 | "exercise_type": "weight_reps", 749 | "equipment_category": "barbell", 750 | "media_type": "video", 751 | "custom_exercise_image_url": null, 752 | "custom_exercise_image_thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/00311201-Barbell-Curl_Upper-Arms_thumbnail@3x.jpg", 753 | "thumbnail_url": "https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/00311201-Barbell-Curl_Upper-Arms_thumbnail@3x.jpg", 754 | "muscle_group": "biceps", 755 | "other_muscles": [], 756 | "priority": 10, 757 | "sets": [{ 758 | "id": 298257326, 759 | "index": 0, 760 | "indicator": "normal", 761 | "weight_kg": 25, 762 | "reps": 8, 763 | "distance_meters": null, 764 | "duration_seconds": null, 765 | "rpe": null, 766 | "prs": [{ 767 | "type": "best_weight", 768 | "value": 25 769 | }], 770 | "personalRecords": [{ 771 | "type": "best_weight", 772 | "value": 25 773 | }] 774 | }, { 775 | "id": 298257327, 776 | "index": 1, 777 | "indicator": "normal", 778 | "weight_kg": 25, 779 | "reps": 10, 780 | "distance_meters": null, 781 | "duration_seconds": null, 782 | "rpe": null, 783 | "prs": [], 784 | "personalRecords": [] 785 | }, { 786 | "id": 298257328, 787 | "index": 2, 788 | "indicator": "normal", 789 | "weight_kg": 25, 790 | "reps": 10, 791 | "distance_meters": null, 792 | "duration_seconds": null, 793 | "rpe": null, 794 | "prs": [], 795 | "personalRecords": [] 796 | }, { 797 | "id": 298257329, 798 | "index": 3, 799 | "indicator": "normal", 800 | "weight_kg": 25, 801 | "reps": 8, 802 | "distance_meters": null, 803 | "duration_seconds": null, 804 | "rpe": null, 805 | "prs": [], 806 | "personalRecords": [] 807 | }, { 808 | "id": 298257330, 809 | "index": 4, 810 | "indicator": "normal", 811 | "weight_kg": 25, 812 | "reps": 8, 813 | "distance_meters": null, 814 | "duration_seconds": null, 815 | "rpe": null, 816 | "prs": [], 817 | "personalRecords": [] 818 | }] 819 | }], 820 | "estimated_volume_kg": 8896 821 | }] 822 | ``` -------------------------------------------------------------------------------- /api/feed_workouts_paged.md: -------------------------------------------------------------------------------- 1 | ## Feed workouts paged 2 | 3 | ### request 4 | 5 | ``` 6 | import requests 7 | 8 | headers = { 9 | 'accept': 'application/json, text/plain, */*', 10 | 'x-api-key': 'klean_kanteen_insulated', 11 | 'auth-token': '.......-.....-....-....-.............', 12 | 'Host': 'api.hevyapp.com', 13 | 'User-Agent': 'okhttp/4.9.3', 14 | 'Pragma': 'no-cache', 15 | 'Cache-Control': 'no-cache', 16 | } 17 | 18 | response = requests.get('https://api.hevyapp.com/feed_workouts_paged', headers=headers) 19 | ``` 20 | 21 | ### response 22 | ``` 23 | { 24 | "workouts":[ 25 | { 26 | "id":"6c10fadc-5b5c-43f0-9b95-6c38caf99944", 27 | "short_id":"9zxJ5CLFduN", 28 | "index":13490647, 29 | "name":"4. Abs / Cardio", 30 | "description":"", 31 | "start_time":1678869822, 32 | "end_time":1678877371, 33 | "created_at":"2023-03-15T10:49:39.119Z", 34 | "updated_at":"2023-03-15T10:49:39.119Z", 35 | "routine_id":"81272c28-2788-41d0-892f-fc94803f6f48", 36 | "apple_watch":false, 37 | "user_id":"93620a45-5bef-4a70-baab-5c1058a88046", 38 | "username":"bitwiseshift", 39 | "profile_image":"https://pump-app.s3.eu-west-2.amazonaws.com/profile-images/bitwiseshift-e4a12928-f0f3-4a87-adc5-99c1daae5951.jpg", 40 | "verified":false, 41 | "nth_workout":181, 42 | "like_count":0, 43 | "is_liked_by_user":false, 44 | "like_images":[ 45 | 46 | ], 47 | "comments":[ 48 | 49 | ], 50 | "comment_count":0, 51 | "media":[ 52 | 53 | ], 54 | "image_urls":[ 55 | 56 | ], 57 | "exercises":[ 58 | { 59 | "id":"2918c5ad-f313-41b6-8a60-a91b40049b91", 60 | "title":"Elliptical Trainer", 61 | "es_title":"Entrenador Elíptico", 62 | "de_title":"Crosstrainer", 63 | "fr_title":"Vélo Elliptique", 64 | "it_title":"Ellittica", 65 | "pt_title":"Elíptico", 66 | "ko_title":null, 67 | "ja_title":null, 68 | "tr_title":"Eliptik Bisiklet", 69 | "ru_title":"Эллиптический тренажер", 70 | "zh_cn_title":"椭圆机", 71 | "zh_tw_title":"橢圓機", 72 | "superset_id":null, 73 | "rest_seconds":120, 74 | "notes":"", 75 | "exercise_template_id":"3303376C", 76 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/21921201-Elliptical-Machine-Walk_Cardio.mp4", 77 | "exercise_type":"distance_duration", 78 | "equipment_category":"machine", 79 | "media_type":"video", 80 | "custom_exercise_image_url":null, 81 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/21921201-Elliptical-Machine-Walk_Cardio_thumbnail@3x.jpg", 82 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/21921201-Elliptical-Machine-Walk_Cardio_thumbnail@3x.jpg", 83 | "muscle_group":"cardio", 84 | "other_muscles":[ 85 | 86 | ], 87 | "priority":8, 88 | "sets":[ 89 | { 90 | "id":310860050, 91 | "index":0, 92 | "indicator":"normal", 93 | "weight_kg":null, 94 | "reps":null, 95 | "distance_meters":0, 96 | "duration_seconds":15, 97 | "rpe":null, 98 | "prs":[ 99 | 100 | ], 101 | "personalRecords":[ 102 | 103 | ] 104 | } 105 | ] 106 | }, 107 | { 108 | "id":"95c7dfa9-5ca9-4bf6-8494-02e4f3d56eff", 109 | "title":"Hanging Leg Raise", 110 | "es_title":"Levantamiento de Piernas en Barra", 111 | "de_title":"Beinheben hängend", 112 | "fr_title":"Relevé de Jambes Suspendu", 113 | "it_title":"Leg Raise Appeso", 114 | "pt_title":"Elevação De Pernas Na Barra Fixa", 115 | "ko_title":null, 116 | "ja_title":null, 117 | "tr_title":"Hanging Leg Raise", 118 | "ru_title":"Подъем ног в висе", 119 | "zh_cn_title":"单杠曲腿上举", 120 | "zh_tw_title":"單槓曲腿上舉", 121 | "superset_id":null, 122 | "rest_seconds":120, 123 | "notes":"", 124 | "exercise_template_id":"F8356514", 125 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/17641201-Hanging-Leg-Hip-Raise_Waist.mp4", 126 | "exercise_type":"reps_only", 127 | "equipment_category":"none", 128 | "media_type":"video", 129 | "custom_exercise_image_url":null, 130 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/17641201-Hanging-Leg-Hip-Raise_Waist_thumbnail@3x.jpg", 131 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/17641201-Hanging-Leg-Hip-Raise_Waist_thumbnail@3x.jpg", 132 | "muscle_group":"abdominals", 133 | "other_muscles":[ 134 | 135 | ], 136 | "priority":0, 137 | "sets":[ 138 | { 139 | "id":310860051, 140 | "index":0, 141 | "indicator":"normal", 142 | "weight_kg":null, 143 | "reps":6, 144 | "distance_meters":null, 145 | "duration_seconds":null, 146 | "rpe":null, 147 | "prs":[ 148 | 149 | ], 150 | "personalRecords":[ 151 | 152 | ] 153 | }, 154 | { 155 | "id":310860052, 156 | "index":1, 157 | "indicator":"normal", 158 | "weight_kg":null, 159 | "reps":6, 160 | "distance_meters":null, 161 | "duration_seconds":null, 162 | "rpe":null, 163 | "prs":[ 164 | 165 | ], 166 | "personalRecords":[ 167 | 168 | ] 169 | }, 170 | { 171 | "id":310860053, 172 | "index":2, 173 | "indicator":"normal", 174 | "weight_kg":null, 175 | "reps":6, 176 | "distance_meters":null, 177 | "duration_seconds":null, 178 | "rpe":null, 179 | "prs":[ 180 | 181 | ], 182 | "personalRecords":[ 183 | 184 | ] 185 | }, 186 | { 187 | "id":310860054, 188 | "index":3, 189 | "indicator":"normal", 190 | "weight_kg":null, 191 | "reps":6, 192 | "distance_meters":null, 193 | "duration_seconds":null, 194 | "rpe":null, 195 | "prs":[ 196 | 197 | ], 198 | "personalRecords":[ 199 | 200 | ] 201 | } 202 | ] 203 | }, 204 | { 205 | "id":"0a5f260f-2b3f-4c39-8909-0b99a62c8e2c", 206 | "title":"Lying Leg Raise", 207 | "es_title":"Levantamiento de Piernas Tumbado", 208 | "de_title":"Liegendes Beinheben", 209 | "fr_title":"Relevé de Jambes Allongé", 210 | "it_title":"Leg Raise Sdraiato", 211 | "pt_title":"Elevação De Pernas (Deitado)", 212 | "ko_title":null, 213 | "ja_title":null, 214 | "tr_title":"Çakı Hareketi", 215 | "ru_title":"Подъем ног лежа", 216 | "zh_cn_title":"躺式抬腿", 217 | "zh_tw_title":"躺式抬腿", 218 | "superset_id":null, 219 | "rest_seconds":120, 220 | "notes":"", 221 | "exercise_template_id":"09C9F635", 222 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/11631201-Lying-Leg-Raise_Waist.mp4", 223 | "exercise_type":"reps_only", 224 | "equipment_category":"none", 225 | "media_type":"video", 226 | "custom_exercise_image_url":null, 227 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11631201-Lying-Leg-Raise_Waist_thumbnail@3x.jpg", 228 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11631201-Lying-Leg-Raise_Waist_thumbnail@3x.jpg", 229 | "muscle_group":"abdominals", 230 | "other_muscles":[ 231 | 232 | ], 233 | "priority":8, 234 | "sets":[ 235 | { 236 | "id":310860055, 237 | "index":0, 238 | "indicator":"normal", 239 | "weight_kg":null, 240 | "reps":8, 241 | "distance_meters":null, 242 | "duration_seconds":null, 243 | "rpe":null, 244 | "prs":[ 245 | 246 | ], 247 | "personalRecords":[ 248 | 249 | ] 250 | }, 251 | { 252 | "id":310860056, 253 | "index":1, 254 | "indicator":"normal", 255 | "weight_kg":null, 256 | "reps":8, 257 | "distance_meters":null, 258 | "duration_seconds":null, 259 | "rpe":null, 260 | "prs":[ 261 | 262 | ], 263 | "personalRecords":[ 264 | 265 | ] 266 | }, 267 | { 268 | "id":310860057, 269 | "index":2, 270 | "indicator":"normal", 271 | "weight_kg":null, 272 | "reps":8, 273 | "distance_meters":null, 274 | "duration_seconds":null, 275 | "rpe":null, 276 | "prs":[ 277 | 278 | ], 279 | "personalRecords":[ 280 | 281 | ] 282 | }, 283 | { 284 | "id":310860058, 285 | "index":3, 286 | "indicator":"normal", 287 | "weight_kg":null, 288 | "reps":8, 289 | "distance_meters":null, 290 | "duration_seconds":null, 291 | "rpe":null, 292 | "prs":[ 293 | 294 | ], 295 | "personalRecords":[ 296 | 297 | ] 298 | }, 299 | { 300 | "id":310860059, 301 | "index":4, 302 | "indicator":"normal", 303 | "weight_kg":null, 304 | "reps":8, 305 | "distance_meters":null, 306 | "duration_seconds":null, 307 | "rpe":null, 308 | "prs":[ 309 | 310 | ], 311 | "personalRecords":[ 312 | 313 | ] 314 | } 315 | ] 316 | }, 317 | { 318 | "id":"8d764819-6d95-434f-a78c-a5c554b8f5da", 319 | "title":"Decline Crunch", 320 | "es_title":"Abdominal Corto en Banco Inclinado", 321 | "de_title":"Negativer Crunch", 322 | "fr_title":"Crunch Décliné", 323 | "it_title":"Crunch Declinato", 324 | "pt_title":"Abdominal Declinado", 325 | "ko_title":null, 326 | "ja_title":null, 327 | "tr_title":"Eğik Sehpada Yarım Mekik", 328 | "ru_title":"Скручивание в наклоне", 329 | "zh_cn_title":"斜板卷腹", 330 | "zh_tw_title":"斜板捲腹", 331 | "superset_id":null, 332 | "rest_seconds":120, 333 | "notes":"", 334 | "exercise_template_id":"BC10A922", 335 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/02771201-Decline-Crunch_Waist.mp4", 336 | "exercise_type":"reps_only", 337 | "equipment_category":"none", 338 | "media_type":"video", 339 | "custom_exercise_image_url":null, 340 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02771201-Decline-Crunch_Waist_thumbnail@3x.jpg", 341 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02771201-Decline-Crunch_Waist_thumbnail@3x.jpg", 342 | "muscle_group":"abdominals", 343 | "other_muscles":[ 344 | 345 | ], 346 | "priority":9, 347 | "sets":[ 348 | { 349 | "id":310860060, 350 | "index":0, 351 | "indicator":"normal", 352 | "weight_kg":null, 353 | "reps":8, 354 | "distance_meters":null, 355 | "duration_seconds":null, 356 | "rpe":null, 357 | "prs":[ 358 | 359 | ], 360 | "personalRecords":[ 361 | 362 | ] 363 | }, 364 | { 365 | "id":310860061, 366 | "index":1, 367 | "indicator":"normal", 368 | "weight_kg":null, 369 | "reps":8, 370 | "distance_meters":null, 371 | "duration_seconds":null, 372 | "rpe":null, 373 | "prs":[ 374 | 375 | ], 376 | "personalRecords":[ 377 | 378 | ] 379 | }, 380 | { 381 | "id":310860062, 382 | "index":2, 383 | "indicator":"normal", 384 | "weight_kg":null, 385 | "reps":8, 386 | "distance_meters":null, 387 | "duration_seconds":null, 388 | "rpe":null, 389 | "prs":[ 390 | 391 | ], 392 | "personalRecords":[ 393 | 394 | ] 395 | }, 396 | { 397 | "id":310860063, 398 | "index":3, 399 | "indicator":"normal", 400 | "weight_kg":null, 401 | "reps":8, 402 | "distance_meters":null, 403 | "duration_seconds":null, 404 | "rpe":null, 405 | "prs":[ 406 | 407 | ], 408 | "personalRecords":[ 409 | 410 | ] 411 | }, 412 | { 413 | "id":310860064, 414 | "index":4, 415 | "indicator":"normal", 416 | "weight_kg":null, 417 | "reps":8, 418 | "distance_meters":null, 419 | "duration_seconds":null, 420 | "rpe":null, 421 | "prs":[ 422 | 423 | ], 424 | "personalRecords":[ 425 | 426 | ] 427 | } 428 | ] 429 | }, 430 | { 431 | "id":"72222465-ff9f-41b2-b7b7-c178a21d8dd0", 432 | "title":"Rowing Machine", 433 | "es_title":"Máquina de Remo", 434 | "de_title":"Rudermaschine", 435 | "fr_title":"Rameur", 436 | "it_title":"Macchina Rematore", 437 | "pt_title":"Máquina De Remo", 438 | "ko_title":null, 439 | "ja_title":null, 440 | "tr_title":"Kürek Çekme", 441 | "ru_title":"Гребной тренажер", 442 | "zh_cn_title":"划船机", 443 | "zh_tw_title":"划船機", 444 | "superset_id":null, 445 | "rest_seconds":120, 446 | "notes":"", 447 | "exercise_template_id":"0222DB42", 448 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/22701201-Rowing-Straight-Back-(with-rowing-machine)-(female)_Cardio.mp4", 449 | "exercise_type":"distance_duration", 450 | "equipment_category":"machine", 451 | "media_type":"video", 452 | "custom_exercise_image_url":null, 453 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/22701201-Rowing-Straight-Back-(with-rowing-machine)-(female)_Cardio_thumbnail@3x.jpg", 454 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/22701201-Rowing-Straight-Back-(with-rowing-machine)-(female)_Cardio_thumbnail@3x.jpg", 455 | "muscle_group":"cardio", 456 | "other_muscles":[ 457 | 458 | ], 459 | "priority":8, 460 | "sets":[ 461 | { 462 | "id":310860065, 463 | "index":0, 464 | "indicator":"normal", 465 | "weight_kg":null, 466 | "reps":null, 467 | "distance_meters":0, 468 | "duration_seconds":2, 469 | "rpe":null, 470 | "prs":[ 471 | 472 | ], 473 | "personalRecords":[ 474 | 475 | ] 476 | }, 477 | { 478 | "id":310860066, 479 | "index":1, 480 | "indicator":"normal", 481 | "weight_kg":null, 482 | "reps":null, 483 | "distance_meters":0, 484 | "duration_seconds":2, 485 | "rpe":null, 486 | "prs":[ 487 | 488 | ], 489 | "personalRecords":[ 490 | 491 | ] 492 | }, 493 | { 494 | "id":310860067, 495 | "index":2, 496 | "indicator":"normal", 497 | "weight_kg":null, 498 | "reps":null, 499 | "distance_meters":0, 500 | "duration_seconds":2, 501 | "rpe":null, 502 | "prs":[ 503 | 504 | ], 505 | "personalRecords":[ 506 | 507 | ] 508 | }, 509 | { 510 | "id":310860068, 511 | "index":3, 512 | "indicator":"normal", 513 | "weight_kg":null, 514 | "reps":null, 515 | "distance_meters":0, 516 | "duration_seconds":2, 517 | "rpe":null, 518 | "prs":[ 519 | 520 | ], 521 | "personalRecords":[ 522 | 523 | ] 524 | }, 525 | { 526 | "id":310860069, 527 | "index":4, 528 | "indicator":"normal", 529 | "weight_kg":null, 530 | "reps":null, 531 | "distance_meters":0, 532 | "duration_seconds":2, 533 | "rpe":null, 534 | "prs":[ 535 | 536 | ], 537 | "personalRecords":[ 538 | 539 | ] 540 | }, 541 | { 542 | "id":310860070, 543 | "index":5, 544 | "indicator":"normal", 545 | "weight_kg":null, 546 | "reps":null, 547 | "distance_meters":0, 548 | "duration_seconds":2, 549 | "rpe":null, 550 | "prs":[ 551 | 552 | ], 553 | "personalRecords":[ 554 | 555 | ] 556 | } 557 | ] 558 | }, 559 | { 560 | "id":"733d62b9-b97a-4753-a812-1d5147c4f4a0", 561 | "title":"Ab Wheel", 562 | "es_title":"Rueda Abdominal", 563 | "de_title":"Ab Wheel", 564 | "fr_title":"Roue Abdominale", 565 | "it_title":"Ruota Addominali", 566 | "pt_title":"Roda Abdominal ", 567 | "ko_title":null, 568 | "ja_title":null, 569 | "tr_title":"Ab Wheel", 570 | "ru_title":"Колесо для пресса", 571 | "zh_cn_title":"健腹轮", 572 | "zh_tw_title":"健腹輪", 573 | "superset_id":null, 574 | "rest_seconds":120, 575 | "notes":"", 576 | "exercise_template_id":"99D5F10E", 577 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/08571201-Wheel-Rollout_Waist.mp4", 578 | "exercise_type":"reps_only", 579 | "equipment_category":"other", 580 | "media_type":"video", 581 | "custom_exercise_image_url":null, 582 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/08571201-Wheel-Rollout_Waist_thumbnail@3x.jpg", 583 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/08571201-Wheel-Rollout_Waist_thumbnail@3x.jpg", 584 | "muscle_group":"abdominals", 585 | "other_muscles":[ 586 | 587 | ], 588 | "priority":0, 589 | "sets":[ 590 | { 591 | "id":310860071, 592 | "index":0, 593 | "indicator":"normal", 594 | "weight_kg":null, 595 | "reps":8, 596 | "distance_meters":null, 597 | "duration_seconds":null, 598 | "rpe":null, 599 | "prs":[ 600 | 601 | ], 602 | "personalRecords":[ 603 | 604 | ] 605 | }, 606 | { 607 | "id":310860072, 608 | "index":1, 609 | "indicator":"normal", 610 | "weight_kg":null, 611 | "reps":8, 612 | "distance_meters":null, 613 | "duration_seconds":null, 614 | "rpe":null, 615 | "prs":[ 616 | 617 | ], 618 | "personalRecords":[ 619 | 620 | ] 621 | }, 622 | { 623 | "id":310860073, 624 | "index":2, 625 | "indicator":"normal", 626 | "weight_kg":null, 627 | "reps":8, 628 | "distance_meters":null, 629 | "duration_seconds":null, 630 | "rpe":null, 631 | "prs":[ 632 | 633 | ], 634 | "personalRecords":[ 635 | 636 | ] 637 | }, 638 | { 639 | "id":310860074, 640 | "index":3, 641 | "indicator":"normal", 642 | "weight_kg":null, 643 | "reps":8, 644 | "distance_meters":null, 645 | "duration_seconds":null, 646 | "rpe":null, 647 | "prs":[ 648 | 649 | ], 650 | "personalRecords":[ 651 | 652 | ] 653 | }, 654 | { 655 | "id":310860075, 656 | "index":4, 657 | "indicator":"normal", 658 | "weight_kg":null, 659 | "reps":8, 660 | "distance_meters":null, 661 | "duration_seconds":null, 662 | "rpe":null, 663 | "prs":[ 664 | 665 | ], 666 | "personalRecords":[ 667 | 668 | ] 669 | } 670 | ] 671 | }, 672 | { 673 | "id":"d5ef43f8-730e-494e-afbc-b5e65b237edc", 674 | "title":"Plank", 675 | "es_title":"Plancha", 676 | "de_title":"Plank", 677 | "fr_title":"Planche", 678 | "it_title":"Plank", 679 | "pt_title":"Prancha Abdominal", 680 | "ko_title":null, 681 | "ja_title":null, 682 | "tr_title":"Plank", 683 | "ru_title":"Планка", 684 | "zh_cn_title":"棒式", 685 | "zh_tw_title":"棒式", 686 | "superset_id":null, 687 | "rest_seconds":120, 688 | "notes":"", 689 | "exercise_template_id":"C6C9B8A0", 690 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/04631201-Front-Plank-m_waist.mp4", 691 | "exercise_type":"duration", 692 | "equipment_category":"none", 693 | "media_type":"video", 694 | "custom_exercise_image_url":null, 695 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/04631201-Front-Plank-m_waist_thumbnail@3x.jpg", 696 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/04631201-Front-Plank-m_waist_thumbnail@3x.jpg", 697 | "muscle_group":"abdominals", 698 | "other_muscles":[ 699 | 700 | ], 701 | "priority":0, 702 | "sets":[ 703 | { 704 | "id":310860076, 705 | "index":0, 706 | "indicator":"normal", 707 | "weight_kg":null, 708 | "reps":null, 709 | "distance_meters":null, 710 | "duration_seconds":2, 711 | "rpe":null, 712 | "prs":[ 713 | 714 | ], 715 | "personalRecords":[ 716 | 717 | ] 718 | }, 719 | { 720 | "id":310860077, 721 | "index":1, 722 | "indicator":"normal", 723 | "weight_kg":null, 724 | "reps":null, 725 | "distance_meters":null, 726 | "duration_seconds":2, 727 | "rpe":null, 728 | "prs":[ 729 | 730 | ], 731 | "personalRecords":[ 732 | 733 | ] 734 | }, 735 | { 736 | "id":310860078, 737 | "index":2, 738 | "indicator":"normal", 739 | "weight_kg":null, 740 | "reps":null, 741 | "distance_meters":null, 742 | "duration_seconds":2, 743 | "rpe":null, 744 | "prs":[ 745 | 746 | ], 747 | "personalRecords":[ 748 | 749 | ] 750 | }, 751 | { 752 | "id":310860079, 753 | "index":3, 754 | "indicator":"normal", 755 | "weight_kg":null, 756 | "reps":null, 757 | "distance_meters":null, 758 | "duration_seconds":2, 759 | "rpe":null, 760 | "prs":[ 761 | 762 | ], 763 | "personalRecords":[ 764 | 765 | ] 766 | } 767 | ] 768 | }, 769 | { 770 | "id":"927cbb1f-def5-41c1-bef9-4840bded0ac0", 771 | "title":"Side Plank", 772 | "es_title":"Plancha Lateral", 773 | "de_title":"Seitlicher Plank", 774 | "fr_title":"Planche Latérale", 775 | "it_title":"Plank Laterale", 776 | "pt_title":"Prancha Lateral", 777 | "ko_title":null, 778 | "ja_title":null, 779 | "tr_title":"Side Plank", 780 | "ru_title":"Боковая планка", 781 | "zh_cn_title":"侧棒式", 782 | "zh_tw_title":"側棒式", 783 | "superset_id":null, 784 | "rest_seconds":120, 785 | "notes":"", 786 | "exercise_template_id":"E3EDA509", 787 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/07151201-Side-Plank-m_Waist.mp4", 788 | "exercise_type":"duration", 789 | "equipment_category":"none", 790 | "media_type":"video", 791 | "custom_exercise_image_url":null, 792 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/07151201-Side-Plank-m_Waist_thumbnail@3x.jpg", 793 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/07151201-Side-Plank-m_Waist_thumbnail@3x.jpg", 794 | "muscle_group":"abdominals", 795 | "other_muscles":[ 796 | 797 | ], 798 | "priority":0, 799 | "sets":[ 800 | { 801 | "id":310860080, 802 | "index":0, 803 | "indicator":"normal", 804 | "weight_kg":null, 805 | "reps":null, 806 | "distance_meters":null, 807 | "duration_seconds":2, 808 | "rpe":null, 809 | "prs":[ 810 | 811 | ], 812 | "personalRecords":[ 813 | 814 | ] 815 | }, 816 | { 817 | "id":310860081, 818 | "index":1, 819 | "indicator":"normal", 820 | "weight_kg":null, 821 | "reps":null, 822 | "distance_meters":null, 823 | "duration_seconds":2, 824 | "rpe":null, 825 | "prs":[ 826 | 827 | ], 828 | "personalRecords":[ 829 | 830 | ] 831 | }, 832 | { 833 | "id":310860082, 834 | "index":2, 835 | "indicator":"normal", 836 | "weight_kg":null, 837 | "reps":null, 838 | "distance_meters":null, 839 | "duration_seconds":2, 840 | "rpe":null, 841 | "prs":[ 842 | 843 | ], 844 | "personalRecords":[ 845 | 846 | ] 847 | }, 848 | { 849 | "id":310860083, 850 | "index":3, 851 | "indicator":"normal", 852 | "weight_kg":null, 853 | "reps":null, 854 | "distance_meters":null, 855 | "duration_seconds":2, 856 | "rpe":null, 857 | "prs":[ 858 | 859 | ], 860 | "personalRecords":[ 861 | 862 | ] 863 | } 864 | ] 865 | }, 866 | { 867 | "id":"d6feaefe-916d-4b7b-9015-f58ff0551510", 868 | "title":"Sit Up", 869 | "es_title":"Sit Up", 870 | "de_title":"Rumpfbeugen", 871 | "fr_title":"Sit Up", 872 | "it_title":"Sit Up", 873 | "pt_title":"Abdominal Tradicional", 874 | "ko_title":null, 875 | "ja_title":null, 876 | "tr_title":"Mekik", 877 | "ru_title":"Приседания", 878 | "zh_cn_title":"仰卧起坐", 879 | "zh_tw_title":"仰臥起坐", 880 | "superset_id":null, 881 | "rest_seconds":120, 882 | "notes":"", 883 | "exercise_template_id":"022DF610", 884 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/00011201-3-4-Sit-up_Waist.mp4", 885 | "exercise_type":"reps_only", 886 | "equipment_category":"none", 887 | "media_type":"video", 888 | "custom_exercise_image_url":null, 889 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/00011201-3-4-Sit-up_Waist_thumbnail@3x.jpg", 890 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/00011201-3-4-Sit-up_Waist_thumbnail@3x.jpg", 891 | "muscle_group":"abdominals", 892 | "other_muscles":[ 893 | 894 | ], 895 | "priority":10, 896 | "sets":[ 897 | { 898 | "id":310860084, 899 | "index":0, 900 | "indicator":"normal", 901 | "weight_kg":null, 902 | "reps":20, 903 | "distance_meters":null, 904 | "duration_seconds":null, 905 | "rpe":null, 906 | "prs":[ 907 | 908 | ], 909 | "personalRecords":[ 910 | 911 | ] 912 | }, 913 | { 914 | "id":310860085, 915 | "index":1, 916 | "indicator":"normal", 917 | "weight_kg":null, 918 | "reps":10, 919 | "distance_meters":null, 920 | "duration_seconds":null, 921 | "rpe":null, 922 | "prs":[ 923 | 924 | ], 925 | "personalRecords":[ 926 | 927 | ] 928 | }, 929 | { 930 | "id":310860086, 931 | "index":2, 932 | "indicator":"normal", 933 | "weight_kg":null, 934 | "reps":10, 935 | "distance_meters":null, 936 | "duration_seconds":null, 937 | "rpe":null, 938 | "prs":[ 939 | 940 | ], 941 | "personalRecords":[ 942 | 943 | ] 944 | }, 945 | { 946 | "id":310860087, 947 | "index":3, 948 | "indicator":"normal", 949 | "weight_kg":null, 950 | "reps":10, 951 | "distance_meters":null, 952 | "duration_seconds":null, 953 | "rpe":null, 954 | "prs":[ 955 | 956 | ], 957 | "personalRecords":[ 958 | 959 | ] 960 | } 961 | ] 962 | }, 963 | { 964 | "id":"4a0362a2-f516-42f7-b1d4-a61a14a331f7", 965 | "title":"Overhead Press (Barbell)", 966 | "es_title":"Press de Hombros (Barra)", 967 | "de_title":"Schulterdrücken (Langhantel)", 968 | "fr_title":"Développé Militaire (Barre)", 969 | "it_title":"Lento in Avanti (Bilanciere)", 970 | "pt_title":"Desenvolvimento (Barra)", 971 | "ko_title":null, 972 | "ja_title":null, 973 | "tr_title":"Overhead Press (Bar)", 974 | "ru_title":"Жим над головой (Штанга)", 975 | "zh_cn_title":"肩推 (杠铃)", 976 | "zh_tw_title":"肩推 (槓鈴)", 977 | "superset_id":null, 978 | "rest_seconds":60, 979 | "notes":"", 980 | "exercise_template_id":"7B8D84E8", 981 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/11651201-Barbell-Standing-Military-Press-(without-rack)_Shoulders.mp4", 982 | "exercise_type":"weight_reps", 983 | "equipment_category":"barbell", 984 | "media_type":"video", 985 | "custom_exercise_image_url":null, 986 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11651201-Barbell-Standing-Military-Press-(without-rack)_Shoulders_thumbnail@3x.jpg", 987 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11651201-Barbell-Standing-Military-Press-(without-rack)_Shoulders_thumbnail@3x.jpg", 988 | "muscle_group":"shoulders", 989 | "other_muscles":[ 990 | "triceps" 991 | ], 992 | "priority":10, 993 | "sets":[ 994 | { 995 | "id":310860088, 996 | "index":0, 997 | "indicator":"normal", 998 | "weight_kg":40, 999 | "reps":1, 1000 | "distance_meters":null, 1001 | "duration_seconds":null, 1002 | "rpe":null, 1003 | "prs":[ 1004 | 1005 | ], 1006 | "personalRecords":[ 1007 | 1008 | ] 1009 | }, 1010 | { 1011 | "id":310860089, 1012 | "index":1, 1013 | "indicator":"normal", 1014 | "weight_kg":40, 1015 | "reps":3, 1016 | "distance_meters":null, 1017 | "duration_seconds":null, 1018 | "rpe":null, 1019 | "prs":[ 1020 | 1021 | ], 1022 | "personalRecords":[ 1023 | 1024 | ] 1025 | }, 1026 | { 1027 | "id":310860090, 1028 | "index":2, 1029 | "indicator":"normal", 1030 | "weight_kg":0, 1031 | "reps":1, 1032 | "distance_meters":null, 1033 | "duration_seconds":null, 1034 | "rpe":null, 1035 | "prs":[ 1036 | 1037 | ], 1038 | "personalRecords":[ 1039 | 1040 | ] 1041 | } 1042 | ] 1043 | } 1044 | ], 1045 | "estimated_volume_kg":160 1046 | }, 1047 | { 1048 | "id":"3d08434a-4bf6-4225-a6c9-a27f91548aef", 1049 | "short_id":"1dy6oVgjf9a", 1050 | "index":13414706, 1051 | "name":"3. Chest / Upper Back", 1052 | "description":"", 1053 | "start_time":1678783435, 1054 | "end_time":1678790745, 1055 | "created_at":"2023-03-14T10:46:39.475Z", 1056 | "updated_at":"2023-03-14T10:46:39.475Z", 1057 | "routine_id":"5f02e2a3-ce97-4576-bfc8-4ca9e1ea4868", 1058 | "apple_watch":false, 1059 | "user_id":"93620a45-5bef-4a70-baab-5c1058a88046", 1060 | "username":"bitwiseshift", 1061 | "profile_image":"https://pump-app.s3.eu-west-2.amazonaws.com/profile-images/bitwiseshift-e4a12928-f0f3-4a87-adc5-99c1daae5951.jpg", 1062 | "verified":false, 1063 | "nth_workout":180, 1064 | "like_count":0, 1065 | "is_liked_by_user":false, 1066 | "like_images":[ 1067 | 1068 | ], 1069 | "comments":[ 1070 | 1071 | ], 1072 | "comment_count":0, 1073 | "media":[ 1074 | 1075 | ], 1076 | "image_urls":[ 1077 | 1078 | ], 1079 | "exercises":[ 1080 | { 1081 | "id":"5c658ffd-828f-4e4c-924f-f3e320fc0a80", 1082 | "title":"Elliptical Trainer", 1083 | "es_title":"Entrenador Elíptico", 1084 | "de_title":"Crosstrainer", 1085 | "fr_title":"Vélo Elliptique", 1086 | "it_title":"Ellittica", 1087 | "pt_title":"Elíptico", 1088 | "ko_title":null, 1089 | "ja_title":null, 1090 | "tr_title":"Eliptik Bisiklet", 1091 | "ru_title":"Эллиптический тренажер", 1092 | "zh_cn_title":"椭圆机", 1093 | "zh_tw_title":"橢圓機", 1094 | "superset_id":null, 1095 | "rest_seconds":120, 1096 | "notes":"", 1097 | "exercise_template_id":"3303376C", 1098 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/21921201-Elliptical-Machine-Walk_Cardio.mp4", 1099 | "exercise_type":"distance_duration", 1100 | "equipment_category":"machine", 1101 | "media_type":"video", 1102 | "custom_exercise_image_url":null, 1103 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/21921201-Elliptical-Machine-Walk_Cardio_thumbnail@3x.jpg", 1104 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/21921201-Elliptical-Machine-Walk_Cardio_thumbnail@3x.jpg", 1105 | "muscle_group":"cardio", 1106 | "other_muscles":[ 1107 | 1108 | ], 1109 | "priority":8, 1110 | "sets":[ 1111 | { 1112 | "id":309117293, 1113 | "index":0, 1114 | "indicator":"normal", 1115 | "weight_kg":null, 1116 | "reps":null, 1117 | "distance_meters":0, 1118 | "duration_seconds":15, 1119 | "rpe":null, 1120 | "prs":[ 1121 | 1122 | ], 1123 | "personalRecords":[ 1124 | 1125 | ] 1126 | } 1127 | ] 1128 | }, 1129 | { 1130 | "id":"5c8f1ca1-5575-4f7b-b734-82c9e9c9b184", 1131 | "title":"Bench Press (Barbell)", 1132 | "es_title":"Press de Banca (Barra)", 1133 | "de_title":"Bankdrücken (Langhantel)", 1134 | "fr_title":"Développé Couché (Barre)", 1135 | "it_title":"Panca Piana (Bilanciere)", 1136 | "pt_title":"Supino (Barra)", 1137 | "ko_title":null, 1138 | "ja_title":null, 1139 | "tr_title":"Bench Press (Bar)", 1140 | "ru_title":"Жим лежа (Штанга)", 1141 | "zh_cn_title":"卧推 (杠铃)", 1142 | "zh_tw_title":"平板臥推 (槓鈴)", 1143 | "superset_id":null, 1144 | "rest_seconds":120, 1145 | "notes":"", 1146 | "exercise_template_id":"79D0BB3A", 1147 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/00251201-Barbell-Bench-Press_Chest.mp4", 1148 | "exercise_type":"weight_reps", 1149 | "equipment_category":"barbell", 1150 | "media_type":"video", 1151 | "custom_exercise_image_url":null, 1152 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/00251201-Barbell-Bench-Press_Chest_thumbnail@3x.jpg", 1153 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/00251201-Barbell-Bench-Press_Chest_thumbnail@3x.jpg", 1154 | "muscle_group":"chest", 1155 | "other_muscles":[ 1156 | "triceps", 1157 | "shoulders" 1158 | ], 1159 | "priority":10, 1160 | "sets":[ 1161 | { 1162 | "id":309117294, 1163 | "index":0, 1164 | "indicator":"normal", 1165 | "weight_kg":60, 1166 | "reps":4, 1167 | "distance_meters":null, 1168 | "duration_seconds":null, 1169 | "rpe":null, 1170 | "prs":[ 1171 | 1172 | ], 1173 | "personalRecords":[ 1174 | 1175 | ] 1176 | }, 1177 | { 1178 | "id":309117295, 1179 | "index":1, 1180 | "indicator":"normal", 1181 | "weight_kg":55, 1182 | "reps":8, 1183 | "distance_meters":null, 1184 | "duration_seconds":null, 1185 | "rpe":null, 1186 | "prs":[ 1187 | 1188 | ], 1189 | "personalRecords":[ 1190 | 1191 | ] 1192 | }, 1193 | { 1194 | "id":309117296, 1195 | "index":2, 1196 | "indicator":"normal", 1197 | "weight_kg":55, 1198 | "reps":8, 1199 | "distance_meters":null, 1200 | "duration_seconds":null, 1201 | "rpe":null, 1202 | "prs":[ 1203 | 1204 | ], 1205 | "personalRecords":[ 1206 | 1207 | ] 1208 | }, 1209 | { 1210 | "id":309117297, 1211 | "index":3, 1212 | "indicator":"normal", 1213 | "weight_kg":52.5, 1214 | "reps":8, 1215 | "distance_meters":null, 1216 | "duration_seconds":null, 1217 | "rpe":null, 1218 | "prs":[ 1219 | 1220 | ], 1221 | "personalRecords":[ 1222 | 1223 | ] 1224 | }, 1225 | { 1226 | "id":309117298, 1227 | "index":4, 1228 | "indicator":"normal", 1229 | "weight_kg":50, 1230 | "reps":8, 1231 | "distance_meters":null, 1232 | "duration_seconds":null, 1233 | "rpe":null, 1234 | "prs":[ 1235 | 1236 | ], 1237 | "personalRecords":[ 1238 | 1239 | ] 1240 | }, 1241 | { 1242 | "id":309117299, 1243 | "index":5, 1244 | "indicator":"normal", 1245 | "weight_kg":50, 1246 | "reps":8, 1247 | "distance_meters":null, 1248 | "duration_seconds":null, 1249 | "rpe":null, 1250 | "prs":[ 1251 | 1252 | ], 1253 | "personalRecords":[ 1254 | 1255 | ] 1256 | }, 1257 | { 1258 | "id":309117300, 1259 | "index":6, 1260 | "indicator":"normal", 1261 | "weight_kg":60, 1262 | "reps":4, 1263 | "distance_meters":null, 1264 | "duration_seconds":null, 1265 | "rpe":null, 1266 | "prs":[ 1267 | 1268 | ], 1269 | "personalRecords":[ 1270 | 1271 | ] 1272 | } 1273 | ] 1274 | }, 1275 | { 1276 | "id":"e5e4986f-4bbc-4572-94b7-c6eb42bd76c8", 1277 | "title":"Chest Fly (Dumbbell)", 1278 | "es_title":"Aperturas (Mancuerna)", 1279 | "de_title":"Fliegende (Kurzhantel)", 1280 | "fr_title":"Écarté (Haltère)", 1281 | "it_title":"Croci (Manubrio)", 1282 | "pt_title":"Crucifixo Reto (Halter)", 1283 | "ko_title":null, 1284 | "ja_title":null, 1285 | "tr_title":"Chest Fly (Dambıl)", 1286 | "ru_title":"Разводка (Гантель)", 1287 | "zh_cn_title":"飞鸟夹胸(哑铃)", 1288 | "zh_tw_title":"飛鳥夾胸(啞鈴)", 1289 | "superset_id":null, 1290 | "rest_seconds":120, 1291 | "notes":"", 1292 | "exercise_template_id":"12017185", 1293 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/03081201-Dumbbell-Fly_Chest.mp4", 1294 | "exercise_type":"weight_reps", 1295 | "equipment_category":"dumbbell", 1296 | "media_type":"video", 1297 | "custom_exercise_image_url":null, 1298 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03081201-Dumbbell-Fly_Chest_thumbnail@3x.jpg", 1299 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/03081201-Dumbbell-Fly_Chest_thumbnail@3x.jpg", 1300 | "muscle_group":"chest", 1301 | "other_muscles":[ 1302 | 1303 | ], 1304 | "priority":8, 1305 | "sets":[ 1306 | { 1307 | "id":309117301, 1308 | "index":0, 1309 | "indicator":"normal", 1310 | "weight_kg":25, 1311 | "reps":8, 1312 | "distance_meters":null, 1313 | "duration_seconds":null, 1314 | "rpe":null, 1315 | "prs":[ 1316 | 1317 | ], 1318 | "personalRecords":[ 1319 | 1320 | ] 1321 | }, 1322 | { 1323 | "id":309117302, 1324 | "index":1, 1325 | "indicator":"normal", 1326 | "weight_kg":30, 1327 | "reps":8, 1328 | "distance_meters":null, 1329 | "duration_seconds":null, 1330 | "rpe":null, 1331 | "prs":[ 1332 | 1333 | ], 1334 | "personalRecords":[ 1335 | 1336 | ] 1337 | }, 1338 | { 1339 | "id":309117303, 1340 | "index":2, 1341 | "indicator":"normal", 1342 | "weight_kg":35, 1343 | "reps":8, 1344 | "distance_meters":null, 1345 | "duration_seconds":null, 1346 | "rpe":null, 1347 | "prs":[ 1348 | 1349 | ], 1350 | "personalRecords":[ 1351 | 1352 | ] 1353 | }, 1354 | { 1355 | "id":309117304, 1356 | "index":3, 1357 | "indicator":"normal", 1358 | "weight_kg":40, 1359 | "reps":4, 1360 | "distance_meters":null, 1361 | "duration_seconds":null, 1362 | "rpe":null, 1363 | "prs":[ 1364 | 1365 | ], 1366 | "personalRecords":[ 1367 | 1368 | ] 1369 | }, 1370 | { 1371 | "id":309117305, 1372 | "index":4, 1373 | "indicator":"normal", 1374 | "weight_kg":30, 1375 | "reps":8, 1376 | "distance_meters":null, 1377 | "duration_seconds":null, 1378 | "rpe":null, 1379 | "prs":[ 1380 | 1381 | ], 1382 | "personalRecords":[ 1383 | 1384 | ] 1385 | } 1386 | ] 1387 | }, 1388 | { 1389 | "id":"663bd3fd-b839-4c32-8f8e-1db961589abd", 1390 | "title":"T Bar Row", 1391 | "es_title":"Remo en Punta", 1392 | "de_title":"T-Bar Rudern", 1393 | "fr_title":"Rowing Barre T", 1394 | "it_title":"Rematore T Bar", 1395 | "pt_title":"Remada na Barra T", 1396 | "ko_title":null, 1397 | "ja_title":null, 1398 | "tr_title":"T Bar Row", 1399 | "ru_title":"Тяга Т грифа", 1400 | "zh_cn_title":"T杠划船", 1401 | "zh_tw_title":"T槓划船", 1402 | "superset_id":null, 1403 | "rest_seconds":120, 1404 | "notes":"", 1405 | "exercise_template_id":"08A2974E", 1406 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/06061201-Lever-T-bar-Row-(plate-loaded)_Back.mp4", 1407 | "exercise_type":"weight_reps", 1408 | "equipment_category":"barbell", 1409 | "media_type":"video", 1410 | "custom_exercise_image_url":null, 1411 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/06061201-Lever-T-bar-Row-(plate-loaded)_Back_thumbnail@3x.jpg", 1412 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/06061201-Lever-T-bar-Row-(plate-loaded)_Back_thumbnail@3x.jpg", 1413 | "muscle_group":"upper_back", 1414 | "other_muscles":[ 1415 | 1416 | ], 1417 | "priority":0, 1418 | "sets":[ 1419 | { 1420 | "id":309117306, 1421 | "index":0, 1422 | "indicator":"normal", 1423 | "weight_kg":20, 1424 | "reps":8, 1425 | "distance_meters":null, 1426 | "duration_seconds":null, 1427 | "rpe":null, 1428 | "prs":[ 1429 | 1430 | ], 1431 | "personalRecords":[ 1432 | 1433 | ] 1434 | }, 1435 | { 1436 | "id":309117307, 1437 | "index":1, 1438 | "indicator":"normal", 1439 | "weight_kg":25, 1440 | "reps":8, 1441 | "distance_meters":null, 1442 | "duration_seconds":null, 1443 | "rpe":null, 1444 | "prs":[ 1445 | 1446 | ], 1447 | "personalRecords":[ 1448 | 1449 | ] 1450 | }, 1451 | { 1452 | "id":309117308, 1453 | "index":2, 1454 | "indicator":"normal", 1455 | "weight_kg":32.5, 1456 | "reps":8, 1457 | "distance_meters":null, 1458 | "duration_seconds":null, 1459 | "rpe":null, 1460 | "prs":[ 1461 | 1462 | ], 1463 | "personalRecords":[ 1464 | 1465 | ] 1466 | }, 1467 | { 1468 | "id":309117309, 1469 | "index":3, 1470 | "indicator":"normal", 1471 | "weight_kg":30, 1472 | "reps":4, 1473 | "distance_meters":null, 1474 | "duration_seconds":null, 1475 | "rpe":null, 1476 | "prs":[ 1477 | 1478 | ], 1479 | "personalRecords":[ 1480 | 1481 | ] 1482 | } 1483 | ] 1484 | }, 1485 | { 1486 | "id":"ef9182ad-9834-44cc-bad3-8ec0e1d2742f", 1487 | "title":"Lat Pulldown (Cable)", 1488 | "es_title":"Jalón al Pecho (Cable)", 1489 | "de_title":"Latzug (Kabel)", 1490 | "fr_title":"Tirage Poitrine (Poulie)", 1491 | "it_title":"Lat Pulldown (Cavo)", 1492 | "pt_title":"Puxada Alta na Polia (Máquina)", 1493 | "ko_title":null, 1494 | "ja_title":null, 1495 | "tr_title":"Lat Pulldown (Cable)", 1496 | "ru_title":"Вкртикальная тяга Широчайшими (Блок)", 1497 | "zh_cn_title":"阔背肌下拉 (滑轮机)", 1498 | "zh_tw_title":"闊背肌下拉 (滑輪機)", 1499 | "superset_id":null, 1500 | "rest_seconds":120, 1501 | "notes":"", 1502 | "exercise_template_id":"6A6C31A5", 1503 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/01501201-Cable-Bar-Lateral-Pulldown_Back.mp4", 1504 | "exercise_type":"weight_reps", 1505 | "equipment_category":"machine", 1506 | "media_type":"video", 1507 | "custom_exercise_image_url":null, 1508 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01501201-Cable-Bar-Lateral-Pulldown_Back_thumbnail@3x.jpg", 1509 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01501201-Cable-Bar-Lateral-Pulldown_Back_thumbnail@3x.jpg", 1510 | "muscle_group":"lats", 1511 | "other_muscles":[ 1512 | 1513 | ], 1514 | "priority":10, 1515 | "sets":[ 1516 | { 1517 | "id":309117310, 1518 | "index":0, 1519 | "indicator":"normal", 1520 | "weight_kg":46, 1521 | "reps":8, 1522 | "distance_meters":null, 1523 | "duration_seconds":null, 1524 | "rpe":null, 1525 | "prs":[ 1526 | 1527 | ], 1528 | "personalRecords":[ 1529 | 1530 | ] 1531 | }, 1532 | { 1533 | "id":309117311, 1534 | "index":1, 1535 | "indicator":"normal", 1536 | "weight_kg":59, 1537 | "reps":8, 1538 | "distance_meters":null, 1539 | "duration_seconds":null, 1540 | "rpe":null, 1541 | "prs":[ 1542 | 1543 | ], 1544 | "personalRecords":[ 1545 | 1546 | ] 1547 | }, 1548 | { 1549 | "id":309117312, 1550 | "index":2, 1551 | "indicator":"normal", 1552 | "weight_kg":64, 1553 | "reps":8, 1554 | "distance_meters":null, 1555 | "duration_seconds":null, 1556 | "rpe":null, 1557 | "prs":[ 1558 | 1559 | ], 1560 | "personalRecords":[ 1561 | 1562 | ] 1563 | }, 1564 | { 1565 | "id":309117313, 1566 | "index":3, 1567 | "indicator":"normal", 1568 | "weight_kg":59, 1569 | "reps":6, 1570 | "distance_meters":null, 1571 | "duration_seconds":null, 1572 | "rpe":null, 1573 | "prs":[ 1574 | 1575 | ], 1576 | "personalRecords":[ 1577 | 1578 | ] 1579 | } 1580 | ] 1581 | }, 1582 | { 1583 | "id":"47190c24-1cb2-47f6-9c35-eb7ebe253d51", 1584 | "title":"Seated Cable Row", 1585 | "es_title":"Remo Sentado con Cable", 1586 | "de_title":"Rudern am Kabel sitzend", 1587 | "fr_title":"Rowing Poulie Assis", 1588 | "it_title":"Rematore al Cavo da Seduto", 1589 | "pt_title":"Remada (Corda) Sentado", 1590 | "ko_title":null, 1591 | "ja_title":null, 1592 | "tr_title":"Oturarak Cable Row", 1593 | "ru_title":"Горизонтальная тяга блока", 1594 | "zh_cn_title":"坐式滑轮划船", 1595 | "zh_tw_title":"坐式滑輪划船", 1596 | "superset_id":null, 1597 | "rest_seconds":90, 1598 | "notes":"", 1599 | "exercise_template_id":"F1D60854", 1600 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/01801201-Cable-Low-Seated-Row_Back.mp4", 1601 | "exercise_type":"weight_reps", 1602 | "equipment_category":"machine", 1603 | "media_type":"video", 1604 | "custom_exercise_image_url":null, 1605 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01801201-Cable-Low-Seated-Row_Back_thumbnail@3x.jpg", 1606 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/01801201-Cable-Low-Seated-Row_Back_thumbnail@3x.jpg", 1607 | "muscle_group":"upper_back", 1608 | "other_muscles":[ 1609 | 1610 | ], 1611 | "priority":10, 1612 | "sets":[ 1613 | { 1614 | "id":309117314, 1615 | "index":0, 1616 | "indicator":"normal", 1617 | "weight_kg":91, 1618 | "reps":8, 1619 | "distance_meters":null, 1620 | "duration_seconds":null, 1621 | "rpe":null, 1622 | "prs":[ 1623 | 1624 | ], 1625 | "personalRecords":[ 1626 | 1627 | ] 1628 | }, 1629 | { 1630 | "id":309117315, 1631 | "index":1, 1632 | "indicator":"normal", 1633 | "weight_kg":64, 1634 | "reps":8, 1635 | "distance_meters":null, 1636 | "duration_seconds":null, 1637 | "rpe":null, 1638 | "prs":[ 1639 | 1640 | ], 1641 | "personalRecords":[ 1642 | 1643 | ] 1644 | }, 1645 | { 1646 | "id":309117316, 1647 | "index":2, 1648 | "indicator":"normal", 1649 | "weight_kg":64, 1650 | "reps":8, 1651 | "distance_meters":null, 1652 | "duration_seconds":null, 1653 | "rpe":null, 1654 | "prs":[ 1655 | 1656 | ], 1657 | "personalRecords":[ 1658 | 1659 | ] 1660 | }, 1661 | { 1662 | "id":309117317, 1663 | "index":3, 1664 | "indicator":"normal", 1665 | "weight_kg":64, 1666 | "reps":8, 1667 | "distance_meters":null, 1668 | "duration_seconds":null, 1669 | "rpe":null, 1670 | "prs":[ 1671 | 1672 | ], 1673 | "personalRecords":[ 1674 | 1675 | ] 1676 | }, 1677 | { 1678 | "id":309117318, 1679 | "index":4, 1680 | "indicator":"normal", 1681 | "weight_kg":64, 1682 | "reps":8, 1683 | "distance_meters":null, 1684 | "duration_seconds":null, 1685 | "rpe":null, 1686 | "prs":[ 1687 | 1688 | ], 1689 | "personalRecords":[ 1690 | 1691 | ] 1692 | }, 1693 | { 1694 | "id":309117319, 1695 | "index":5, 1696 | "indicator":"normal", 1697 | "weight_kg":59, 1698 | "reps":8, 1699 | "distance_meters":null, 1700 | "duration_seconds":null, 1701 | "rpe":null, 1702 | "prs":[ 1703 | 1704 | ], 1705 | "personalRecords":[ 1706 | 1707 | ] 1708 | }, 1709 | { 1710 | "id":309117320, 1711 | "index":6, 1712 | "indicator":"normal", 1713 | "weight_kg":59, 1714 | "reps":8, 1715 | "distance_meters":null, 1716 | "duration_seconds":null, 1717 | "rpe":null, 1718 | "prs":[ 1719 | 1720 | ], 1721 | "personalRecords":[ 1722 | 1723 | ] 1724 | }, 1725 | { 1726 | "id":309117321, 1727 | "index":7, 1728 | "indicator":"normal", 1729 | "weight_kg":59, 1730 | "reps":8, 1731 | "distance_meters":null, 1732 | "duration_seconds":null, 1733 | "rpe":null, 1734 | "prs":[ 1735 | 1736 | ], 1737 | "personalRecords":[ 1738 | 1739 | ] 1740 | }, 1741 | { 1742 | "id":309117322, 1743 | "index":8, 1744 | "indicator":"normal", 1745 | "weight_kg":59, 1746 | "reps":8, 1747 | "distance_meters":null, 1748 | "duration_seconds":null, 1749 | "rpe":null, 1750 | "prs":[ 1751 | 1752 | ], 1753 | "personalRecords":[ 1754 | 1755 | ] 1756 | }, 1757 | { 1758 | "id":309117323, 1759 | "index":9, 1760 | "indicator":"normal", 1761 | "weight_kg":59, 1762 | "reps":8, 1763 | "distance_meters":null, 1764 | "duration_seconds":null, 1765 | "rpe":null, 1766 | "prs":[ 1767 | 1768 | ], 1769 | "personalRecords":[ 1770 | 1771 | ] 1772 | }, 1773 | { 1774 | "id":309117324, 1775 | "index":10, 1776 | "indicator":"normal", 1777 | "weight_kg":59, 1778 | "reps":8, 1779 | "distance_meters":null, 1780 | "duration_seconds":null, 1781 | "rpe":null, 1782 | "prs":[ 1783 | 1784 | ], 1785 | "personalRecords":[ 1786 | 1787 | ] 1788 | } 1789 | ] 1790 | }, 1791 | { 1792 | "id":"b4d22fcb-feea-4cc5-8d14-f33e145a84f7", 1793 | "title":"Decline Crunch", 1794 | "es_title":"Abdominal Corto en Banco Inclinado", 1795 | "de_title":"Negativer Crunch", 1796 | "fr_title":"Crunch Décliné", 1797 | "it_title":"Crunch Declinato", 1798 | "pt_title":"Abdominal Declinado", 1799 | "ko_title":null, 1800 | "ja_title":null, 1801 | "tr_title":"Eğik Sehpada Yarım Mekik", 1802 | "ru_title":"Скручивание в наклоне", 1803 | "zh_cn_title":"斜板卷腹", 1804 | "zh_tw_title":"斜板捲腹", 1805 | "superset_id":null, 1806 | "rest_seconds":60, 1807 | "notes":"", 1808 | "exercise_template_id":"BC10A922", 1809 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/02771201-Decline-Crunch_Waist.mp4", 1810 | "exercise_type":"reps_only", 1811 | "equipment_category":"none", 1812 | "media_type":"video", 1813 | "custom_exercise_image_url":null, 1814 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02771201-Decline-Crunch_Waist_thumbnail@3x.jpg", 1815 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/02771201-Decline-Crunch_Waist_thumbnail@3x.jpg", 1816 | "muscle_group":"abdominals", 1817 | "other_muscles":[ 1818 | 1819 | ], 1820 | "priority":9, 1821 | "sets":[ 1822 | { 1823 | "id":309117325, 1824 | "index":0, 1825 | "indicator":"normal", 1826 | "weight_kg":null, 1827 | "reps":16, 1828 | "distance_meters":null, 1829 | "duration_seconds":null, 1830 | "rpe":null, 1831 | "prs":[ 1832 | 1833 | ], 1834 | "personalRecords":[ 1835 | 1836 | ] 1837 | }, 1838 | { 1839 | "id":309117326, 1840 | "index":1, 1841 | "indicator":"normal", 1842 | "weight_kg":null, 1843 | "reps":8, 1844 | "distance_meters":null, 1845 | "duration_seconds":null, 1846 | "rpe":null, 1847 | "prs":[ 1848 | 1849 | ], 1850 | "personalRecords":[ 1851 | 1852 | ] 1853 | }, 1854 | { 1855 | "id":309117327, 1856 | "index":2, 1857 | "indicator":"normal", 1858 | "weight_kg":null, 1859 | "reps":8, 1860 | "distance_meters":null, 1861 | "duration_seconds":null, 1862 | "rpe":null, 1863 | "prs":[ 1864 | 1865 | ], 1866 | "personalRecords":[ 1867 | 1868 | ] 1869 | } 1870 | ] 1871 | }, 1872 | { 1873 | "id":"507345da-8c4e-4cef-8ea1-9a129928f53b", 1874 | "title":"Lying Leg Raise", 1875 | "es_title":"Levantamiento de Piernas Tumbado", 1876 | "de_title":"Liegendes Beinheben", 1877 | "fr_title":"Relevé de Jambes Allongé", 1878 | "it_title":"Leg Raise Sdraiato", 1879 | "pt_title":"Elevação De Pernas (Deitado)", 1880 | "ko_title":null, 1881 | "ja_title":null, 1882 | "tr_title":"Çakı Hareketi", 1883 | "ru_title":"Подъем ног лежа", 1884 | "zh_cn_title":"躺式抬腿", 1885 | "zh_tw_title":"躺式抬腿", 1886 | "superset_id":null, 1887 | "rest_seconds":120, 1888 | "notes":"", 1889 | "exercise_template_id":"09C9F635", 1890 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/11631201-Lying-Leg-Raise_Waist.mp4", 1891 | "exercise_type":"reps_only", 1892 | "equipment_category":"none", 1893 | "media_type":"video", 1894 | "custom_exercise_image_url":null, 1895 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11631201-Lying-Leg-Raise_Waist_thumbnail@3x.jpg", 1896 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/11631201-Lying-Leg-Raise_Waist_thumbnail@3x.jpg", 1897 | "muscle_group":"abdominals", 1898 | "other_muscles":[ 1899 | 1900 | ], 1901 | "priority":8, 1902 | "sets":[ 1903 | { 1904 | "id":309117328, 1905 | "index":0, 1906 | "indicator":"normal", 1907 | "weight_kg":null, 1908 | "reps":8, 1909 | "distance_meters":null, 1910 | "duration_seconds":null, 1911 | "rpe":null, 1912 | "prs":[ 1913 | 1914 | ], 1915 | "personalRecords":[ 1916 | 1917 | ] 1918 | }, 1919 | { 1920 | "id":309117329, 1921 | "index":1, 1922 | "indicator":"normal", 1923 | "weight_kg":null, 1924 | "reps":8, 1925 | "distance_meters":null, 1926 | "duration_seconds":null, 1927 | "rpe":null, 1928 | "prs":[ 1929 | 1930 | ], 1931 | "personalRecords":[ 1932 | 1933 | ] 1934 | }, 1935 | { 1936 | "id":309117330, 1937 | "index":2, 1938 | "indicator":"normal", 1939 | "weight_kg":null, 1940 | "reps":8, 1941 | "distance_meters":null, 1942 | "duration_seconds":null, 1943 | "rpe":null, 1944 | "prs":[ 1945 | 1946 | ], 1947 | "personalRecords":[ 1948 | 1949 | ] 1950 | }, 1951 | { 1952 | "id":309117331, 1953 | "index":3, 1954 | "indicator":"normal", 1955 | "weight_kg":null, 1956 | "reps":8, 1957 | "distance_meters":null, 1958 | "duration_seconds":null, 1959 | "rpe":null, 1960 | "prs":[ 1961 | 1962 | ], 1963 | "personalRecords":[ 1964 | 1965 | ] 1966 | } 1967 | ] 1968 | }, 1969 | { 1970 | "id":"e3e03735-8dd4-4949-b1db-cc18267e3b4c", 1971 | "title":"Hanging Leg Raise", 1972 | "es_title":"Levantamiento de Piernas en Barra", 1973 | "de_title":"Beinheben hängend", 1974 | "fr_title":"Relevé de Jambes Suspendu", 1975 | "it_title":"Leg Raise Appeso", 1976 | "pt_title":"Elevação De Pernas Na Barra Fixa", 1977 | "ko_title":null, 1978 | "ja_title":null, 1979 | "tr_title":"Hanging Leg Raise", 1980 | "ru_title":"Подъем ног в висе", 1981 | "zh_cn_title":"单杠曲腿上举", 1982 | "zh_tw_title":"單槓曲腿上舉", 1983 | "superset_id":null, 1984 | "rest_seconds":120, 1985 | "notes":"", 1986 | "exercise_template_id":"F8356514", 1987 | "url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-assets/17641201-Hanging-Leg-Hip-Raise_Waist.mp4", 1988 | "exercise_type":"reps_only", 1989 | "equipment_category":"none", 1990 | "media_type":"video", 1991 | "custom_exercise_image_url":null, 1992 | "custom_exercise_image_thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/17641201-Hanging-Leg-Hip-Raise_Waist_thumbnail@3x.jpg", 1993 | "thumbnail_url":"https://pump-app.s3.eu-west-2.amazonaws.com/exercise-thumbnails/17641201-Hanging-Leg-Hip-Raise_Waist_thumbnail@3x.jpg", 1994 | "muscle_group":"abdominals", 1995 | "other_muscles":[ 1996 | 1997 | ], 1998 | "priority":0, 1999 | "sets":[ 2000 | { 2001 | "id":309117332, 2002 | "index":0, 2003 | "indicator":"normal", 2004 | "weight_kg":null, 2005 | "reps":8, 2006 | "distance_meters":null, 2007 | "duration_seconds":null, 2008 | "rpe":null, 2009 | "prs":[ 2010 | 2011 | ], 2012 | "personalRecords":[ 2013 | 2014 | ] 2015 | }, 2016 | { 2017 | "id":309117333, 2018 | "index":1, 2019 | "indicator":"normal", 2020 | "weight_kg":null, 2021 | "reps":7, 2022 | "distance_meters":null, 2023 | "duration_seconds":null, 2024 | "rpe":null, 2025 | "prs":[ 2026 | 2027 | ], 2028 | "personalRecords":[ 2029 | 2030 | ] 2031 | }, 2032 | { 2033 | "id":309117334, 2034 | "index":2, 2035 | "indicator":"normal", 2036 | "weight_kg":null, 2037 | "reps":6, 2038 | "distance_meters":null, 2039 | "duration_seconds":null, 2040 | "rpe":null, 2041 | "prs":[ 2042 | 2043 | ], 2044 | "personalRecords":[ 2045 | 2046 | ] 2047 | } 2048 | ] 2049 | } 2050 | ], 2051 | "estimated_volume_kg":11754 2052 | } 2053 | ] 2054 | } 2055 | ``` --------------------------------------------------------------------------------