Liftmanual APIliftmanual.com ↗
Access Liftmanual.com's exercise library via API. Browse strength, cardio, and stretching exercises with step-by-step instructions, muscle tags, and animated demos.
What is the Liftmanual API?
The Liftmanual.com API exposes 4 endpoints covering the full exercise library at liftmanual.com, including step-by-step instructions, animated form demonstrations, and tagged muscle and equipment metadata. Use list_exercises to paginate or filter the catalog by category, muscle, equipment, or title search, and get_exercise to retrieve a single exercise's complete guide including ordered instruction steps, benefits, variations, and the animated WebP demonstration image.
curl -X GET 'https://api.parse.bot/scraper/94b7b378-fc0e-4858-a222-faed8673c2e5/list_exercises?muscle=abs&category=strength' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace liftmanual-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: browse Lift Manual exercises by muscle, then drill into full details."""
from parse_apis.liftmanual_com_api import LiftManual, Category, ExerciseNotFound
client = LiftManual()
# List available muscles and pick the first one to use as a filter.
muscle = client.muscles.list(limit=5).first()
if muscle is not None:
print(f"{muscle.name}: {muscle.exercise_count} exercises")
# Find strength exercises for that muscle.
for summary in client.exercise_summaries.list(
muscle=muscle.slug, category=Category.STRENGTH, limit=3
):
print(summary.title, summary.category, [t.name for t in summary.muscles])
# Navigate from summary to full exercise guide.
detail = summary.details()
print(" instructions:", len(detail.instructions), "steps")
print(" animation:", detail.animation_url)
if detail.variations:
print(" variations:", [v.name for v in detail.variations[:3]])
# Point lookup by slug, with typed error handling.
try:
exercise = client.exercises.get(slug="barbell-squat")
print(exercise.title, exercise.muscles, exercise.equipment)
print("benefits:", exercise.benefits)
except ExerciseNotFound:
print("exercise not found")
# Browse equipment catalog.
for equip in client.equipment.list(limit=5):
print(equip.name, equip.exercise_count)
print("exercised: muscles.list / exercise_summaries.list / details / exercises.get / equipment.list")
Lists exercises from the strength, cardio and stretching categories, newest first, one row per exercise. Optional filters narrow by category, by one muscle slug, by one equipment slug, and by a free-text search over titles; filters combine with AND. Each row carries the exercise slug (the input for get_exercise), a static thumbnail image, and its muscle/equipment tags; the animated form demonstration is only available from get_exercise. Paginated via page and per_page: page defaults to 1 and per_page to 20 (1 to 100). total and total_pages come from the site's own counts for the applied filters; a page beyond total_pages returns an empty list with null totals and has_more false. An unknown muscle or equipment slug returns an empty list with total 0. One round trip, plus one lookup request per muscle/equipment filter supplied.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based results page. |
| muscle | string | Muscle slug from list_muscles.muscles[*].slug (e.g. hamstrings). Unknown slugs yield an empty list. |
| search | string | Free-text search term matched against exercise titles (e.g. squat). |
| category | string | Exercise category filter. Omitted = all three exercise categories. |
| per_page | integer | Rows per page, 1 to 100. |
| equipment | string | Equipment slug from list_equipment.equipment[*].slug (e.g. bodyweight). Unknown slugs yield an empty list. |
{
"type": "object",
"fields": {
"page": "page echoed back",
"total": "total matching exercises reported by the site (null when the page is beyond the last page)",
"has_more": "true when a following page exists",
"per_page": "page size echoed back",
"exercises": "array of exercise summaries: id (site post id), slug (use with get_exercise), title, url, image_url (static thumbnail), category slug, muscles and equipment as arrays of {slug, name}, published_at and modified_at as site-local ISO timestamps",
"total_pages": "number of pages at this per_page (null when the page is beyond the last page)"
},
"sample": {
"data": {
"page": 1,
"total": 69,
"has_more": true,
"per_page": 3,
"exercises": [
{
"id": 392060,
"url": "https://liftmanual.com/hands-reversed-clasped-circular-toe-touch/",
"slug": "hands-reversed-clasped-circular-toe-touch",
"title": "Hands Reversed Clasped Circular Toe Touch",
"muscles": [
{
"name": "Hamstrings",
"slug": "hamstrings"
},
{
"name": "Lower Back",
"slug": "lower-back"
}
],
"category": "stretching",
"equipment": [
{
"name": "Bodyweight",
"slug": "bodyweight"
}
],
"image_url": "https://liftmanual.com/wp-content/uploads/2026/05/hands-reversed-clasped-circular-toe-touch.jpg",
"modified_at": "2026-05-05T15:57:14",
"published_at": "2026-05-02T08:18:00"
}
],
"total_pages": 23
},
"status": "success"
}
}About the Liftmanual API
Exercise Catalog Browsing
The list_exercises endpoint returns a paginated list of exercises across the strength, cardio, and stretching categories, sorted newest first. Each result row includes the exercise id, slug, title, url, a static image_url thumbnail, and category. You can combine filters — muscle (a slug from list_muscles), equipment (a slug from list_equipment), category, and a free-text search over titles — and all active filters apply with AND logic. Pagination is controlled by page and per_page (1–100); the response echoes both and includes total, total_pages, and has_more.
Full Exercise Detail
The get_exercise endpoint accepts an exercise slug from list_exercises and returns the complete guide for that exercise. Key fields include instructions (an ordered array of step strings), benefits (array of benefit strings), muscles and equipment (arrays of tagged slugs), category, variations (each with name, slug, and url), image_url (static cover), and animation_url — the animated WebP image demonstrating proper form. Both slug and url on variation entries are null when a variation has no linked exercise page on the site.
Taxonomy Lookups
Before filtering list_exercises, use list_muscles and list_equipment to retrieve valid filter slugs. Both endpoints require no inputs and return a flat array of tag objects: id, slug, name, and exercise_count. Passing an unrecognized slug to either the muscle or equipment filter in list_exercises returns an empty exercise list rather than an error, so validating slugs against these taxonomy endpoints first is recommended.
The Liftmanual API is a managed, monitored endpoint for liftmanual.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when liftmanual.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official liftmanual.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a workout app that filters exercises by muscle group using
list_exerciseswith themuscleparameter. - Generate equipment-specific workout plans by filtering with valid slugs from
list_equipment. - Embed animated form demonstrations in a fitness app using the
animation_urlfield fromget_exercise. - Populate a static exercise database with step-by-step
instructionsandbenefitsfor each exercise. - Surface exercise alternatives and progressions using the
variationsarray returned byget_exercise. - Build a searchable exercise index using the
searchparameter inlist_exercisesagainst exercise titles. - Audit exercise coverage per muscle group by reading
exercise_countfromlist_muscles.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Liftmanual.com have an official developer API?+
What does `get_exercise` return beyond the basic exercise info?+
get_exercise returns an ordered instructions array of step strings, a benefits array, tagged muscles and equipment slug arrays, a category slug, the static image_url, the animation_url (an animated WebP demonstrating form), and a variations array where each entry has name, slug, and url. When a variation has no linked page on the site, its slug and url fields are null.Can I filter exercises by more than one muscle or equipment type at once?+
list_exercises endpoint accepts a single muscle slug and a single equipment slug per request. Filtering across multiple muscles or multiple equipment types simultaneously is not currently supported. You can fork this API on Parse and revise it to add multi-value filter support.Does the API include user-generated content like ratings, comments, or saved workout data?+
What happens if I pass an unrecognized slug to the `muscle` or `equipment` filter?+
muscle or equipment parameter in list_exercises returns an empty exercise list rather than an error response. Use list_muscles and list_equipment first to retrieve valid slugs before constructing filter queries.