The exercise library your app was going to spend a year building.

1,492 exercises filmed with real people in one studio, each with a looping video, a start-and-end still, hand-checked classification, coaching cues, French, and a map of what can replace what. One API.

1,492exercises, all filmed
2assets each: clip + still
19 · 22 · 16muscles · equipment · patterns
6,102substitute links, with reasons
EN + FRnames, descriptions, cues

Straight from the API

Eight of the exercises, as your app would receive them. Real clips, streamed from our CDN through short-lived links.

Three calls and you have a workout screen

1. Search

By text, muscle, the gear the user has, movement pattern, difficulty, impact, or "nothing that loads the knee".

GET /v1/exercises?muscle=glutes
  &equipment=dumbbell,bench
  &excludeJoints=knee&maxDifficulty=3

2. Substitute

Every exercise knows its replacements, ranked, each with a plain-English reason.

GET /v1/exercises/tc-2000/substitutes
→ "same hinge pattern, 100%
   primary-muscle overlap, no knee load"

3. Play

Ask for the exercises on screen, say who is watching, and get signed video and still URLs, valid 15 minutes.

POST /v1/media/urls
X-End-User: u_8f3a
→ mp4: https://media…/360p.mp4
         ?token=…&expires=…

What every record carries

{
  "id": "tc-2000",
  "name": "Ab slam",
  "nameFr": "Slam abdominal",
  "variant": "Abs- Slam",
  "description": "Stand tall with your hands clasped…",
  "primaryMuscles": ["abs"],
  "secondaryMuscles": ["shoulders","back","hamstrings"],
  "equipment": ["bodyweight"],
  "movementPattern": "core-flexion",
  "difficulty": 1,
  "loadedJoints": ["lumbar-spine","shoulder"],
  "impact": "low",
  "unilateral": false,
  "cues": ["Reach tall before you go down", …],
  "cuesFr": ["Étire-toi bien avant de descendre", …],
  "aliases": ["bodyweight slam","standing ab chop"],
  "media": { "mp4": "…/360p.mp4", "still": "…/static.jpg" }
}

Classified by watching, not by guessing

Every field was set by looking at the clip, then reviewed by a coach. Names lie; a "sled push" filmed on sliders is tagged sliders.

Video that fits in a request

Clips are 640×360, silent, about eight seconds, and about 120 KB, so they start instantly on a phone. Stills show the start and the end position side by side. 4K masters exist for HD renditions.

Injury-aware

loadedJoints lets you drop everything that loads a sore knee or shoulder in one filter, and the substitute map fills the gap.

Bilingual

French names, descriptions and cues, growing to the full catalogue.

Licensed to you, not to whoever finds the link

Signed, expiring media

Video and stills live on our CDN behind links that die in minutes. Your app asks for fresh ones as it needs them; it never hosts a file.

Counted per end user

You tell us who is watching (an opaque id). That is how plans are measured and how a crawl is told apart from a workout.

A catalogue that keeps moving

Corrections, new shoots, more French. Every version ships a changelog with the ids added, changed and removed, so your sync is a diff, not a re-import.

Who builds on it

Fitness apps

Workout builders, trackers, habit apps that need real demonstrations.

Coaching platforms

Trainers writing programs need search by gear and a substitute one tap away.

Physio and rehab

Joint-load filters and low-impact selections, in French and English.

AI trainers

A grounded vocabulary: your model proposes, the catalogue guarantees the exercise exists and how it is done.

Start free. Pay when you ship.

The sandbox has the whole catalogue and video for 50 exercises. Paid plans start at $89 a month.