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

GET /api/v1/workouts # Retrieve a list of workouts with details(see data structure)GET /api/v1/workouts/summary # Retrieve a list of workouts with summary data(see summary data structure)GET /api/v1/exercises # Retrieve a list of the performed exercises(see exercise data structure)GET /api/v1/exercises/progress # Retrieve exercise progress data(see exercise progress data structure)

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 workouts array.
  • Each workout contains summary fields, a user object, and an exercises array.
  • Each exercise contains its own sets array, 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, and limit.
  • Use limit to 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 exercises array 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, and Synergist_muscles_id are 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., 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
}
  • Both parameters are required for the endpoint to return data.

Notes:

  • The 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).