API de busca de exercícios: consultas e 6 idiomas
2026-10-02 · 6 min
GET /v1/exercises/search?q= executa uma busca de texto completo no nome, no músculo alvo e no equipamento de cada exercício. Ela só encontra palavras inteiras, exige todas as palavras enviadas e ordena os resultados por relevância. O idioma da resposta é uma escolha separada: vale o parâmetro lang, depois o cabeçalho Accept-Language, depois o inglês, entre seis idiomas (en, fr, es, pt, zh, ja). Como o índice de busca é construído com o texto em inglês, envie termos em inglês e use lang para controlar como os resultados são exibidos.
In short
- A busca cobre nome, músculo alvo e equipamento, não as instruções nem os músculos secundários.
- Palavras inteiras e todas obrigatórias: "squat" não encontra "squats", e "squat dumbbell" exige as duas palavras.
- Ordem dos idiomas: primeiro ?lang=, depois Accept-Language, depois inglês. Um valor não suportado cai em inglês sem erro.
- lang muda como os resultados são exibidos. Não traduz seus termos de busca, e filtros como bodyPart continuam esperando o valor em inglês.
- As respostas trazem Content-Language e Vary: Accept-Language, então faça o cache por idioma.
Como funciona o endpoint de busca de exercícios?
Envie q com uma chave de API. Uma requisição sem q devolve um erro 400. Os resultados vêm no mesmo envelope { data, pagination } da listagem, ordenados por relevância, com empates decididos pelo id. As páginas trazem 50 resultados por padrão e no 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 tem todos os campos descritos na referência dos campos da resposta. Por baixo, é uma consulta de texto completo do PostgreSQL sobre o nome, o músculo alvo e o equipamento; nada mais é indexado.
Por que "squat" e "squats" dão resultados diferentes?
O índice usa a configuração de texto simple do PostgreSQL, que converte as palavras em minúsculas sem fazer radicalização, e a consulta é montada com plainto_tsquery, que exige cada palavra. Assim, a consulta só encontra palavras inteiras e todas as palavras enviadas precisam estar presentes.
| Consulta | O que faz |
|---|---|
q=squat | Exercícios com a palavra squat no nome, no músculo alvo ou no equipamento |
q=squat dumbbell | Somente exercícios que contêm as duas palavras |
q=squ | Nada para uma palavra parcial: não há busca por prefixo, então este não é um endpoint de autocompletar |
q=abs | Encontra o músculo alvo Abs e qualquer nome que contenha abs |
Se precisar de autocompletar, carregue uma vez a taxonomia e os nomes que importam, guarde em cache e filtre localmente; use a busca para a consulta final. Teste consultas no banco de exercícios para ver o conteúdo antes de programar.
A busca funciona com palavras em francês, espanhol ou japonês?
Não traduzindo a sua consulta. O texto indexado é o nome, o músculo alvo e o equipamento em inglês; os nomes traduzidos não fazem parte do índice, então uma palavra em francês só encontra algo quando se escreve igual em inglês. O parâmetro lang muda o que volta, não o que é comparado.
O padrão que funciona para uma busca localizada é traduzir você mesmo as palavras do usuário para termos em inglês e depois pedir à API o texto no idioma dele:
// 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`;Nos casos comuns, dispense o texto livre: ofereça listas de partes do corpo, músculos e equipamentos, mantenha o valor em inglês como chave e mostre um rótulo traduzido.
Como a API escolhe o idioma da resposta?
Três fontes são verificadas em ordem. Vale a primeira suportada, e nada disso é erro:
| Ordem | Fonte | Exemplo |
|---|---|---|
| 1 | O parâmetro de consulta lang | ?lang=fr |
| 2 | O cabeçalho Accept-Language, lido da esquerda para a direita | Accept-Language: fr-FR,fr;q=0.9,en;q=0.8 resulta em fr |
| 3 | Padrão | en |
Os sufixos de região são descartados, então fr-FR e pt-BR viram fr e pt. O cabeçalho é lido na ordem em que está escrito e a primeira etiqueta suportada é usada; os pesos de qualidade não são comparados. Um valor como de não é suportado e devolve inglês silenciosamente. Toda resposta informa qual idioma usou:
Content-Language: fr
Vary: Accept-LanguageComo a mesma URL pode devolver textos diferentes conforme o Accept-Language, coloque o idioma na chave de cache ou envie um lang explícito.
O que é traduzido e o que fica em inglês?
| Dado | Comportamento com lang |
|---|---|
| bodyPart, target, equipment, secondaryMuscles | Sempre traduzidos a partir de vocabulários fixos (10 partes do corpo, 19 músculos alvo) |
| name, instructions | Traduzidos por exercício, com reserva em inglês quando falta uma tradução |
| id, met, campos de calorias, category, difficulty, mechanic, force | Nunca mudam |
| Valores de filtro (bodyPart, target, equipment) e q | Somente inglês |
Essa última linha é a armadilha. Uma resposta em francês mostra Poitrine para o peito, mas o 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"Busque as listas de filtros uma vez, sem lang, e guarde esses valores como chaves; as listas exatas estão na documentação.
FAQ
- A busca de exercícios olha as instruções ou os músculos secundários?
- Não. O índice cobre nome, músculo alvo e equipamento. Para filtrar por músculo secundário, busque os resultados e filtre o array secondaryMuscles no seu próprio código.
- O que acontece se eu enviar um lang não suportado, como de?
- A API volta para o inglês e devolve 200. Leia o campo language de cada exercício, ou o cabeçalho Content-Language, para saber qual idioma você recebeu.
- Preciso do Accept-Language se já envio ?lang?
- Não. O parâmetro lang tem prioridade, então o Accept-Language só é usado quando lang está ausente ou não é suportado.
- Por que minhas respostas em cache aparecem no idioma errado?
- A mesma URL pode devolver texto diferente conforme o Accept-Language. As respostas enviam Vary: Accept-Language: faça seu cache respeitá-lo ou acrescente lang à URL.