API documentation
Everything you need to fetch exercises and their animations. Base URL https://api.exercisegif.com/v1.
Quickstart
Send your key as a bearer token on every request. Keys are issued per project; keep them on your server, never in a browser or app bundle.
Then fetch an exercise and use one of the media links it returns.
curl https://api.exercisegif.com/v1/exercises/squat \
-H "Authorization: Bearer $EXERCISEGIF_KEY"const res = await fetch("https://api.exercisegif.com/v1/exercises/squat", {
headers: { Authorization: `Bearer ${process.env.EXERCISEGIF_KEY}` },
});
const squat = await res.json();
squat.media.male.gif; // animated, worked muscles highlightedEndpoints
| Endpoint | What it returns |
|---|---|
GET /exercises | Search and list exercises. Filter by name, muscle or equipment. |
GET /exercises/{id} | One exercise: muscles, steps, tips and media links for both figures. |
GET /media/{id} | The animation itself, as GIF, WebP or MP4, female or male, 480 or 720 px. |
GET /muscles | Every muscle we highlight, with plain and Latin names. |
Searching
GET /exercises accepts q (name), muscle, equipment, limit (up to 100) and cursor for the next page.
curl "https://api.exercisegif.com/v1/exercises?muscle=glutes" \
-H "Authorization: Bearer $EXERCISEGIF_KEY"Media parameters
Used on /media/{id}. The links in every exercise response already include them.
| Parameter | Values | Notes |
|---|---|---|
sex | female, male | Which figure. Defaults to female. |
format | gif, webp, mp4 | File type. Defaults to gif. |
size | 480, 720 | Square size in pixels. Defaults to 480. |
background | white, dark | Background colour. Defaults to white. |
Response
Every exercise has the same shape. muscles lists the muscles highlighted in the animation. loopSeconds is the length of one repetition.
Errors use standard HTTP codes with a JSON body: {"error": "not_found", "message": "No exercise with id squatt"}.
{
"id": "squat",
"name": "Squat",
"equipment": "Barbell",
"muscles": [
{
"id": "quadriceps",
"name": "Quadriceps",
"latin": "Musculus quadriceps femoris"
},
{
"id": "glutes",
"name": "Glutes",
"latin": "Musculus gluteus maximus"
},
{
"id": "hamstrings",
"name": "Hamstrings",
"latin": "Musculi ischiocrurales"
},
{
"id": "adductors",
"name": "Inner thighs",
"latin": "Musculi adductores"
},
{
"id": "lowerBack",
"name": "Lower back",
"latin": "Musculus erector spinae"
}
],
"steps": [
"Set the barbell at chest height in the squat rack and position safety bars just below your lowest squat position",
"Step under the bar and position it on your upper traps, gripping the bar with hands evenly placed wider than shoulder-width",
"..."
],
"loopSeconds": 3.6,
"media": {
"female": {
"gif": "https://api.exercisegif.com/v1/media/squat?sex=female&format=gif&size=480",
"webp": "https://api.exercisegif.com/v1/media/squat?sex=female&format=webp&size=480",
"mp4": "https://api.exercisegif.com/v1/media/squat?sex=female&format=mp4&size=720"
},
"male": {
"gif": "https://api.exercisegif.com/v1/media/squat?sex=male&format=gif&size=480",
"webp": "https://api.exercisegif.com/v1/media/squat?sex=male&format=webp&size=480",
"mp4": "https://api.exercisegif.com/v1/media/squat?sex=male&format=mp4&size=720"
}
}
}Limits and keys
Rate limits, plans and key signup are being finalised. Request early access and we will send a key when the API opens. Prefer an assistant integration? See the MCP server.