vamobotDocs

Erros

O formato único de erro da API, o que cada status significa e o que fazer com cada código.

Quando algo dá errado, a API responde com um status HTTP de erro e sempre o mesmo JSON. Este é o mapa para tratar cada caso.

O formato

Todo erro, de qualquer rota, vem assim:

{
  "error": {
    "code": "whatsapp_window_closed",
    "message": "The 24-hour customer service window is closed. Send an approved template instead."
  }
}
CampoO que é
error.codeCódigo estável, para o seu programa decidir o que fazer. Não muda
error.messageTexto para pessoas, em inglês. Pode mudar: não compare com ele
Outros camposDetalhes de alguns erros, ao lado de code e message. Por exemplo available em out_of_stock, issues em validation_error, retryAfterSec em rate_limited

Um jeito simples de ler:

const res = await fetch(url, options);
if (!res.ok) {
  const { error } = await res.json().catch(() => ({ error: {} }));
  const retryAfter = res.headers.get("Retry-After"); // no 429 e no 409 idempotency_key_in_progress
  throw Object.assign(new Error(error.message), { status: res.status, code: error.code, details: error, retryAfter });
}

Status HTTP

StatusSignifica
400O pedido está errado: JSON inválido, campo que falta ou com valor inválido, regra do modelo não cumprida
401Chave ausente, inválida, revogada ou expirada (veja Autenticação)
402Envio recusado por cobrança
403A chave não pode fazer isso: publicável fora de lojas e modelos, ou chave somente leitura tentando escrever
404Não existe, é de outra organização, ou o ID não é um UUID (as respostas são iguais de propósito)
409Conflito com o estado atual: estoque, etapa do pedido, contato repetido, WhatsApp desconectado, envio em andamento
422A regra do WhatsApp não permite (janela de 24 horas, número sem WhatsApp, opt-out de marketing), ou um Idempotency-Key reaproveitado com outro pedido
429Limite de requisições da sua chave, ou o WhatsApp pediu para esperar. Respeite Retry-After
500Erro do Vamo (internal_error). Tente de novo mais tarde
502O WhatsApp não processou o envio

Códigos gerais

Valem para todas as rotas.

CódigoStatusO que aconteceuO que fazer
missing_api_key, invalid_api_key, api_key_revoked, api_key_expired401Problema com a chaveVeja Autenticação
publishable_key_read_only, publishable_key_forbidden, read_only_key403A chave não tem esse acessoUse uma chave secreta com Leitura e escrita
invalid_json400O corpo não é um JSON válidoConfira o corpo e o Content-Type: application/json
validation_error400Um campo falta ou tem valor inválido, no corpo ou na query string (page=abc, status fora da lista)message diz o campo (phone: …) e issues traz todos: [{ "path": "phone", "message": "…" }]
not_found404O recurso não existe na sua organizaçãoConfira o ID
rate_limited429A sua chave passou do limite por minutoEspere os segundos de Retry-After (veja Limites de requisição)
invalid_idempotency_key400Idempotency-Key com mais de 200 caracteresUse uma chave menor
idempotency_key_reused422A mesma Idempotency-Key com outro pedidoUse uma chave nova para cada operação
idempotency_key_in_progress409A primeira requisição com essa chave ainda está rodandoTente de novo em 1 segundo
internal_error500Erro do VamoTente de novo com espera crescente

Erros de envio pelo WhatsApp

Vêm de POST /messages/send e POST /templates/send, e aparecem por item no envio em massa.

CódigoStatusO que aconteceuO que fazer
whatsapp_window_closed422O cliente não escreveu nas últimas 24 horasEnvie um modelo aprovado
whatsapp_recipient_unavailable422O número não recebe WhatsApp, ou o contato não tem númeroConfira o telefone do contato
whatsapp_marketing_opt_out422O cliente pediu para não receber marketingNão envie modelos de marketing para ele; utilidade continua valendo
whatsapp_template_error422O WhatsApp recusou o modelo: pausado, desativado, ou variáveis que não batemConfira o status do modelo e envie um valor para cada variável
whatsapp_busy409Outra mensagem para o mesmo contato está saindo agoraTente de novo em alguns segundos
whatsapp_not_connected409O WhatsApp da loja não está conectadoConecte o número no Vamo
trial_marketing_blocked409Modelo de marketing durante o período de testeEnvie depois do teste, ou use um modelo de utilidade
whatsapp_rate_limited429A Meta segurou os envios do númeroEspere os segundos de Retry-After (60, se não vier) e tente de novo
whatsapp_billing402O WhatsApp recusou por cobrançaFale com o suporte do Vamo
billing_marketing_restricted402Há uma fatura do Vamo vencida: marketing pausado. Respostas e utilidade continuamRegularize em Configurações → Faturamento
whatsapp_upstream_error502O WhatsApp não processouTente mais tarde

Quando o WhatsApp chegou a receber a tentativa, ela fica gravada na conversa como failed. Em GET /messages/:id, errorCode traz então o código da própria Meta (por exemplo 131047 para janela fechada, 131026 para número sem WhatsApp).

Códigos de outras rotas

RotaCódigos
Contatoscontact_exists (com contactId), contact_has_orders
Modelosinvalid_phone, template_not_approved, template_not_sendable, template_header_variable_too_long, no_active_store
Pedidosproduct_not_found, inactive_product, variant_required, variant_not_found, mixed_currency, total_too_large, out_of_stock, invalid_transition, order_managed_by_store, order_in_review
Envio em massaPor item: os códigos de envio acima, not_found e internal_error
Webhookswebhook_disabled_test_first

Quando tentar de novo

RespostaTentar de novo?
429Sim, depois de Retry-After
409 whatsapp_busy, 409 idempotency_key_in_progress, 502, 500Sim, com espera crescente
Um POST sem resposta (a rede caiu)Sim, com o mesmo Idempotency-Key: o Vamo não envia nem cria de novo (veja Idempotência)
400, 401, 403, 404, 422Não: corrija o pedido antes

Nesta página