Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Fitness & Nutrition API page →
Utilities & AI

Fitness & Nutrition API

The Fitness API returns an exercise database as clean JSON.

8 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary exercises endpoint returns exercises with id, name, body part, target, equipment, secondary muscles, instructions and an animated demonstration, and you can filter by body part, equipment or target, pull an exercise_detail and list body parts and equipment. It is built for fitness apps and workout builders that need structured exercise data. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

The three vocabularies, and the field shapes that catch people out

This is exercise reference data, not nutrition data. Three list actions hand you the exact strings the filters accept, and one of them contains two overlapping naming systems at once. Everything below was measured on live calls: target_list, equipment_list and bodypart_list in full, exercise_detail for id 1962, and by_bodypart, by_equipment and by_target sweeps in English and German.

Vocabulary or fieldMeasured valuesHow to use it
target_list15 muscles: Abs, Biceps, Brachialis, Calves, Chest, Glutes, Hamstrings, Lats, Obliquus externus abdominis, Quads, Serratus anterior, Shoulders, Soleus, Trapezius, TricepsThese are wger's anatomical names, so pass 'Quads' rather than 'quadriceps', and expect Latin names like Obliquus externus abdominis. Matching is by substring and case-insensitive.
equipment_list12 entries: Barbell, Bench, Cable machine, Dumbbell, Gym mat, Incline bench, Kettlebell, Pull-up bar, Resistance band, SZ-Bar, Swiss Ball, none (bodyweight exercise)SZ-Bar is the EZ-curl bar. Bodyweight exercises carry the literal string 'none (bodyweight exercise)', and passing equipment='none' matches them.
bodypart_list16 entries that are really two overlapping sets: capitalized categories (Abs, Arms, Back, Calves, Cardio, Chest, Legs, Shoulders) and lowercase legacy labels (back, cardio, chest, lower legs, shoulders, upper arms, upper legs, waist)Both work. 'Legs' and 'upper legs' return the same records, and 'chest' and 'Chest' returned byte-identical responses.
category vs bodyPartEvery record carries both: category is the capitalized wger category ('Legs', 'Cardio'), bodyPart is the lowercase legacy label ('upper legs', 'cardio')Group on category if you want eight clean buckets. bodyPart is finer but inconsistent.
idA string, even though exercise_detail's id parameter is typed as an integer: '1962', '73', '12'Cast before you compare. Ids are stable across languages: id 12 is 'Seated Hip Adduction' in English and 'Adduktoren-Maschine' in German.
countMeans different things per actionOn the exercises action it is 861, the size of the whole library, regardless of how many rows you asked for. On by_bodypart, by_equipment and by_target it is the number of rows actually returned.
gifUrl / imageUrlIdentical values, and they point at static .png files rather than animations. Both are null on many records.The number inside the URL path is not always the exercise id: 'Bench Press' is id 73 but its image sits under /exercise-images/192/.
empty vs nulldifficulty was null on every record we read. target and equipment come back as empty strings, and secondaryMuscles as an empty array, when wger has nothing.Check for '' as well as null before you branch.
languageAn integer wger language id: 2 English (the default), 1 German, 4 Russian, 5 SpanishIt changes names and instructions, not ids, so you can build a multi-language catalog keyed on the same id.
license / licenseAuthorPer record: 'CC-BY-SA 4', 'CC-BY-SA 3' or 'CC0', with a contributor handle such as 'nate303303' or 'sistab2'meta.attribution reads 'Data © wger.de — CC-BY-SA 4.0'. Records differ, so carry the per-record license through if you republish.

An unrecognized filter value is not rejected. by_bodypart with 'zzzz' returned ok:true with results: [] and count: 0, and by_equipment and by_target behave the same way. Check count rather than trusting the 200.

Live example

Real request and response JSON

