Erros
Há dois formatos, conforme a rota.
Formato da Graph API#
Envio, mídia, handoff e token de Flow respondem como a Graph API da Meta:
code é o que a integração deve usar para decidir. Erros da própria Synergy trazem fbtrace_id começando com syn- e, às vezes, error_data.details (em inglês). Quando a Meta recusa, o erro dela é repassado com o status e o corpo que ela mandou (por exemplo 400 com o código 131047, fora da janela de 24 h).
{
"error": {
"message": "(#190) Invalid OAuth access token.",
"type": "OAuthException",
"code": 190,
"fbtrace_id": "syn-3f9a1c0b"
}
}Formato da gestão de webhooks#
/v1/webhooks… responde { "error": "…" }, às vezes com issues (problemas de validação, no formato do zod) ou feature (a feature do plano que falta):
A mensagem mistura inglês (recusas da rota) e português (regras da organização e do plano). Decida pelo status HTTP, não pelo texto.
{ "error": "Invalid body", "issues": [{ "code": "invalid_type", "path": ["fields"], "message": "Invalid input: expected array, received undefined" }] }Tabela de códigos#
| HTTP | code | O que é | O que fazer |
|---|---|---|---|
| 400 | 100 | Parâmetro inválido: falta to, corpo que não é JSON de objeto, corpo acima de 64 KB, falta phone_number_id na query | Corrija a requisição; veja error_data.details. Não repita igual |
| 400 | 1390009 | Flow com endpoint da Synergy sem flow_token válido | Emita o token (WhatsApp Flows) |
| 401 | 190 | Chave ausente, malformada, revogada ou sem acesso ao número | Confira o header e a chave; crie outra se foi revogada |
| 403 | 200 | A chave não tem o escopo exigido | Edite a chave no app ou use outra |
| 403 | 1390004 | O plano não inclui a API | Mude o plano em Configurações → Plano e uso |
| 403 | 1390005 | Conta em modo leitura ou suspensa por falta de pagamento | Regularize em Configurações → Cobrança |
| 403 | 1390007 | O plano não inclui WhatsApp Flows | Mude o plano |
| 404 | 100 | O phone_number_id ou o objeto não existe para esta chave | Confira o id; a resposta não diz o que o id é |
| 409 | 1390001 | Chave bot e a conversa está com um atendente | Espere a conversa voltar para a automação |
| 409 | 1390002 | Um envio com a mesma Idempotency-Key ainda está em andamento | Espere e repita com a mesma chave |
| 409 | 1390016 | POST …/journeys/{journey_id}/runs para uma pessoa que já tem uma execução de Jornada em andamento (uma chave nova não muda isso) | Espere a Jornada atual do contato terminar |
| 409 | 1390008 | O Flow usa o endpoint de outro provedor, ou não pode ser enviado | Use outro Flow |
| 422 | 1390003 | Idempotency-Key já usada para outro destinatário | Use uma chave nova |
| 429 | 130429 | Limite de taxa | Espere Retry-After (Limites de taxa) |
| 429 | 1390006 | Volume do ciclo esgotado | Compre uma recarga, mude o plano ou espere o ciclo; details traz o link |
| 429 | 1390010 | Limite de envios de Flow do plano no ciclo (sem Retry-After) | Aguarde o ciclo ou mude o plano |
| 503 | 2 | Falha temporária (a Meta não respondeu ou algo inesperado) | Tente de novo com backoff |
| outro | — | Erro da Meta, repassado | Veja a documentação da Meta para o código |
Erros da gestão de webhooks#
| HTTP | Quando | O que fazer |
|---|---|---|
| 400 | Invalid body; URL não aceita; a URL não respondeu à verificação em 5 s; chave limitada a números; limite de 20 webhooks | Leia error e issues |
| 401 | Chave revogada ou desconhecida (Invalid or revoked key); chave malformada vem no formato da Graph API (190) | Confira a chave |
| 403 | Sem o escopo management; plano sem API (feature: "api"); conta em modo leitura | Edite a chave ou o plano |
| 404 | Webhook not found | Confira o hook_id |
| 409 | Replay de um webhook desativado | Reative com PATCH {"enabled": true} |
| 413 | Corpo acima de 16 KB | Reduza o corpo |
| 429 | Rate limit hit (30 por minuto por chave) | Espere Retry-After |
| 502 | POST /v1/webhooks/{hook_id}/test: a URL não aceitou o teste | Veja HTTP <status> ou timeout no error |
Exemplo: tratar a resposta#
curl
curl -s -o resposta.json -w '%{http_code}\n' -X POST \
'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
-H "Authorization: Bearer $SYNERGY_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"messaging_product":"whatsapp","type":"text","text":{"body":"oi"}}'
cat resposta.json # 400, code 100, details: The parameter "to" is required.JavaScript
const res = await fetch(url, { method: 'POST', headers, body });
const data = await res.json();
if (!res.ok) {
const { code, message, error_data } = data.error ?? {};
if (res.status === 429) {
// veja rate-limits.md
} else if (res.status >= 500) {
// falha temporária: tente de novo com backoff
} else {
throw new Error(`#${code} ${message} ${error_data?.details ?? ''}`);
}
}Python
res = requests.post(url, headers=headers, json=body)
if not res.ok:
err = res.json().get("error", {})
if res.status_code == 429:
pass # veja rate-limits.md
elif res.status_code >= 500:
pass # falha temporária: tente de novo com backoff
else:
raise RuntimeError(f"#{err.get('code')} {err.get('message')}")Ficou com dúvida? Escreva para suporte@synergyconnect.com.br.