FitExerciseDB

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.

ConsultaO que faz
q=squatExercícios com a palavra squat no nome, no músculo alvo ou no equipamento
q=squat dumbbellSomente exercícios que contêm as duas palavras
q=squNada para uma palavra parcial: não há busca por prefixo, então este não é um endpoint de autocompletar
q=absEncontra 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:

OrdemFonteExemplo
1O parâmetro de consulta lang?lang=fr
2O cabeçalho Accept-Language, lido da esquerda para a direitaAccept-Language: fr-FR,fr;q=0.9,en;q=0.8 resulta em fr
3Padrãoen

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-Language

Como 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?

DadoComportamento com lang
bodyPart, target, equipment, secondaryMusclesSempre traduzidos a partir de vocabulários fixos (10 partes do corpo, 19 músculos alvo)
name, instructionsTraduzidos por exercício, com reserva em inglês quando falta uma tradução
id, met, campos de calorias, category, difficulty, mechanic, forceNunca mudam
Valores de filtro (bodyPart, target, equipment) e qSomente 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.