Recadu Guia da API

Erros

Todo erro vem em application/problem+json (RFC 9457):

{
  "type": "https://docs.recadu.com.br/problems/contact-opted-out",
  "title": "Dados inválidos",
  "status": 422,
  "detail": "Este contato pediu para não receber mais mensagens desta conta. ...",
  "instance": "/v1/messages",
  "request_id": "5f0c9a1e2b7d4c8e9a6b3d2f1e0c4b7a"
}

Vale tentar de novo? Sim em 429 (depois do Retry-After), 500, 502 e 503, sempre com a mesma Idempotency-Key. Nos outros, corrija o pedido antes.

Falhas depois que a mensagem foi aceita (número sem WhatsApp, mídia que não baixa) não são erros HTTP: aparecem em error.code da mensagem e no evento message.failed. Veja mensagens.

Autenticação e permissão

unauthorized

401. Falta a chave, ou ela é inválida ou foi revogada. Mande Authorization: Bearer gwk_live_....

insufficient-scope

403. A chave não tem o escopo da operação (vem em required_scope). Crie uma chave com o escopo no painel.

forbidden

403. O seu papel no painel não permite a ação.

account-suspended

403. A conta está suspensa e os envios estão bloqueados. Fale com o suporte.

Pedido

validation-error

422. Campos inválidos; a lista está em errors, com o caminho de cada campo.

invalid-message

422. A mensagem não está montada certo: por exemplo, type: "image" sem o campo image, ou um botão url sem url. O detail diz o quê.

invalid-phone

422. Telefone com DDI e DDD, só dígitos, de 8 a 15.

invalid-reply-to

422. A mensagem citada em reply_to não existe nesta instância ou ainda não saiu.

invalid-policy

422. Política com valor inválido (horário fora do formato HH:MM, número negativo...).

invalid-timezone

422. Fuso desconhecido. Use nomes IANA, como America/Sao_Paulo.

invalid-month

422. Use o mês como AAAA-MM.

invalid-webhook-url

422. A URL do webhook precisa ser HTTPS e apontar para um endereço público.

invalid-cursor

400. O cursor da paginação é inválido ou venceu. Comece de novo sem cursor.

invalid-idempotency-key

400. Idempotency-Key deve ter de 1 a 255 caracteres.

idempotency-key-reused

422. A mesma Idempotency-Key foi usada com outro corpo nas últimas 24 h. Gere uma chave por envio.

idempotency-in-progress

409. Um pedido com esta Idempotency-Key ainda está sendo processado. Espere um pouco e repita.

precondition-failed

412. O recurso mudou desde que você o leu (If-Match não confere). Leia de novo e reaplique a mudança.

not-found

404. O recurso não existe nesta conta, ou a chave é restrita a outras instâncias.

method-not-allowed

405. Método HTTP não aceito nesta rota.

Instâncias

instance-limit-reached

409. O plano não permite mais instâncias. Remova uma ou fale com o suporte para mudar o plano.

instance-name-taken

409. Já existe uma instância com este nome na conta.

sandbox-limit-reached

409. Cada conta pode ter até 3 instâncias sandbox.

not-sandbox

409. Só instâncias sandbox aceitam mensagens simuladas.

already-paired

409. A instância já está pareada. Desconecte (POST .../logout) antes de parear de novo.

pairing-failed

502. O WhatsApp recusou o pareamento. Para o código, confira o telefone; tente de novo em seguida.

engine-unavailable

503. A conexão com o WhatsApp não respondeu a tempo. Tente de novo em alguns segundos (Retry-After).

Envio

contact-opted-out

422. O contato pediu para não receber mais mensagens (mandou SAIR). Ele volta a receber se mandar VOLTAR. Remover o descadastro pela API (DELETE /v1/opt-outs/{phone}) só com o consentimento dele. Veja descadastro.

policy-new-contacts-limit

429. A instância chegou ao limite de contatos novos (quem nunca escreveu) nas últimas 24 h. Espere o Retry-After ou reduza os envios ativos. Número em aquecimento tem limite menor. Veja políticas.

policy-mass-send-blocked

422. O mesmo texto foi para muitos contatos novos em pouco tempo, o que parece disparo em massa. Personalize a mensagem (nome, pedido) ou espalhe os envios.

policy-outside-hours

422. Mensagem para quem não escreveu nas últimas 24 h, fora da janela de horário da instância. Mande dentro da janela ou use active_hours.outside: "schedule" para agendar. Veja janela de horário.

rate-limited

429. Passou do limite de requisições por minuto da chave. Espere o Retry-After.

media-not-found

422. O media_id não existe ou já venceu (30 dias). Envie o arquivo de novo.

media-expired

410. O arquivo venceu e não pode mais ser usado nem baixado.

file-too-large

413. O arquivo passa de 64 MB.

empty-file

422. O arquivo enviado está vazio.

Mensagens enviadas

message-not-sent

409. A mensagem ainda não saiu, então não dá para editar, apagar para todos ou reagir.

not-editable

409. Só mensagens de texto podem ser editadas.

edit-window-closed

409. O WhatsApp só permite editar até 15 minutos depois do envio.

message-sending

409. A mensagem já está saindo e não dá mais para cancelar.

Webhooks

webhook-limit-reached

409. A conta já tem 10 destinos de webhook.

delivery-pending

409. A entrega ainda está em andamento; espere ela terminar para reenviar.

Erros do servidor

internal-error

500. Erro inesperado do Recadu. Tente de novo; se repetir, mande o request_id ao suporte.

Painel

Erros que aparecem no painel, não na API com chave.

invalid-credentials

401 ou 422. E-mail ou senha incorretos.

login-locked

429. Muitas tentativas erradas; espere os minutos indicados.

mfa-required

401. Conclua a verificação em duas etapas (2FA).

invalid-code

422. Código do 2FA incorreto. Confira se o horário do celular está automático.

mfa-not-pending, mfa-not-verified, mfa-setup-not-started

409. Passo do 2FA fora de ordem. Recarregue a página e comece de novo.

weak-password

422. A senha precisa de pelo menos 12 caracteres, não pode ser o e-mail nem repetitiva demais (como aaaaaaaaaaaa).

csrf-failed

403. A sessão da página venceu. Recarregue.

origin-not-allowed

403. Pedido vindo de outro site. Entre pelo endereço do painel.

no-account

403. O seu usuário não participa (ou deixou de participar) de nenhuma conta.

invitation-invalid

404. Convite vencido ou já usado. Peça outro ao dono da conta.

already-member, user-exists

409. O e-mail já participa da conta / já tem usuário.

last-owner

409. A conta precisa de pelo menos um dono.

invalid-scopes

422. Escolha pelo menos um escopo válido para a chave.

invalid-expiration

422. A validade da chave precisa ser no futuro.

contact-exists, too-many-contacts, invalid-contact

409 / 422. Contatos de aviso de desconexão: já cadastrado, limite atingido ou dado inválido.

handoff-invalid

401. Link de acesso do suporte vencido ou já usado.