API Access
Your API key provides programmatic access to your Lyfta data. Use the button below to generate an API key.
Important Notes:
- Generating a new API key will automatically revoke and replace any previously active key.
- Your API key is displayed only once upon generation. Please copy and store it in a safe place immediately. You will not be able to retrieve it again.
Rate Limits
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.
Endpoints
Base URL: https://my.lyfta.app
All requests must include the following header:
Authorization: Bearer YOUR_API_KEY
Pagination
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.
Python Example
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)
Data Structures
Workout Data Structure
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:
- The top-level object contains pagination and status fields, and a
workoutsarray. - Each
workoutcontains summary fields, auserobject, and anexercisesarray. - Each
exercisecontains its ownsetsarray, with minimal set fields. - Some fields may be optional or null depending on the workout type.
Workout Summary Data Structure
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:
- The summary object omits exercise and set details, providing only high-level workout information.
- All fields are strings except for
status,count,total_records,total_pages,current_page, andlimit. - Use
limitto control the number of records returned (up to 1000 per call).
Exercise Data Structure
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:
- The
exercisesarray contains objects for each exercise performed. - IDs may be strings or numbers depending on the source.
- Fields like
equipment_id,body_part_id,Target_muscles_id, andSynergist_muscles_idare JSON-encoded arrays of IDs. - Some fields may be optional or null depending on the exercise.
Exercise Progress Data Structure
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.,365for 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
}
- Both parameters are required for the endpoint to return data.
Notes:
- The
dataarray contains progress records for the exercise, typically grouped by date. best_weight,best_reps, andbest_volumerepresent the best set or total for that day.estimated_rmis the estimated one-rep max, usually as a string.weight_unitindicates the unit for weight values (e.g., kg or lb).