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": 2976.4,
    "record_count": 5,
    "bytes": 317607,
    "cache_hit": false,
    "attribution": "Data © wger.de — CC-BY-SA 4.0",
    "requests": 6,
    "charged_credits": 1,
    "version": "1.0.0"
  },
  "data": {
    "results": [
      {
        "id": "57",
        "name": "Bear Walk 2",
        "bodyPart": "chest",
        "target": "Shoulders",
        "equipment": "none (bodyweight exercise)",
        "secondaryMuscles": [
          "Glutes",
          "Lats",
          "Obliquus externus abdominis",
          "Quads",
          "Trapezius"
        ],
        "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.",
          "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"
        ],
        "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": "73",
        "name": "Bench Press",
        "bodyPart": "chest",
        "target": "Chest",
        "equipment": "Barbell",
        "secondaryMuscles": [
          "Shoulders",
          "Triceps"
        ],
        "instructions": [
          "wide grip: outer chest muscles",
          "narrow grip: inner chest muscles and triceps"
        ],
        "description": "Lay down on a bench, the bar should be directly above your eyes, the knees are somewhat angled and the feet are firmly on the floor. Concentrate, breath deeply and grab the bar more than shoulder wide. Bring it slowly down till it briefly touches your chest at the height of your nipples. Push the bar up. If you train with a high weight it is advisable to have a spotter that can help you up if you can't lift the weight on your own. With the width of the grip you can also control which part of the chest is trained more: wide grip: outer chest muscles narrow grip: inner chest muscles and triceps",
        "difficulty": null,
        "category": "Chest",
        "gifUrl": "https://wger.de/media/exercise-images/192/Bench-press-1.png",
        "imageUrl": "https://wger.de/media/exercise-images/192/Bench-press-1.png",
        "license": "CC-BY-SA 3",
        "licenseAuthor": "sistab2",
        "source": "wger.de"
      },
      {
        "id": "75",
        "name": "Benchpress Dumbbells",
        "bodyPart": "chest",
        "target": "Chest",
        "equipment": "Bench",
        "secondaryMuscles": [
          "Shoulders",
          "Triceps"
        ],
        "instructions": [
          "Setup and Starting Position: Sit at the end of a flat bench with a dumbbell resting vertically against each thigh. Carefully lean back while driving the dumbbells toward your chest with your knees.",
          "The “Leg Drive” and Posture: Plant your feet firmly on the floor. Retract your shoulder blades (press them together against the bench) and maintain a slight natural lumbar curve.",
          "Starting Position: Push the dumbbells toward the ceiling. Your wrists should be aligned with your elbows. Rotate the dumbbells slightly inward (about 45 degrees) so that your elbows do not splay out too far to the sides, thereby protecting your shoulders.",
          "Eccentric Phase (Lowering): Lower the dumbbells in a controlled manner toward the sides of your chest. Your elbows should lower at an angle of about 45–60 degrees relative to your body. Feel the stretch in the lower part of your chest.",
          "Concentric Phase (Lift): Push the weight upward in a slight arc (toward the center), without letting the dumbbells collide at the top or fully locking out your elbows to maintain muscle tension. Exhale as you lift."
        ],
        "description": "Setup and Starting Position: Sit at the end of a flat bench with a dumbbell resting vertically against each thigh. Carefully lean back while driving the dumbbells toward your chest with your knees. The “Leg Drive” and Posture: Plant your feet firmly on the floor. Retract your shoulder blades (press them together against the bench) and maintain a slight natural lumbar curve. Starting Position: Push the dumbbells toward the ceiling. Your wrists should be aligned with your elbows. Rotate the dumbbells slightly inward (about 45 degrees) so that your elbows do not splay out too far to the sides, thereby protecting your shoulders. Eccentric Phase (Lowering): Lower the dumbbells in a controlled manner toward the sides of your chest. Your elbows should lower at an angle of about 45–60 degrees relative to your body. Feel the stretch in the lower part of your chest. Concentric Phase (Lift): Push the weight upward in a slight arc (toward the center), without letting the dumbbells collide at the top or fully locking out your elbows to maintain muscle tension. Exhale as you lift. Translated with DeepL.com (free version)",
        "difficulty": null,
        "category": "Chest",
        "gifUrl": "https://wger.de/media/exercise-images/97/Dumbbell-bench-press-1.png",
        "imageUrl": "https://wger.de/media/exercise-images/97/Dumbbell-bench-press-1.png",
        "license": "CC-BY-SA 3",
        "licenseAuthor": "wger.de",
        "source": "wger.de"
      },
      {
        "id": "129",
        "name": "Chest Press",
        "bodyPart": "chest",
        "target": "Chest",
        "equipment": "",
        "secondaryMuscles": [],
        "instructions": [
          "Adjust the seat height so that the grips are parallel to your chest.",
          "Use your legs to push the foot forward pedal.",
          "Bring the handles to the start position.",
          "Keep your back in contact with the back pad, press outwards.",
          "Press the handles away from your chest and exhale.",
          "Allow the handles to come in gently until they reach your chest.",
          "Allow the handles to return to your chest as you inhale."
        ],
        "description": "Adjust the seat height so that the grips are parallel to your chest. Use your legs to push the foot forward pedal. Bring the handles to the start position. Keep your back in contact with the back pad, press outwards. Press the handles away from your chest and exhale. Allow the handles to come in gently until they reach your chest. Allow the handles to return to your chest as you inhale.",
        "difficulty": null,
        "category": "Chest",
        "gifUrl": "https://wger.de/media/exercise-images/129/b263c968-e067-4750-916a-d8758a7df23e.webp",
        "imageUrl": "https://wger.de/media/exercise-images/129/b263c968-e067-4750-916a-d8758a7df23e.webp",
        "license": "CC-BY-SA 3",
        "licenseAuthor": "wger.de",
        "source": "wger.de"
      },
      {
        "id": "132",
        "name": "Burpees",
        "bodyPart": "chest",
        "target": "",
        "equipment": "",
        "secondaryMuscles": [],
        "instructions": [
          "Jump, lay down on your chest, do a pushup then jump, repeat"
        ],
        "description": "Jump, lay down on your chest, do a pushup then jump, repeat",
        "difficulty": null,
        "category": "Chest",
        "gifUrl": null,
        "imageUrl": null,
        "license": "CC-BY-SA 4",
        "licenseAuthor": "er0355",
        "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. 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
nameoptional—Free-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 = 2optional—wger 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
bodypartrequired—Body 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 = 2optional—wger 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
equipmentrequired—Equipment 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 = 2optional—wger 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
targetrequired—Target 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 = 2optional—wger 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
idrequired—A single wger exercise id (the `id` of a search/filter result).
language = 2optional—wger language id for names/instructions (2 = English, 1 = German, 4 = Russian, 5 = Spanish, …). Defaults to English.
Try in playground →
post/fitness/v1/bodypart_list1 credit

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_list1 credit

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_list1 credit

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

Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.