List exercises
Return a cursor-paginated exercise collection, with search and filters for muscle, equipment, category, and artwork availability.
Build exercise pickers, workout builders, and browse screens from the collection. Filters combine, and each combination is one request — “exercises for lats with a barbell” needs no client-side intersection.
https://api.gymassets.dev/v1/exercises curl 'https://api.gymassets.dev/v1/exercises?muscle=lats&equipment=barbell' \
-H "Authorization: Bearer $GA_SECRET_KEY"{
"data": [
{
"slug": "standing-squat-with-barbell",
"name": "squat with barbell",
"category": "strength",
"difficulty": "intermediate",
"posture": "standing",
"muscles": { "primary": ["glutes"], "secondary": ["abs", "calves", "hamstrings", "quads"] },
"equipment": ["barbell"],
"frames": []
}
],
"next": "opaque cursor"
}Query parameters
| Parameter | Accepted values |
|---|---|
q | Free text, matched against the name and slug |
muscle | A muscle id from /v1/muscles |
equipment | An equipment id from /v1/equipment |
category | A value from /v1/exercise-categories |
difficulty | A value from /v1/exercise-difficulties |
posture | A value from /v1/exercise-postures |
movement | A value from /v1/exercise-movements |
grip | A value from /v1/exercise-grips |
drawn | true or false |
cursor | The next value of the previous page |
A value outside its vocabulary returns 400 unknown_value with the accepted list.
An empty page is a real answer: the filters matched nothing.
The page size is fixed and no parameter changes it — pagination states the contract and the refusal.
Filter by artwork availability
drawn=true returns only exercises whose illustration frames are published, and
drawn=false returns the rest. A picker that must never show a silhouette
stand-in builds from drawn=true; a catalogue browser that accepts them takes the
whole collection. Render exercise art states
how the two cases differ in the response.