Captured from the indexed primary action, by_bodypart, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/fitness/v1/by_bodypart",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "bodypart": "chest",
    "limit": 5
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "fitness",
    "endpoint": "by_bodypart",
    "mode": "live",
    "latency_ms": 3587.4,
    "record_count": 5,
    "bytes": 315406,
    "cache_hit": false,
    "attribution": "Data © wger.de — CC-BY-SA 4.0",
    "requests": 6
  },
  "data": {
    "results": [
      {
        "id": "1964",
        "name": "[redacted-name]",
        "bodyPart": "chest",
        "target": "Chest",
        "equipment": "none (bodyweight exercise)",
        "secondaryMuscles": [
          "Abs",
          "Triceps"
        ],
        "instructions": [
          "​Setup: Place hands wider than shoulder-width apart on the floor.",
          "Lower: Descend until your chest nearly touches the floor, keeping your core tight.",
          "​Push: Drive through your palms to return to the start position."
        ],
        "description": "​A push-up variation with a wider hand placement to increase the emphasis on the outer chest muscles and shoulders. ​Setup: Place hands wider than shoulder-width apart on the floor. Lower: Descend until your chest nearly touches the floor, keeping your core tight. ​Push: Drive through your palms to return to the start position. ​Form: Don't let your lower back sag; keep a straight line from head to heels.",
        "difficulty": null,
        "category": "Chest",
        "gifUrl": null,
        "imageUrl": null,
        "license": "CC-BY-SA 4",
        "licenseAuthor": "Anon#2",
        "source": "wger.de"
      },
      {
        "id": "57",
        "name": "[redacted-name]",
        "bodyPart": "chest",
        "target": "Shoulders",
        "equipment": "none (bodyweight exercise)",
        "secondaryMuscles": [
          "Glutes",
          "Lats",
          "Obliquus externus abdominis"
        ],
        "instructions": [
          "-Rest your weight on your palms and the balls of your feet, not dissimilar to normal pushup position -Move by stepping with your R palm and L foot, then your L palm and R foot.",
          "Basically, walk like a lumbering bear.",
          "-Move as fast as you can."
        ],
        "description": "-Rest your weight on your palms and the balls of your feet, not dissimilar to normal pushup position -Move by stepping with your R palm and L foot, then your L palm and R foot. Basically, walk like a lumbering bear. -Move as fast as you can. Measure your reps/sets in either distance (i.e. 40 yards) or time (i.e. 45 seconds) -Works your Pecs, Deltoids, Triceps, Traps, Lats, Abs and Lower Back, Hip Flexors, Quads, Glutes and Calves",
        "difficulty": null,
        "category": "Chest",
        "gifUrl": null,
        "imageUrl": null,
        "license": "CC-BY-SA 4",
        "licenseAuthor": "nate303303",
        "source": "wger.de"
      },
      {
        "id": "996",
        "name": "[redacted-name]",
        "bodyPart": "chest",
        "target": "",
        "equipment": "none (bodyweight exercise)",
        "secondaryMuscles": [],
        "instructions": [
          "Move one knee toward the center of your body, towards your elbows, keeping the other leg extended.",
          "In a quick jumping movement, straighten the bent leg out and pull the other knee toward your body.",
          "Keep repeating step 2, alternating legs."
        ],
        "description": "Starting position: Start in the upright push-up position, aka. the high plank position.Hands should be directly under your shoulders.Keep your head in line with your back, facing the floor.Feet should be about hip-width apart. Steps: Move one knee toward the center of your body, towards your elbows, keeping the other leg extended. In a quick jumping movement, straighten the bent leg out and pull the other knee toward your body. Keep repeating step 2, alternating legs. Notes: Throughout the exercise, your back should remain as straight as possible – avoid a hump or a sagging back.",
        "difficulty": null,
        "category": "Chest",
        "gifUrl": null,
        "imageUrl": null,
        "license": "CC-BY-SA 4",
        "licenseAuthor": "",
        "source": "wger.de"
      }
    ],
    "count": 5,
    "bodypart": "chest"
  }
}
Actions

What the Fitness & Nutrition API does

