Evolution API: erro 500 “Cannot convert undefined or null to object” ao listar grupos
Na Evolution API 2.4.0, as rotas de grupo dão erro 500 mesmo com o WhatsApp conectado. A causa está no Express 5, e o conserto é uma linha.
Conectei o WhatsApp de um painel de ofertas na Evolution API, o pareamento pelo QR code funcionou, e na hora de listar os grupos veio isto:
{"status": 500, "error": "Internal Server Error", "response": {"message": "Cannot convert undefined or null to object"}}
O WhatsApp estava conectado: o connectionState respondia open. Mesmo assim, toda chamada de grupo voltava com esse erro, e voltava na hora. Erro que responde em zero segundo não chegou nem a falar com o WhatsApp. Quebrou antes.
Onde o erro acontece
Antes de executar uma rota, a Evolution passa a requisição por um validador. A rota fetchAllGroups usa um validador próprio (o que exige o parâmetro getParticipants), e a findGroupInfos usa o validador de grupo (o que exige o groupJid). Os dois fazem a mesma coisa no começo: pegam o corpo da requisição e copiam campos para dentro dele com Object.assign.
Este é o trecho do validador do fetchAllGroups no dist/main.js da versão 2.4.0. O código é minificado; reescrevi os nomes pra ficar legível:
const query = request.query; // ?getParticipants=false
const body = request.body; // corpo da requisição
Object.assign(body, query); // se body for undefined, quebra aqui
Quando body é undefined, o JavaScript lança TypeError: Cannot convert undefined or null to object, e a Evolution devolve exatamente essa mensagem dentro do erro 500.
Por que o corpo chega undefined: o Express 5
A Evolution 2.4.0 roda em cima do Express 5. Conferi no container: o node_modules/express/package.json diz versão 5.2.1. E o guia oficial de migração do Express 5 lista esta mudança: o req.body agora vem undefined quando nenhum corpo foi lido. No Express 4 ele vinha como objeto vazio, {}.
Num GET comum, o cliente não manda corpo nem Content-Type. O leitor de JSON não roda, o req.body fica undefined, e o validador quebra ao tentar copiar campos para dentro dele. No Express 4 o mesmo código funcionaria, porque o corpo seria {}. Não testei a Evolution 2.3, então não afirmo em qual versão o problema começou.
O conserto: mande {} no corpo do GET
Mande um JSON vazio no corpo, com o cabeçalho Content-Type: application/json. O leitor de JSON roda, o corpo vira {} e o validador segue normal.
Com curl (o -X GET é obrigatório, porque o -d sozinho transforma a chamada em POST):
curl -X GET "https://SUA-EVOLUTION/group/fetchAllGroups/SUA-INSTANCIA?getParticipants=false" \
-H "apikey: SUA-CHAVE" \
-H "Content-Type: application/json" \
-d '{}'
Com Python e httpx, que foi o que usei no painel:
resposta = httpx.request(
"GET",
f"{url}/group/fetchAllGroups/{instancia}",
params={"getParticipants": "false"},
json={}, # o corpo vazio que evita o erro 500
headers={"apikey": chave},
timeout=240,
)
Um cuidado: no navegador e no fetch do Node, GET com corpo não é permitido, e a chamada falha antes de sair. Faça essa chamada do servidor, com um cliente HTTP que aceite corpo em GET, como curl, httpx ou requests.
Mandar corpo em GET é gambiarra?
É um contorno para um bug do servidor, e o padrão HTTP permite. A RFC 9110 diz que conteúdo num GET não tem significado definido e que alguns servidores podem recusar a requisição. Aqui a Evolution aceita, lê o {} e ignora. Quando o validador for corrigido, o corpo vazio continua inofensivo.
Outras pegadinhas da Evolution 2.4.0 que encontrei
| O que acontece | O que fazer |
|---|---|
fetchAllGroups busca a foto de cada grupo, um por um. Com 571 grupos, levou 70 segundos. | Rode em segundo plano, guarde a lista e use timeout alto (usei 240 s). |
fetchInstances ignora o filtro ?instanceName= e devolve todas as instâncias do servidor. | Filtre pelo nome no seu código. Cuidado se o servidor tem instâncias de clientes. |
Mandar mensagem com a instância desconectada deixou a requisição de sendText mais de 30 segundos sem resposta. | Confira o connectionState antes de enviar e use timeout curto. |
Como saber se a sua Evolution tem esse problema
- Veja a versão: um GET na raiz da sua Evolution devolve a versão no JSON.
- Veja o Express:
docker exec NOME-DO-CONTAINER grep '"version"' /evolution/node_modules/express/package.json. Versão 5 é o sinal. - Faça o teste: chame o
fetchAllGroupssem corpo e depois com-d '{}'. Se só a segunda funciona, é esse o problema.
Versões em que testei: Evolution API 2.4.0 (imagem homolog), Baileys 7.0.0-rc13 e Express 5.2.1, em outubro de 2026.
Perguntas frequentes
Isso acontece em outras rotas além das de grupo?
Pode acontecer em qualquer rota GET que passe por um validador que faz Object.assign no corpo. Nas minhas chamadas, as rotas de grupo foram as que quebraram. As rotas de instância, como connectionState e fetchInstances, funcionaram sem corpo.
Mandar {} no GET vai quebrar quando a Evolution corrigir o bug?
Não deveria. O validador só copia os campos do corpo para dentro do objeto da requisição, e um objeto vazio não acrescenta nada. Se um dia o servidor passar a recusar corpo em GET, você tira o {} e pronto.
Como eu sei qual versão do Express a minha Evolution usa?
Dentro do container, leia o package.json do Express: docker exec NOME-DO-CONTAINER grep '"version"' /evolution/node_modules/express/package.json. Se começar com 5, a sua Evolution está sujeita a esse erro.
Por que o fetchAllGroups demora tanto?
Porque ele busca a foto de perfil de cada grupo, um por um, antes de responder. Com 571 grupos, a resposta levou 70 segundos. Use um timeout alto e guarde a lista em vez de buscar toda hora.