Champs de la réponse de l'API FitExerciseDB
2026-10-02 · 6 min
Un objet exercice FitExerciseDB compte 16 champs. Cinq sont toujours présents (id, name, bodyPart, target et equipment) et les onze autres peuvent valoir null ou manquer, donc un client doit les traiter comme facultatifs. Les listes enveloppent les exercices dans data et pagination, un appel sur un seul exercice ajoute un objet _links, et le paramètre lang modifie les textes mais jamais les nombres. Cette page est la référence champ par champ du JSON de type ExerciseDB que renvoie GET /v1/exercises.
In short
- 16 champs par exercice : id, name, bodyPart, target et equipment sont obligatoires, tout le reste peut être null.
- id est une chaîne de quatre chiffres comme "0001". Gardez-la en chaîne pour conserver les zéros.
- caloriesPerMinute et averageCaloriesPerMinute sont le même nombre stocké ; averageCaloriesPerHour vaut ce nombre fois 60, arrondi. Pour un vrai utilisateur, appelez le point d'accès calories avec un poids.
- Les listes renvoient { data, pagination }. Calculez vous-même le nombre de pages à partir de total et pageSize.
- Seule la réponse d'un exercice seul contient _links. Le paramètre lang traduit les textes et ne touche ni les nombres ni les énumérations.
Quels champs contient un objet exercice ?
Chaque exercice, dans une liste ou seul, a les mêmes 16 champs. Les cinq obligatoires décrivent le mouvement et le muscle travaillé. Les autres ajoutent le détail d'entraînement et de calories.
| Champ | Type | Présence | Notes |
|---|---|---|---|
id | string | Toujours | Quatre chiffres comme "0001". Identifiant stable. |
name | string | Toujours | Le nom de l'exercice, dans la langue de la réponse. |
bodyPart | string | Toujours | Une des 10 grandes régions, avec majuscule, par exemple Waist. |
target | string | Toujours | Un des 19 muscles précis, par exemple Abs. |
equipment | string | Toujours | Une des 34 valeurs exactes, par exemple "Body Weight". |
category | string | Peut être null | Libellé libre comme strength. |
difficulty | string | Peut être null | Par exemple beginner. |
mechanic | string | Peut être null | Par exemple isolation. |
force | string | Peut être null | Par exemple push. |
met | number | Peut être null | Équivalent métabolique du mouvement, par exemple 3.5. |
caloriesPerMinute | number | Peut être null | kcal par minute stockées pour un poids moyen. |
averageCaloriesPerMinute | number | Peut être null | Même valeur que caloriesPerMinute. |
averageCaloriesPerHour | number | Peut être null | caloriesPerMinute multiplié par 60, arrondi. |
secondaryMuscles | string[] | Peut être null | Muscles secondaires, dans la langue de la réponse. |
instructions | string[] | Peut être null | Étapes ordonnées, dans la langue de la réponse. |
language | string | Facultatif | Code de la langue dans laquelle la réponse est rendue. |
Les chaînes exactes de bodyPart, target et equipment viennent des points d'accès de taxonomie, décrits dans la documentation de l'API.
Quels champs peuvent être null, et comment les gérer côté client ?
Seuls id, name, bodyPart, target et equipment sont garantis. Modélisez les onze autres comme facultatifs et nullables, puis décidez champ par champ ce qu'une valeur vide signifie pour votre écran. Un type TypeScript fidèle à l'API ressemble à ceci :
type Exercise = {
id: string; // "0001", keep it a string
name: string;
bodyPart: string;
target: string;
equipment: string;
category?: string | null;
difficulty?: string | null;
mechanic?: string | null;
force?: string | null;
met?: number | null;
caloriesPerMinute?: number | null;
averageCaloriesPerMinute?: number | null;
averageCaloriesPerHour?: number | null;
secondaryMuscles?: string[] | null;
instructions?: string[] | null;
language?: "en" | "fr" | "es" | "pt" | "zh" | "ja";
};Dans le jeu de données actuel, les 1 324 exercices ont les 16 champs renseignés, mais le schéma autorise les valeurs nulles : ne vous y fiez pas.
Deux règles évitent la plupart des bugs. D'abord, masquez la section des étapes quand instructions vaut null au lieu d'afficher une liste vide. Ensuite, vérifiez met avant d'appeler le point d'accès calories : un exercice sans valeur MET renvoie une erreur 422, pas un nombre.
Quel est le lien entre les champs de calories et le point d'accès calories ?
caloriesPerMinute est une valeur stockée pour un poids moyen, pensée pour un affichage rapide dans une liste. averageCaloriesPerMinute la répète sous un nom plus parlant, et averageCaloriesPerHour vaut cette valeur fois 60, arrondie (4,3 kcal par minute donnent 258 par heure). Aucune ne sait qui est votre utilisateur.
Pour une estimation personnelle, passez le poids et la durée à GET /v1/exercises/{id}/calories?bodyweightKg=80&minutes=30, qui multiplie le MET de l'exercice par le poids et le temps. Le calcul et ses limites sont détaillés dans le guide des calories MET. Les valeurs MET viennent du Compendium of Physical Activities : toute valeur reste une estimation.
Qu'est-ce qui enveloppe une liste, et qu'ajoute un exercice seul ?
Les listes et la recherche partagent une même enveloppe : un tableau dans data et un objet pagination avec page, pageSize et total. La taille de page par défaut est 50, le maximum 100, donc les 1 324 exercices demandent 14 requêtes à la taille maximale. Certains exemples de notre documentation montrent aussi un champ totalPages ; calculez-le vous-même pour que votre code marche dans les deux cas :
{
"data": [ { "id": "0001", "name": "3/4 Sit-up", "bodyPart": "Waist", "target": "Abs", "equipment": "Body Weight" } ],
"pagination": { "page": 1, "pageSize": 50, "total": 1324 }
}const pages = Math.ceil(total / pageSize); // 1324 / 100 = 14L'appel sur un seul exercice, GET /v1/exercises/{id}, renvoie les mêmes 16 champs plus un objet _links dans le style de HAL. Le lien calories est un modèle : le client remplit les deux paramètres au lieu de construire l'URL à la main. Les listes n'ont pas de _links.
"_links": {
"self": { "href": "/v1/exercises/0001" },
"related": { "href": "/v1/exercises/0001/related" },
"calories": { "href": "/v1/exercises/0001/calories{?bodyweightKg,minutes}", "templated": true },
"marketplacePreview": { "href": "/marketplace/preview/0001.gif" }
}Que change le paramètre lang ?
Ajouter ?lang=fr (ou es, pt, zh, ja) traduit name, bodyPart, target, equipment, secondaryMuscles et instructions, et met language au code demandé. Il ne touche ni à id, ni aux champs numériques, ni aux quatre libellés category, difficulty, mechanic et force, qui restent tels quels. Vous pouvez donc mettre les nombres en cache une fois et ne recharger que les textes par langue.
La façon dont la langue est choisie, et pourquoi les termes de recherche restent en anglais, fait l'objet du guide recherche et langues. Pour tout essayer, parcourez la base d'exercices ou lisez la documentation. La réponse n'a pas de champ image : voir acheter et intégrer les GIFs ExerciseDB et GIF ou vidéo dans les API d'exercices.
FAQ
- L'id d'un exercice est-il un nombre ou une chaîne ?
- Une chaîne. Les identifiants ont quatre chiffres avec des zéros initiaux, comme "0001" ou "5201" (les numéros ne se suivent pas). Stockez-les et envoyez-les en chaîne : les convertir en nombre supprime les zéros et casse les recherches.
- bodyPart et target sont-ils en minuscules ?
- Non. Les valeurs commencent par une majuscule, par exemple Waist, Abs et Body Weight. Les filtres comparent ces chaînes exactes : copiez-les depuis les points d'accès de taxonomie au lieu de les taper.
- caloriesPerMinute dépend-il du poids de l'utilisateur ?
- Non. C'est une valeur stockée pour un poids moyen. Pour un chiffre qui reflète votre utilisateur, appelez le point d'accès calories avec bodyweightKg et minutes.
- Pourquoi le nombre de pages manque-t-il dans la réponse ?
- L'objet pagination garantit page, pageSize et total. Calculez le nombre de pages avec Math.ceil(total / pageSize) plutôt que de dépendre d'un champ supplémentaire.