ActionDescriptionConcrete use caseKey params
exercisesBrowse or search the full exercise library (800+ exercises from wger.de). Filter by name keyword; returns each exercise's name, body part, target muscle, equipment, step-by-step instructions, and animation URL.Ops teams call exercises to get browse or search the full exercise library (800+ exercises from wger.de).name, term, limit, offset, language
by_bodypartAll exercises targeting a specific body part — e.g. 'chest', 'back', 'shoulders', 'upper arms', 'waist'. Returns name, target muscle, equipment, and instructions for each.Developer tools call by_bodypart to get all exercises targeting a specific body part.bodypart, bodyPart, limit, offset, language
by_equipmentAll exercises that use a specific piece of equipment — e.g. 'barbell', 'dumbbell', 'kettlebell', 'none' (bodyweight). Returns name, target muscle, body part, and instructions.Validation workflows call by_equipment to get all exercises that use a specific piece of equipment.equipment, limit, offset, language
by_targetAll exercises that target a specific muscle — e.g. 'biceps', 'triceps', 'quads', 'glutes', 'lats'. Returns name, equipment, body part, and step-by-step instructions.Data-quality teams call by_target to get all exercises that target a specific muscle.target, limit, offset, language
exercise_detailFull detail for a single exercise by its id — name, body part, primary and secondary muscles, equipment, step-by-step instructions, animation URL, and license.Ops teams call exercise_detail to get full detail for a single exercise by its id.id, exercise_id, language
bodypart_listList all available body part categories (e.g. chest, back, shoulders, waist, cardio). Use these values with the by_bodypart action.Developer tools call bodypart_list to list all available body part categories (e.g.none
equipment_listList all available equipment types (e.g. barbell, dumbbell, kettlebell, none). Use these values with the by_equipment action.Validation workflows call equipment_list to list all available equipment types (e.g.none
target_listList all available target muscles (e.g. biceps, triceps, quads, glutes, lats). Use these values with the by_target action.Data-quality teams call target_list to list all available target muscles (e.g.none
Code samples

Call by_bodypart from your stack

curl -X POST https://api.reefapi.com/fitness/v1/by_bodypart \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"bodypart":"chest","limit":5}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.fitness.by_bodypart with {"bodypart":"chest","limit":5}.
Use cases

Who uses this API and why

  • Fitness apps call by_bodypart or by_equipment to build targeted workouts.
  • Trainers use exercise_detail for step-by-step instructions.
  • Apps use the demonstration media to show correct form.
FAQ

Questions developers ask before integrating

Does this return calories, macros or any nutrition data?

No. It is exercise reference data only. A record holds name, bodyPart, category, target, secondaryMuscles, equipment, an instructions array, a description, an image URL and licensing. There is no kcal or kJ figure, no per-100g or per-serving nutrition block, and no food database behind it.

Why does bodypart_list contain both 'chest' and 'Chest'?

The list exposes two naming systems that both exist in the underlying data. The capitalized entries are wger's own categories (Abs, Arms, Back, Calves, Cardio, Chest, Legs, Shoulders) and the lowercase ones are the legacy body-part labels (back, cardio, chest, lower legs, shoulders, upper arms, upper legs, waist). Both are accepted, matching is case-insensitive, and 'Legs' and 'upper legs' resolve to the same records. Every result carries both, as category and bodyPart.

Which muscle names does by_target accept?

The 15 in target_list, and they use wger's anatomical vocabulary rather than gym slang: Abs, Biceps, Brachialis, Calves, Chest, Glutes, Hamstrings, Lats, Obliquus externus abdominis, Quads, Serratus anterior, Shoulders, Soleus, Trapezius, Triceps. So 'Quads' works and 'quadriceps' does not, and there is no separate entry for abductors or forearms. Matching is by substring, so 'bicep' also hits Biceps.

Is the exercise id a number or a string?

The response gives it as a string ('1962', '73') while exercise_detail's id parameter is typed as an integer. Both directions work, but if you are keying a cache or diffing two responses, cast one side. Ids are stable across languages, so id 12 is the same exercise whether you ask in English or German.

Why is count 861 on one action and 3 on another?

The exercises action reports the size of the whole library, 861 exercises, no matter how many rows it returns, and pages with next_offset. The three filter actions report the number of rows actually in that response instead. So do not use count as a page-size check on exercises, and do not read it as a library total on by_bodypart, by_equipment or by_target.

Is gifUrl actually an animation?

No. gifUrl and imageUrl hold the same value and it points at a static .png on wger's media host. Many exercises have neither, in which case both are null. The number inside the image path is not reliably the exercise id: 'Bench Press' has id 73 but its image lives under /exercise-images/192/, so build image URLs from the field rather than by templating the id.

What happens if I pass a body part or equipment name that does not exist?

You get a 200 with ok:true, results: [] and count: 0, not an error. by_bodypart with 'zzzz' behaved exactly that way. Because matching is by substring, a near-miss can also return a smaller set than you expected rather than nothing at all. Call bodypart_list, equipment_list or target_list once, cache the strings, and check count on every response.

Do I have to credit wger?

Yes, if you republish. The data comes from wger.de and each record carries its own license field, which was 'CC-BY-SA 4', 'CC-BY-SA 3' or 'CC0' across the records we read, plus a licenseAuthor contributor handle. The response meta also carries an attribution string. Because the license varies per record, keep license and licenseAuthor attached to anything you store.

Can I search exercises by name?

Not dependably right now. The exercises action takes a name parameter, but in our tests name='press', name='squat' and a deliberate nonsense string all returned the identical first page of the unfiltered library with count 861. Filter with by_bodypart, by_equipment or by_target, which we verified do narrow the result set, and match on the name field client-side if you need a keyword.

What is the Fitness & Nutrition API?

Fitness & Nutrition API is a ReefAPI endpoint group for exercise and nutrition data for foods and workouts. It returns live JSON through POST requests under /fitness/v1.

Is the Fitness & Nutrition API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Fitness & Nutrition calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Fitness & Nutrition login or account?

No login to Fitness & Nutrition is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Fitness & Nutrition data?

The page example is captured from a live exercises call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Fitness & Nutrition API use?

Fitness & Nutrition actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

docs / fitness

Fitness & Nutrition

Exercise and nutrition data for foods and workouts.

base /fitness/v18 endpoints
post/fitness/v1/exercises1 credit

Browse or search the full exercise library (800+ exercises from wger.de). Filter by name keyword; returns each exercise's name, body part, target muscle, equipment, step-by-step instructions, and animation URL.

ParameterAllowed / rangeDescription
nameoptionalFree-text search term to filter exercises by name.
limit = 20optional1–100Results per page (1-100, default 20). Larger values are clamped to 100.
offset = 0optional0–Pagination offset (skip N results). Page forward with meta.next_offset.
language = 2optionalwger language id for names/instructions (2 = English, 1 = German, 4 = Russian, 5 = Spanish, …). Defaults to English.
Try in playground →
post/fitness/v1/by_bodypart1 credit

All exercises targeting a specific body part — e.g. 'chest', 'back', 'shoulders', 'upper arms', 'waist'. Returns name, target muscle, equipment, and instructions for each.

ParameterAllowed / rangeDescription
bodypartrequiredBody part / category to filter by (e.g. chest, back, shoulders, upper arms, upper legs, lower legs, waist, cardio). Matched by substring; use bodypart_list for the live options.
limit = 20optional1–100Results per page (1-100, default 20). Larger values are clamped to 100.
offset = 0optional0–Pagination offset (skip N results). Page forward with meta.next_offset.
language = 2optionalwger language id for names/instructions (2 = English, 1 = German, 4 = Russian, 5 = Spanish, …). Defaults to English.
Try in playground →
post/fitness/v1/by_equipment1 credit

All exercises that use a specific piece of equipment — e.g. 'barbell', 'dumbbell', 'kettlebell', 'none' (bodyweight). Returns name, target muscle, body part, and instructions.

ParameterAllowed / rangeDescription
equipmentrequiredEquipment name to filter by (e.g. barbell, dumbbell, kettlebell, none). Matched by substring; use equipment_list for the live options.
limit = 20optional1–100Results per page (1-100, default 20). Larger values are clamped to 100.
offset = 0optional0–Pagination offset (skip N results). Page forward with meta.next_offset.
language = 2optionalwger language id for names/instructions (2 = English, 1 = German, 4 = Russian, 5 = Spanish, …). Defaults to English.
Try in playground →
post/fitness/v1/by_target1 credit

All exercises that target a specific muscle — e.g. 'biceps', 'triceps', 'quads', 'glutes', 'lats'. Returns name, equipment, body part, and step-by-step instructions.

ParameterAllowed / rangeDescription
targetrequiredTarget muscle to filter by (e.g. biceps, triceps, quads, glutes). Matched by substring; use target_list for the live options.
limit = 20optional1–100Results per page (1-100, default 20). Larger values are clamped to 100.
offset = 0optional0–Pagination offset (skip N results). Page forward with meta.next_offset.
language = 2optionalwger language id for names/instructions (2 = English, 1 = German, 4 = Russian, 5 = Spanish, …). Defaults to English.
Try in playground →
post/fitness/v1/exercise_detail1 credit

Full detail for a single exercise by its id — name, body part, primary and secondary muscles, equipment, step-by-step instructions, animation URL, and license.

ParameterAllowed / rangeDescription
idrequiredA single wger exercise id (the `id` of a search/filter result).
language = 2optionalwger language id for names/instructions (2 = English, 1 = German, 4 = Russian, 5 = Spanish, …). Defaults to English.
Try in playground →
post/fitness/v1/bodypart_listfree

List all available body part categories (e.g. chest, back, shoulders, waist, cardio). Use these values with the by_bodypart action.

Try in playground →
post/fitness/v1/equipment_listfree

List all available equipment types (e.g. barbell, dumbbell, kettlebell, none). Use these values with the by_equipment action.

Try in playground →
post/fitness/v1/target_listfree

List all available target muscles (e.g. biceps, triceps, quads, glutes, lats). Use these values with the by_target action.

Try in playground →