Códigos de erro da API do WhatsApp
Todo erro da API da FlashConnect é um JSON com erro (mensagem legível) e, quase sempre, codigo (estável, para o seu sistema tratar). Recusas da Meta voltam com HTTP 502, um código nosso e o codigo_meta original: 131047 vira JANELA_EXPIRADA, 131026 vira NUMERO_NAO_WHATSAPP. Abaixo estão todos os códigos, a causa e o que fazer.
Atualizado em
Qual é o formato de um erro da API?
HTTP/1.1 409 Conflict
content-type: application/json
{ "erro": "janela de 24h expirada — use um template aprovado", "codigo": "JANELA_EXPIRADA" }
erroé uma mensagem em português para pessoas; pode mudar de texto.codigoé estável: trate pelo código.- Erros de validação de campo (
400) muitas vezes vêm só comerro, dizendo qual campo está errado. - Quando a Meta recusa, a resposta é
502com o nossocodigoe ocodigo_metaoriginal. - A API nunca devolve detalhes internos (stack trace). Em
500, a resposta é só{ "erro": "falha interna" }.
Erros de autenticação e permissão (401, 403)
| HTTP | Código | Causa | O que fazer |
|---|---|---|---|
| 401 | NAO_AUTENTICADO | Sem header Authorization: Bearer … | Envie a chave no header |
| 401 | CHAVE_INVALIDA | Chave inexistente, digitada errada ou com prefixo diferente de ck_live_ | Confira a chave; se perdeu, gere outra |
| 401 | CHAVE_REVOGADA | A chave foi revogada no painel | Gere uma nova chave |
| 401 | TOKEN_INVALIDO | Login do painel (JWT) inválido ou expirado | Entre de novo |
| 401 | APENAS_USUARIO | A operação exige usuário logado, não chave de API | Faça pelo painel |
| 403 | ESCOPO_INSUFICIENTE | A chave não tem o escopo da rota ou ferramenta MCP | Gere uma chave com o escopo (veja a tabela de escopos) |
| 403 | PERMISSAO_INSUFICIENTE | O papel do usuário não permite (ex.: atendente conectando o MCP por login ou criando chave) | Peça ao dono ou a um admin |
| 403 | SEM_TENANT | Usuário logado sem empresa vinculada | Conclua o cadastro ou aceite o convite da equipe |
Erros de assinatura e cartão (402)
| Código | Quando aparece | O que fazer |
|---|---|---|
ASSINATURA_PAUSADA | Envio por chave de API com a assinatura pausada ou cancelada | Regularize o pagamento no painel |
ASSINATURA_PENDENTE | Envio por chave de API com a conta aguardando o cadastro do cartão | Cadastre o cartão no painel |
CARTAO_NECESSARIO | Envio pelo login, criação de chave, e as ferramentas MCP criar_template, criar_webhook e alterar_webhook (ao reativar ou trocar URL) sem cartão cadastrado | Cadastre o cartão em Configurações. Veja planos e preços |
ASSINATURA_CANCELADA | Mesmas operações, com a assinatura cancelada | Cadastre um cartão para voltar a usar |
Com a assinatura pausada, cancelada ou aguardando cartão, os webhooks de saída também ficam retidos na fila (sem perder eventos) até a regularização.
Erros de validação e recurso não encontrado (400, 404)
| HTTP | Código | Causa | O que fazer |
|---|---|---|---|
| 400 | sem código | JSON inválido ou campo fora do formato; erro diz qual | Corrija o campo indicado |
| 400 | ESCOPO_INVALIDO | Escopo desconhecido ao criar chave | Use um dos 14 escopos |
| 400 | CONVERSA_DE_OUTRO_CONTATO | contato e conversation_id enviados juntos não combinam | Envie só um, ou o par certo |
| 400 | MIDIA_CAMINHO_INVALIDO | midia_caminho não é um arquivo da sua conta | Use o caminho devolvido pela FlashConnect, ou midia_url |
| 404 | NUMERO_NAO_ENCONTRADO | phone_number_id não é de um número da conta | Confira com listar_numeros no MCP |
| 404 | CONVERSA_NAO_ENCONTRADA | Conversa inexistente ou de outra conta | Use o conversation.id do evento |
| 404 | CONTATO_NAO_ENCONTRADO | Telefone ou contact_id sem contato na conta | O contato precisa ter conversado ou recebido template antes |
| 404 | MENSAGEM_NAO_ENCONTRADA | message_id do media-download não existe na conta | Use message.id do evento, não o wa_message_id |
| 404 | MIDIA_NAO_ENCONTRADA | Arquivo de midia_caminho não existe mais | Suba o arquivo de novo ou use midia_url |
| 404 | AGENTE_NAO_CONFIGURADO | A conta não tem agente para o número nem agente padrão | Crie um agente no painel ou com salvar_agente |
| 404 | AGENTE_NAO_ENCONTRADO · EQUIPE_NAO_ENCONTRADA · USUARIO_NAO_ENCONTRADO | Id de agente, equipe ou atendente que não é da conta | Confira os ids (o agent-config lista as equipes) |
| 404 | AGENDA_NAO_ENCONTRADA · AGENDAMENTO_NAO_ENCONTRADO · PRODUTO_NAO_ENCONTRADO | Id de agenda, agendamento ou produto que não é da conta | Liste com GET /agenda?acao=agendas ou acao=agendamentos |
| 404 | TAREFA_NAO_ENCONTRADA · COLUNA_NAO_ENCONTRADA | Id de tarefa ou coluna que não é da conta | Liste com GET /tarefas |
| 404 | SEM_COLUNA | O quadro de tarefas não tem coluna inicial ou de conclusão | Crie as colunas no quadro do painel |
| 405 | sem código | Método HTTP errado (ex.: GET em /whatsapp-send) | Veja o método na referência da API |
Erros de regra de negócio (409)
| Código | Causa | O que fazer |
|---|---|---|
JANELA_EXPIRADA | Texto, mídia ou interativa fora da janela de 24 h, ou sem conversa com o contato | Envie um template aprovado |
OPT_OUT | O contato pediu para não receber; template bloqueado | Não envie. Para liberar, opt_out: false no contato-update, só se o contato pedir |
NUMERO_NAO_REGISTRADO | O número ainda não terminou o registro na Cloud API | Conclua a conexão do número no painel |
SEM_CREDENCIAL | A conexão com a Meta está sem token válido | Reconecte o WhatsApp no painel |
HORARIO_INDISPONIVEL | O horário não está entre os livres ou foi ocupado entre a consulta e a gravação | Consulte acao=horarios de novo e ofereça outro |
AGENDA_INATIVA | A agenda foi desativada | Use outra agenda ou reative no painel |
Quais erros da Meta a API traduz (502)?
Quando a Cloud API da Meta recusa um envio, a resposta é 502 com um código nosso e o original em codigo_meta:
{ "erro": "Este número não está no WhatsApp ou bloqueou o remetente.", "codigo": "NUMERO_NAO_WHATSAPP", "codigo_meta": 131026 }
| Código | codigo_meta | Causa | O que fazer |
|---|---|---|---|
JANELA_EXPIRADA | 131047 | Mais de 24 h desde a última mensagem do contato | Envie template |
NUMERO_NAO_WHATSAPP | 131026 | O destino não tem WhatsApp ou não pode receber | Marque o contato; não tente de novo |
LIMITE_QUALIDADE | 131049 | A Meta limitou o envio por qualidade ou spam | Pause envios ativos; não tente de novo agora |
DESTINATARIO_NAO_PERMITIDO | 131030 | Número em modo de teste e destino fora da lista permitida | Adicione o destino na lista de teste da Meta ou conclua a conexão |
RATE_LIMIT | 130429, 80007 | Limite de envio ou de chamadas da Meta | Tente de novo com espera crescente |
TEMPLATE_INVALIDO | 132000, 132001, 132012 | Parâmetros diferentes do aprovado, template inexistente nesse idioma ou formato de parâmetro errado | Revise nome, idioma e parâmetros |
PARAMETRO_INVALIDO | 100 | Payload recusado pela Meta | Revise o corpo (ex.: objeto interativo) |
TOKEN_INVALIDO | 190 | Token da conexão expirado ou revogado | Reconecte o WhatsApp no painel |
CONTA_BLOQUEADA | 368 | Conta bloqueada temporariamente pela Meta por violação de política | Veja o aviso no Gerenciador do WhatsApp da Meta |
META_RECUSOU | outros | Qualquer outro erro da Meta | Leia codigo_meta na tabela oficial de erros da Meta |
Os códigos 133005 e 133010 (número já registrado) são tratados na conexão do número e não chegam às rotas da API. Falhas que a Meta informa depois do envio (mensagem aceita e não entregue) chegam pelo evento message.status com status: "failed" e o código da Meta em erro.codigo.
Erros do download de mídia (410, 503)
O POST /media-download separa falha definitiva de passageira:
| HTTP | Códigos | Causa | O que fazer |
|---|---|---|---|
| 410 | SEM_MIDIA, MIDIA_INDISPONIVEL, META, STORAGE, SEM_NUMERO | Mensagem sem mídia, mídia expirada na Meta antes de ser salva, arquivo acima do limite de armazenamento, ou tentativas esgotadas | Não tente de novo |
| 503 | FALHA, META, DOWNLOAD, STORAGE, SEM_CREDENCIAL | Falha passageira ao baixar da Meta ou salvar | Tente de novo em alguns segundos |
Erros do servidor MCP
No MCP, erro de negócio volta como resultado da ferramenta com isError: true e o mesmo { erro, codigo } das rotas REST, para a IA explicar ao usuário. Além dos códigos acima, as ferramentas de configuração usam:
| Código | Causa |
|---|---|
PARAMETRO_INVALIDO | Argumento fora do formato (id que não é uuid, filtro desconhecido, nada para alterar) |
NUMERO_JA_TEM_AGENTE | Outro agente já está ligado a esse número |
ITEM_NAO_ENCONTRADO · WEBHOOK_NAO_ENCONTRADO | Produto, conhecimento ou webhook que não é da conta |
URL_INVALIDA · EVENTOS_INVALIDOS | Webhook com URL que não é https:// pública, ou evento desconhecido |
SEM_CONEXAO | Criar template sem WhatsApp conectado |
NOME_INVALIDO · IDIOMA_INVALIDO · CATEGORIA_INVALIDA | Template com nome fora de minúsculas/números/_, idioma ou categoria inválidos |
COMPONENTES_INVALIDOS · BOTOES_INVALIDOS | Template sem BODY, com texto acima do limite, HEADER não textual ou botões fora das regras |
VARIAVEL_NAO_SEQUENCIAL · EXEMPLO_OBRIGATORIO | Variáveis fora de {{1}}, {{2}}… em sequência, ou sem exemplo |
TEMPLATE_DUPLICADO | Já existe template com esse nome e idioma |
Erros de protocolo vêm como erro JSON-RPC: -32700 (JSON inválido), -32600 (pedido inválido ou lote), -32601 (método não suportado), -32602 (ferramenta, recurso ou prompt inexistente, ou ferramenta não liberada no plano) e -32603 (falha interna). Sem credencial, o MCP responde 401 com o header WWW-Authenticate que inicia o login OAuth.
Erros na entrega de webhooks
Não são respostas da API, mas aparecem no painel (Integrações, lista de entregas) e em listar_webhooks no MCP:
HTTP 4xx/5xx: o seu servidor respondeu erro. Conta como falha e entra no retry.HTTP 3xx: redirecionamento não é seguido: cadastre a URL final.destino não permitido: URL sem https, ou que aponta para endereço interno ou privado.TimeoutError: o seu servidor não respondeu em 10 segundos. Responda 200 antes de processar.
Detalhes de retry e assinatura em webhooks.
E os erros 500?
500 { "erro": "falha interna" } é falha do nosso lado. Pode tentar de novo com espera. Exceção: no envio, se a Meta já aceitou a mensagem e a gravação falhou, repetir mandaria a mensagem duas vezes; antes de reenviar, confira o histórico com GET /messages-list. Se persistir, fale com o suporte informando a rota e o horário.
Perguntas frequentes
O que significa JANELA_EXPIRADA na API do WhatsApp?
Que já se passaram mais de 24 horas desde a última mensagem do contato (ou que ele nunca escreveu). Nessa situação a Meta só aceita template aprovado. A FlashConnect barra o envio antes de chamar a Meta e responde 409; se a Meta recusar pelo mesmo motivo, a resposta é 502 com codigo_meta 131047. Envie um template.
Por que recebo 404 se o recurso existe?
Porque ele pertence a outra conta, ou a chave usada é de outra conta. A API responde 404 em vez de 403 para não revelar que o recurso existe. Confira se a chave e o id são da mesma empresa.
Qual a diferença entre CHAVE_INVALIDA e ESCOPO_INSUFICIENTE?
CHAVE_INVALIDA (401) quer dizer que a chave não existe ou foi digitada errada. ESCOPO_INSUFICIENTE (403) quer dizer que a chave é válida, mas não tem a permissão daquela rota ou ferramenta. Gere uma nova chave com o escopo necessário.
Quando vale a pena tentar de novo?
Em 500 (falha nossa), no 503 do media-download e no RATE_LIMIT da Meta, com espera crescente entre as tentativas. Não repita um 4xx sem mudar o pedido, nem os 502 NUMERO_NAO_WHATSAPP, LIMITE_QUALIDADE, TEMPLATE_INVALIDO ou CONTA_BLOQUEADA.
O que fazer com TOKEN_INVALIDO no envio?
Se veio com HTTP 502 e codigo_meta 190, o token da conexão com a Meta expirou ou foi revogado: o dono da conta precisa reconectar o WhatsApp no painel. Se veio com HTTP 401, é o login do painel (JWT) que expirou: entre de novo.
Quer usar a FlashConnect?
O acesso está sendo liberado por convite. Fale com a gente no WhatsApp.
Pedir convite no WhatsApp