FitExerciseDB

API de búsqueda de ejercicios: consultas y 6 idiomas

2026-10-02 · 6 min

GET /v1/exercises/search?q= ejecuta una búsqueda de texto completo sobre el nombre, el músculo objetivo y el equipamiento de cada ejercicio. Solo coincide con palabras completas, exige todas las palabras que envías y ordena los resultados por relevancia. El idioma de la respuesta es una elección aparte: gana el parámetro lang, luego la cabecera Accept-Language y luego el inglés, entre seis idiomas (en, fr, es, pt, zh, ja). Como el índice de búsqueda se construye con el texto en inglés, envía términos en inglés y usa lang para controlar cómo se muestran los resultados.

In short

  • La búsqueda cubre nombre, músculo objetivo y equipamiento, no las instrucciones ni los músculos secundarios.
  • Palabras completas y todas obligatorias: "squat" no coincide con "squats", y "squat dumbbell" necesita ambas palabras.
  • Orden de idiomas: primero ?lang=, luego Accept-Language, luego inglés. Un valor no admitido cae en inglés sin error.
  • lang cambia cómo se muestran los resultados. No traduce tus términos de búsqueda, y los filtros como bodyPart siguen esperando el valor en inglés.
  • Las respuestas incluyen Content-Language y Vary: Accept-Language, así que cachea por idioma.

¿Cómo funciona el endpoint de búsqueda de ejercicios?

Envía q con una clave de API. Una petición sin q devuelve un error 400. Los resultados llegan en el mismo envoltorio { data, pagination } que el listado, ordenados por relevancia y con los empates resueltos por id. Las páginas traen 50 resultados por defecto y como máximo 100.

curl -H "Authorization: Bearer fed_live_YOUR_KEY" \
  "https://api.fitexercisedb.com/v1/exercises/search?q=squat&pageSize=10&lang=fr"

Cada resultado incluye todos los campos descritos en la referencia de campos de la respuesta. Por debajo es una consulta de texto completo de PostgreSQL sobre el nombre, el músculo objetivo y el equipamiento; no se indexa nada más.

¿Por qué "squat" y "squats" dan resultados distintos?

El índice usa la configuración de texto simple de PostgreSQL, que pasa las palabras a minúsculas pero no aplica lematización, y la consulta se construye con plainto_tsquery, que exige cada palabra. Por eso una consulta solo coincide con palabras completas y todas las palabras enviadas deben estar presentes.

ConsultaQué hace
q=squatEjercicios con la palabra squat en el nombre, el músculo objetivo o el equipamiento
q=squat dumbbellSolo los ejercicios que contienen ambas palabras
q=squNada para una palabra parcial: no hay búsqueda por prefijo, así que no es un endpoint de autocompletado
q=absCoincide con el músculo objetivo Abs y con cualquier nombre que contenga abs

Si necesitas autocompletado, carga una vez la taxonomía y los nombres que te interesan, guárdalos en caché y filtra en local; usa la búsqueda para la consulta final. Prueba consultas en la base de datos de ejercicios para ver qué contiene antes de programar.

¿Funciona la búsqueda con palabras en francés, español o japonés?

No traduciendo tu consulta. El texto indexado es el nombre, el músculo objetivo y el equipamiento en inglés; los nombres traducidos no forman parte del índice, así que una palabra francesa solo coincide si se escribe igual en inglés. El parámetro lang cambia lo que se devuelve, no lo que se compara.

El patrón que funciona para un buscador localizado es traducir tú mismo las palabras del usuario a términos en inglés y pedir después a la API el texto en su idioma:

// The user types in French. You map it to English terms, then ask for French text back.
const q = toEnglish("développé couché");        // your own mapping: "bench press"
const url = `/v1/exercises/search?q=${encodeURIComponent(q)}&lang=fr`;

Para los casos comunes evita el texto libre: ofrece listas de partes del cuerpo, músculos y equipamiento, conserva el valor en inglés como clave y muestra una etiqueta traducida.

¿Cómo elige la API el idioma de la respuesta?

Se comprueban tres fuentes en orden. Gana la primera admitida, y nada de esto es un error:

OrdenFuenteEjemplo
1El parámetro de consulta lang?lang=fr
2La cabecera Accept-Language, leída de izquierda a derechaAccept-Language: fr-FR,fr;q=0.9,en;q=0.8 da fr
3Valor por defectoen

Los sufijos de región se descartan, así que fr-FR y pt-BR se resuelven como fr y pt. La cabecera se recorre en el orden escrito y se usa la primera etiqueta admitida; los pesos de calidad no se comparan. Un valor como de no está admitido y da inglés sin avisar. Cada respuesta indica qué idioma usó:

Content-Language: fr
Vary: Accept-Language

Como la misma URL puede devolver texto distinto según Accept-Language, incluye el idioma en tu clave de caché o envía un lang explícito.

¿Qué se traduce y qué se queda en inglés?

DatoComportamiento con lang
bodyPart, target, equipment, secondaryMusclesSiempre traducidos desde vocabularios fijos (10 partes del cuerpo, 19 músculos objetivo)
name, instructionsTraducidos por ejercicio, con respaldo en inglés si falta una traducción
id, met, campos de calorías, category, difficulty, mechanic, forceNunca cambian
Valores de filtro (bodyPart, target, equipment) y qSolo en inglés

Esa última fila es la trampa. Una respuesta en francés muestra Poitrine para el pecho, pero el filtro espera Chest:

# the filter value stays English, the labels come back in French
curl -H "Authorization: Bearer fed_live_YOUR_KEY" \
  "https://api.fitexercisedb.com/v1/exercises?bodyPart=Chest&lang=fr"

Obtén las listas de filtros una vez, sin lang, y guarda esos valores como claves; las listas exactas están en la documentación.

FAQ

¿La búsqueda de ejercicios mira las instrucciones o los músculos secundarios?
No. El índice cubre nombre, músculo objetivo y equipamiento. Para filtrar por músculo secundario, obtén los resultados y filtra el array secondaryMuscles en tu propio código.
¿Qué pasa si envío un lang no admitido como de?
La API recurre al inglés y devuelve 200. Lee el campo language de cada ejercicio, o la cabecera Content-Language, para saber qué idioma recibiste.
¿Necesito Accept-Language si ya envío ?lang?
No. El parámetro lang tiene prioridad, así que Accept-Language solo se usa cuando lang falta o no está admitido.
¿Por qué mis respuestas en caché salen en el idioma equivocado?
La misma URL puede devolver texto distinto según Accept-Language. Las respuestas envían Vary: Accept-Language: haz que tu caché lo respete o añade lang a la URL.