/api/v1/workoutsRetrieve a list of workouts with details
See data structureGenerate credentials, authenticate requests, and understand the workout and exercise data returned by the Lyfta API.
https://my.lyfta.appYour API key provides programmatic access to your Lyfta data. Use the button below to generate an API key.
Important Notes:
Create an API key above. A new key revokes and replaces any previously active key.
Send your key in the authorization header on every request.
Use limit and page to control list responses.
You can make up to 60 requests per minute and 5,000 requests per day. Exceeding these limits will result in a 429 Too Many Requests response.
Base URL: https://my.lyfta.app
/api/v1/workoutsRetrieve a list of workouts with details
See data structure/api/v1/workouts/summaryRetrieve a list of workouts with summary data
See summary data structure/api/v1/exercisesRetrieve a list of the performed exercises
See exercise data structure/api/v1/exercises/progressRetrieve exercise progress data
See exercise progress data structureAll requests must include the following header:
Authorization: Bearer YOUR_API_KEY
List endpoints support pagination via the optional limit and page query parameters. You can request up to 100 workouts per call. Requests specifying a higher limit will be capped at 100.
import requests
import json
API_KEY = 'YOUR_API_KEY' # Replace with your actual API key
BASE_URL = 'https://my.lyfta.app' #
headers = {
'Authorization': f'Bearer {API_KEY}',
}
# Example: Fetch first page of workouts with up to 10 per page
params = {
'limit': 10,
'page': 1,
}
response = requests.get(f'{BASE_URL}/api/v1/workouts', headers=headers, params=params)
if response.status_code == 200:
data = response.json()
print("Workouts:")
print(json.dumps(data, indent=2)) # Pretty print
else:
print(f"Error {response.status_code}:", response.text)
The API returns a list of detailed workouts in the following structure. This is the typical response for GET /api/v1/workouts:
{
"status": boolean,
"count": int,
"total_records": int,
"total_pages": int,
"current_page": int,
"limit": int,
"workouts": [
{
"id": int,
"title": string,
"body_weight": int,
"workout_perform_date": string, // ISO date or datetime
"total_volume": int,
"totalLiftedWeight": int,
"user": {
"username": string
},
"exercises": [
{
"exercise_id": int,
"excercise_name": string,
"exercise_type": string, // e.g. "weight_reps"
"exercise_image": string, // URL
"exercise_rest_time": int,
"sets": [
{
"id": string,
"weight": string, // or float as string
"reps": string, // or int as string
"rir": string,
"duration": string,
"distance": string,
"set_type_id": string,
"is_completed": boolean,
"record_type": string,
"record_level": string,
"record_value": string
}
// ... more sets ...
]
}
// ... more exercises ...
]
}
// ... more workouts ...
]
}Notes:
workouts array.workout contains summary fields, a user object, and an exercises array.exercise contains its own sets array, with minimal set fields.The GET /api/v1/workouts/summary endpoint returns a list of workout summaries with up to 1000 records per call. The structure is as follows:
{
"status": boolean,
"count": int,
"total_records": int,
"total_pages": int,
"current_page": int,
"limit": int,
"workouts": [
{
"id": string, // or int
"title": string,
"description": string | null,
"workout_duration": string, // e.g. "01:06:25"
"total_volume": string, // or int as string
"workout_perform_date": string // ISO date or datetime, e.g. "2025-07-15 06:42:09"
}
// ... more workouts ...
]
}Notes:
status, count, total_records, total_pages, current_page, and limit.limit to control the number of records returned (up to 1000 per call).The GET /api/v1/exercises endpoint returns a list of performed exercises in the following structure:
{
"status": true,
"count": 10,
"current_page": 1,
"limit": 10,
"exercises": [
{
"id": "31",
"name": "Rear Lunge",
"image_name": "https://apilyfta.com/static/GymvisualPNG/00781101-Barbell-Rear-Lunge_Thighs_small.png",
"equipment_id": "[\"1\"]",
"body_part_id": "[\"19\",\"1\"]",
"Target_muscles_id": "[\"13\",\"27\"]",
"Synergist_muscles_id": "[\"3\",\"32\"]",
"exercise_type": "weight_reps"
},
// ... more exercises ...
]
}Notes:
exercises array contains objects for each exercise performed.equipment_id, body_part_id, Target_muscles_id, and Synergist_muscles_id are JSON-encoded arrays of IDs.Exercise metadata fields such as equipment_id, body_part_id, Target_muscles_id, and Synergist_muscles_id are returned as JSON-encoded arrays of IDs. Parse the string first, then map each ID using the tables below.
| Field | Raw value | Decoded value |
|---|---|---|
equipment_id | ["1"] | Barbell |
body_part_id | ["19","1"] | Quadriceps, Thighs |
Target_muscles_id | ["13","27"] | Gluteus Maximus, Quadriceps |
Synergist_muscles_id | ["3","32"] | Adductor Magnus, Soleus |
Used by equipment_id.
| ID | Name |
|---|---|
1 | Barbell |
2 | Body weight |
3 | Cable |
4 | Dumbbell |
5 | EZ Barbell |
6 | Leverage machine |
7 | Sled machine |
8 | Smith machine |
9 | Weighted |
10 | Assisted |
11 | Band |
12 | Battling Rope |
13 | Bosu ball |
14 | Hammer |
15 | Kettlebell |
16 | Medicine Ball |
17 | Olympic barbell |
18 | Power Sled |
19 | Resistance Band |
20 | Roll |
21 | Rollball |
22 | Rope |
23 | Stability ball |
24 | Stick |
25 | Suspension |
26 | Trap bar |
27 | Vibrate Plate |
28 | Wheel roller |
Used by body_part_id.
| ID | Name |
|---|---|
1 | Thighs |
2 | Chest |
3 | Hips |
4 | Back |
5 | Upper Arms |
6 | Shoulders |
7 | Forearms |
8 | Calves |
9 | Neck |
10 | Cardio |
11 | Full body |
12 | Waist |
13 | Plyometrics |
14 | Weightlifting |
15 | Yoga |
16 | Stretching |
17 | Biceps |
18 | Triceps |
19 | Quadriceps |
20 | Hamstrings |
Used by Target_muscles_id and Synergist_muscles_id.
| ID | Name |
|---|---|
2 | Adductor Longus |
3 | Adductor Magnus |
4 | Biceps Brachii |
5 | Brachialis |
6 | Brachioradialis |
7 | Deep Hip External Rotators |
8 | Deltoid Anterior |
9 | Deltoid Lateral |
10 | Deltoid Posterior |
11 | Erector Spinae |
12 | Gastrocnemius |
13 | Gluteus Maximus |
14 | Gluteus Medius |
15 | Gluteus Minimus |
16 | Gracilis |
17 | Hamstrings |
18 | Iliopsoas |
19 | Infraspinatus |
20 | Latissimus Dorsi |
21 | Levator Scapulae |
22 | Obliques |
23 | Pectineous |
24 | Pectoralis Major Clavicular Head |
25 | Pectoralis Major Sternal Head |
26 | Popliteus |
27 | Quadriceps |
28 | Rectus Abdominis |
29 | Sartorius |
30 | Serratus Ante |
31 | Serratus Anterior |
32 | Soleus |
33 | Splenius |
34 | Sternocleidomastoid |
35 | Subscapularis |
36 | Tensor Fasciae Latae |
37 | Teres Major |
38 | Teres Minor |
39 | Tibialis Anterior |
40 | Transverse Abdominis |
41 | Trapezius Lower Fibers |
42 | Trapezius Middle Fibers |
43 | Trapezius Upper Fibers |
44 | Triceps Brachii |
45 | Wrist Extensors |
46 | Wrist Flexors |
The GET /api/v1/exercises/progress endpoint returns progress data for a specific exercise in the following structure:
{
"status": true,
"weight_unit": "kg",
"data": [
{
"date": "2025-07-21",
"best_weight": 110,
"best_reps": 15,
"best_volume": 800,
"estimated_rm": "128"
},
{
"date": "2025-07-14",
"best_weight": 120,
"best_reps": 15,
"best_volume": 1000,
"estimated_rm": "133"
},
{
"date": "2025-06-30",
"best_weight": 80,
"best_reps": 20,
"best_volume": 1600,
"estimated_rm": "133"
}
// ... more records ...
]
}Query Parameters:
duration (required): Number of days to include in the progress data (e.g., 365 for one year).exercise_id (required): The ID of the exercise to fetch progress for (from the performed exercise list IDs).Example params object for a request:
params = {
'duration': 365, // in days
'exercise_id': 2, // from the performed exercise list ids
}Notes:
data array contains progress records for the exercise, typically grouped by date.best_weight, best_reps, and best_volume represent the best set or total for that day.estimated_rm is the estimated one-rep max, usually as a string.weight_unit indicates the unit for weight values (e.g., kg or lb).