ExerciseGIF

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.

Shell
curl https://api.exercisegif.com/v1/exercises/squat \
  -H "Authorization: Bearer $EXERCISEGIF_KEY"
JavaScript
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 highlighted

Endpoints

EndpointWhat it returns
GET /exercisesSearch 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 /musclesEvery 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.

Exercises that work the glutes
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.

ParameterValuesNotes
sexfemale, maleWhich figure. Defaults to female.
formatgif, webp, mp4File type. Defaults to gif.
size480, 720Square size in pixels. Defaults to 480.
backgroundwhite, darkBackground 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"}.

GET /exercises/squat
{
  "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.