FitExerciseDB

API de recherche d'exercices : requêtes et 6 langues

2026-10-02 · 6 min

GET /v1/exercises/search?q= lance une recherche plein texte sur le nom, le muscle cible et l'équipement de chaque exercice. Elle ne trouve que des mots entiers, exige tous les mots envoyés et classe les résultats par pertinence. La langue de la réponse est un choix distinct : le paramètre lang l'emporte, puis l'en-tête Accept-Language, puis l'anglais, parmi six langues (en, fr, es, pt, zh, ja). L'index de recherche étant construit sur le texte anglais, envoyez des termes anglais et utilisez lang pour contrôler l'affichage des résultats.

In short

  • La recherche couvre le nom, le muscle cible et l'équipement, pas les instructions ni les muscles secondaires.
  • Mots entiers, tous obligatoires : "squat" ne trouve pas "squats", et "squat dumbbell" exige les deux mots.
  • Ordre des langues : ?lang= d'abord, puis Accept-Language, puis l'anglais. Une valeur non prise en charge donne l'anglais sans erreur.
  • lang change l'affichage des résultats. Il ne traduit pas vos termes de recherche, et les filtres comme bodyPart attendent toujours la valeur anglaise.
  • Les réponses portent Content-Language et Vary: Accept-Language : mettez-les en cache par langue.

Comment fonctionne le point d'accès de recherche d'exercices ?

Envoyez q avec une clé d'API. Une requête sans q renvoie une erreur 400. Les résultats reviennent dans la même enveloppe { data, pagination } que la liste, classés par pertinence, les égalités étant départagées par id. Les pages contiennent 50 résultats par défaut, 100 au maximum.

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

Chaque résultat porte tous les champs décrits dans la référence des champs de réponse. En interne, c'est une requête plein texte PostgreSQL sur le nom, le muscle cible et l'équipement ; rien d'autre n'est indexé.

Pourquoi "squat" et "squats" donnent-ils des résultats différents ?

L'index utilise la configuration de texte simple de PostgreSQL, qui passe les mots en minuscules sans radicalisation, et la requête est construite avec plainto_tsquery, qui exige chaque mot. Une requête ne trouve donc que des mots entiers, et chaque mot envoyé doit être présent.

RequêteEffet
q=squatLes exercices dont le nom, le muscle cible ou l'équipement contient le mot squat
q=squat dumbbellUniquement les exercices qui contiennent les deux mots
q=squRien pour un mot partiel : il n'y a pas de recherche par préfixe, ce n'est donc pas un point d'accès d'autocomplétion
q=absTrouve le muscle cible Abs ainsi que tout nom contenant abs

Pour de l'autocomplétion, chargez une fois la taxonomie et les noms utiles, mettez-les en cache et filtrez en local, puis utilisez la recherche pour la requête finale. Essayez des requêtes dans la base d'exercices pour voir le contenu avant de coder.

La recherche fonctionne-t-elle avec des mots français, espagnols ou japonais ?

Pas en traduisant votre requête. Le texte indexé est le nom, le muscle cible et l'équipement en anglais ; les noms traduits ne font pas partie de l'index, donc un mot français ne correspond que s'il s'écrit pareil en anglais. Le paramètre lang change ce qui revient, pas ce qui est comparé.

Pour une barre de recherche localisée, traduisez vous-même les mots de l'utilisateur en termes anglais, puis demandez à l'API le texte dans sa langue :

// 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`;

Pour les cas courants, évitez le texte libre : proposez des listes de parties du corps, de muscles et d'équipements, gardez la valeur anglaise comme clé et affichez un libellé traduit.

Comment l'API choisit-elle la langue de la réponse ?

Trois sources sont examinées dans l'ordre. La première prise en charge l'emporte, et rien ici n'est une erreur :

OrdreSourceExemple
1Le paramètre de requête lang?lang=fr
2L'en-tête Accept-Language, lu de gauche à droiteAccept-Language: fr-FR,fr;q=0.9,en;q=0.8 donne fr
3Valeur par défauten

Les suffixes de région sont ignorés : fr-FR et pt-BR donnent fr et pt. L'en-tête est lu dans l'ordre d'écriture et la première balise prise en charge est retenue ; les poids de qualité ne sont pas comparés. Une valeur comme de n'est pas prise en charge et donne silencieusement l'anglais. Chaque réponse indique la langue utilisée :

Content-Language: fr
Vary: Accept-Language

Comme une même URL peut renvoyer un texte différent selon Accept-Language, mettez la langue dans votre clé de cache ou envoyez un lang explicite.

Qu'est-ce qui est traduit, et qu'est-ce qui reste en anglais ?

DonnéeComportement avec lang
bodyPart, target, equipment, secondaryMusclesToujours traduits à partir de vocabulaires fixes (10 parties du corps, 19 muscles cibles)
name, instructionsTraduits exercice par exercice, avec repli sur l'anglais si une traduction manque
id, met, champs de calories, category, difficulty, mechanic, forceJamais modifiés
Valeurs de filtre (bodyPart, target, equipment) et qAnglais uniquement

La dernière ligne est le piège. Une réponse en français affiche Poitrine, mais le filtre attend 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"

Récupérez les listes de filtres une fois, sans lang, et gardez ces valeurs comme clés ; les listes exactes sont dans la documentation.

FAQ

La recherche d'exercices regarde-t-elle les instructions ou les muscles secondaires ?
Non. L'index couvre le nom, le muscle cible et l'équipement. Pour filtrer par muscle secondaire, récupérez les résultats et filtrez le tableau secondaryMuscles dans votre code.
Que se passe-t-il si j'envoie un lang non pris en charge comme de ?
L'API se replie sur l'anglais et renvoie 200. Lisez le champ language de chaque exercice, ou l'en-tête Content-Language, pour savoir quelle langue vous avez reçue.
Ai-je besoin d'Accept-Language si j'envoie déjà ?lang ?
Non. Le paramètre lang est prioritaire, Accept-Language n'est donc utilisé que si lang est absent ou non pris en charge.
Pourquoi mes réponses en cache s'affichent-elles dans la mauvaise langue ?
Une même URL peut renvoyer un texte différent selon Accept-Language. Les réponses envoient Vary: Accept-Language : faites-le respecter par votre cache ou ajoutez lang à l'URL.