Campos de la respuesta de la API FitExerciseDB
2026-10-02 · 6 min
Un objeto de ejercicio de FitExerciseDB tiene 16 campos. Cinco siempre están presentes (id, name, bodyPart, target y equipment) y los otros once pueden ser null o faltar, así que un cliente debe tratarlos como opcionales. Las listas envuelven los ejercicios en data y pagination, una llamada a un solo ejercicio añade un objeto _links, y el parámetro lang cambia los textos pero nunca los números. Esta página es la referencia campo por campo del JSON al estilo ExerciseDB que devuelve GET /v1/exercises.
In short
- 16 campos por ejercicio: id, name, bodyPart, target y equipment son obligatorios, el resto puede ser null.
- id es una cadena de cuatro dígitos como "0001". Guárdala como cadena para conservar los ceros.
- caloriesPerMinute y averageCaloriesPerMinute son el mismo número almacenado; averageCaloriesPerHour es ese número por 60, redondeado. Para un usuario real, llama al endpoint de calorías con un peso.
- Las listas devuelven { data, pagination }. Calcula tú mismo el número de páginas a partir de total y pageSize.
- Solo la respuesta de un ejercicio individual incluye _links. El parámetro lang traduce los textos y deja intactos los números y los valores enumerados.
¿Qué campos contiene un objeto de ejercicio?
Cada ejercicio, en una lista o solo, tiene los mismos 16 campos. Los cinco obligatorios describen qué es el movimiento y qué músculo trabaja. El resto añade detalle de entrenamiento y de calorías.
| Campo | Tipo | Presencia | Notas |
|---|---|---|---|
id | string | Siempre | Cuatro dígitos como "0001". Identificador estable. |
name | string | Siempre | El nombre del ejercicio, en el idioma de la respuesta. |
bodyPart | string | Siempre | Una de 10 regiones amplias, con mayúscula inicial, por ejemplo Waist. |
target | string | Siempre | Uno de 19 músculos concretos, por ejemplo Abs. |
equipment | string | Siempre | Uno de 34 valores literales, por ejemplo "Body Weight". |
category | string | Puede ser null | Etiqueta libre como strength. |
difficulty | string | Puede ser null | Por ejemplo beginner. |
mechanic | string | Puede ser null | Por ejemplo isolation. |
force | string | Puede ser null | Por ejemplo push. |
met | number | Puede ser null | Equivalente metabólico del movimiento, por ejemplo 3.5. |
caloriesPerMinute | number | Puede ser null | kcal por minuto almacenadas para un peso corporal típico. |
averageCaloriesPerMinute | number | Puede ser null | Mismo valor que caloriesPerMinute. |
averageCaloriesPerHour | number | Puede ser null | caloriesPerMinute multiplicado por 60 y redondeado. |
secondaryMuscles | string[] | Puede ser null | Músculos de apoyo, en el idioma de la respuesta. |
instructions | string[] | Puede ser null | Pasos ordenados, en el idioma de la respuesta. |
language | string | Opcional | Código del idioma en que se generó la respuesta. |
Las cadenas exactas de bodyPart, target y equipment salen de los endpoints de taxonomía, descritos en la documentación de la API.
¿Qué campos pueden ser null y cómo debe manejarlos el cliente?
Solo id, name, bodyPart, target y equipment están garantizados. Modela los otros once como opcionales y anulables, y decide campo por campo qué significa un valor vacío en tu pantalla. Un tipo de TypeScript fiel a la API es así:
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";
};En los datos actuales, los 1324 ejercicios tienen los 16 campos rellenos, pero el esquema admite nulos, así que no cuentes con ello.
Dos reglas evitan la mayoría de los errores. Primero, oculta la sección de pasos cuando instructions sea null en lugar de mostrar una lista vacía. Segundo, comprueba met antes de llamar al endpoint de calorías: un ejercicio sin valor MET devuelve un error 422, no un número.
¿Cómo se relacionan los campos de calorías con el endpoint de calorías?
caloriesPerMinute es un valor almacenado para un peso corporal típico, pensado para mostrar rápido en una lista. averageCaloriesPerMinute lo repite con un nombre más claro, y averageCaloriesPerHour es ese valor por 60, redondeado (4,3 kcal por minuto pasan a 258 por hora). Ninguno sabe quién es tu usuario.
Para una estimación personal, pasa el peso y la duración a GET /v1/exercises/{id}/calories?bodyweightKg=80&minutes=30, que multiplica el MET del ejercicio por el peso y el tiempo. El cálculo y sus límites están en la guía de calorías MET. Los valores MET proceden del Compendium of Physical Activities, así que todo resultado es una estimación.
¿Qué envuelve una lista y qué añade un ejercicio individual?
Las listas y la búsqueda comparten un mismo envoltorio: un array en data y un objeto pagination con page, pageSize y total. El tamaño de página por defecto es 50 y el máximo 100, así que los 1.324 ejercicios requieren 14 peticiones con el tamaño máximo. Algunos ejemplos de nuestra documentación muestran también un campo totalPages; calcúlalo tú para que tu código funcione en ambos casos:
{
"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 = 14La llamada a un solo ejercicio, GET /v1/exercises/{id}, devuelve los mismos 16 campos más un objeto _links al estilo de HAL. El enlace de calorías es una plantilla: el cliente rellena los dos parámetros en lugar de construir la URL a mano. Las listas no llevan _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" }
}¿Qué cambia el parámetro lang?
Añadir ?lang=fr (o es, pt, zh, ja) traduce name, bodyPart, target, equipment, secondaryMuscles e instructions, y pone language con el código que pediste. No toca id, los campos numéricos ni las cuatro etiquetas category, difficulty, mechanic y force, que se quedan como están. Así puedes guardar en caché los números una vez y volver a pedir solo los textos por idioma.
Cómo se elige el idioma, y por qué los términos de búsqueda deben seguir en inglés, se explica en la guía de búsqueda e idiomas. Para probarlo, explora la base de datos de ejercicios o lee la documentación. La respuesta no tiene un campo de imagen: consulta cómo comprar e incrustar los GIFs de ExerciseDB y GIF o video en las APIs de ejercicios.
FAQ
- ¿El id del ejercicio es un número o una cadena?
- Una cadena. Los ID tienen cuatro dígitos con ceros a la izquierda, como "0001" o "5201" (los números no son consecutivos). Guárdalos y envíalos como cadenas: convertirlos en número elimina los ceros y rompe las consultas.
- ¿bodyPart y target van en minúsculas?
- No. Los valores llevan mayúscula inicial, por ejemplo Waist, Abs y Body Weight. Los filtros comparan estas cadenas exactas, así que cópialas de los endpoints de taxonomía en vez de escribirlas.
- ¿caloriesPerMinute depende del peso del usuario?
- No. Es un valor almacenado para un peso corporal típico. Para una cifra que refleje a tu usuario, llama al endpoint de calorías con bodyweightKg y minutes.
- ¿Por qué falta el número de páginas en la respuesta?
- El objeto pagination garantiza page, pageSize y total. Calcula el número de páginas con Math.ceil(total / pageSize) en lugar de depender de un campo extra.