Pular para o conteúdo

API e webhooks

Os sistemas da sua empresa leem e alteram contatos, conversas, pedidos, agendamentos, o catálogo e a base de conhecimento pela API, e recebem os eventos da organização por webhooks. As chaves e os webhooks são criados em Integrações, no painel da organização.

Autenticação

Envie a chave de API no cabeçalho Authorization de cada requisição. A organização é a da chave, e a chave age em nome do membro que a criou enquanto ele fizer parte da organização. Chaves expiradas ou revogadas são recusadas.

Authorization: Bearer vumi_live_…

Todas as rotas ficam em /api/business/v1.

Permissões

Cada operação exige uma permissão da chave; sem ela, a resposta é 403 com o código API_KEY_SCOPE_MISSING.

PermissãoO que permite
contacts:read Ler contatos, com seus campos e etiquetas
contacts:write Criar e alterar contatos, suas etiquetas e campos, e apagar os dados de um contato
conversations:read Ler conversas e suas mensagens
conversations:write Assumir, devolver ao robô, encerrar e mudar o setor de conversas
messages:send Enviar textos, mídias e modelos aos contatos
orders:read Ler pedidos
orders:write Criar pedidos e mudar seu status
payments:read Ler cobranças
bookings:read Ler agendamentos
bookings:write Criar e cancelar agendamentos
catalog:write Cadastrar produtos e variações por SKU e ajustar o estoque
coupons:read Consultar cupons de desconto
coupons:write Cadastrar e alterar cupons de desconto
knowledge:write Cadastrar perguntas frequentes e textos na base de conhecimento
webhooks:manage Gerenciar os webhooks da organização

Paginação

As listas aceitam limit (quantos itens por página) e cursor (onde continuar) e respondem com os itens em data, o cursor da próxima página em nextCursor (null na última) e o total filtrado em total.

curl "https://vumi.com.br/api/business/v1/contacts?limit=50&cursor=eyJ…" \
  -H "Authorization: Bearer vumi_live_…"
{
  "data": [{ "id": "…", "name": "…" }],
  "nextCursor": "eyJ…",
  "total": 132
}

Repetição segura

Toda escrita aceita o cabeçalho Idempotency-Key. Repetir a mesma requisição com a mesma chave em até um dia devolve a primeira resposta, sem repetir a operação; a mesma chave com outra requisição é recusada.

curl -X POST "https://vumi.com.br/api/business/v1/orders" \
  -H "Authorization: Bearer vumi_live_…" \
  -H "Idempotency-Key: 9f1c2d3e-order-4521" \
  -H "Content-Type: application/json" \
  -d '{ … }'

Limite de requisições

Cada chave tem um limite de requisições por minuto, que depende do plano. Acima dele, a resposta é 429 com o cabeçalho Retry-After, em segundos.

Erros

Os erros respondem com um código estável, nunca com um texto para exibir; message é só uma descrição técnica e metadata traz os valores de cada código. Os principais:

{ "code": "API_KEY_SCOPE_MISSING", "message": "…", "metadata": { "scope": "orders:write" } }
CódigoQuando acontece
VALIDATION_ERROR A requisição tem campos inválidos; details diz quais.
API_KEY_INVALID A chave está ausente, malformada ou não existe.
API_KEY_EXPIRED A chave passou da validade.
API_KEY_REVOKED A chave foi revogada.
API_KEY_OWNER_GONE Quem criou a chave não faz mais parte da organização.
API_KEY_SCOPE_MISSING A chave não tem a permissão da operação.
PLAN_FEATURE_UNAVAILABLE O plano da organização não inclui o recurso.
PLAN_LIMIT_REACHED O plano da organização chegou ao limite.
NOT_FOUND O registro não existe na organização.
CURSOR_INVALID O cursor não foi emitido pela API.
IDEMPOTENCY_KEY_INVALID O Idempotency-Key está vazio, longo demais ou tem caracteres inválidos.
IDEMPOTENCY_KEY_REUSED O Idempotency-Key já foi usado com outra requisição.
IDEMPOTENCY_KEY_IN_PROGRESS A primeira requisição com o mesmo Idempotency-Key ainda está em andamento.
WINDOW_CLOSED A janela de 24 horas da conversa fechou; envie um modelo aprovado.
RATE_LIMITED A chave usou as requisições do minuto; espere o Retry-After.
INTERNAL_ERROR Uma falha inesperada; uma escrita com Idempotency-Key pode ser repetida.

Webhooks

Cada evento é enviado por POST, em JSON, a todos os webhooks ativos que o assinam. O corpo é sempre o mesmo envelope, com os dados do evento em data:

{
  "id": "5b0d6c1e-…",
  "type": "order.created",
  "createdAt": "2026-10-01T12:00:00.000Z",
  "organizationID": "…",
  "data": { … }
}

Cada entrega traz três cabeçalhos:

  • X-Webhook-ID: o ID do evento, igual em todas as tentativas e reenvios, para descartar repetições;
  • X-Webhook-Timestamp: o horário da tentativa em segundos Unix, para recusar entregas antigas;
  • X-Signature-256: sha256= seguido do HMAC-SHA256 em hexadecimal, com o segredo do webhook, de ${timestamp}.${body} sobre os bytes exatos recebidos.

Verifique a assinatura antes de usar o evento: calcule-a com o segredo do webhook (whsec_…) sobre os bytes exatos do corpo, antes de interpretar o JSON, compare em tempo constante e recuse horários com mais de cinco minutos de diferença. Em Node.js:

import { createHmac, timingSafeEqual } from "node:crypto";

function verifyWebhook(headers, rawBody, secret) {
    const timestamp = headers["x-webhook-timestamp"];
    const signature = headers["x-signature-256"] ?? "";
    if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
        return false;
    }
    const expected = "sha256=" + createHmac("sha256", secret)
        .update(`${timestamp}.${rawBody}`)
        .digest("hex");
    const received = Buffer.from(signature);
    return received.length === expected.length && timingSafeEqual(received, Buffer.from(expected));
}

Responda com qualquer status 2xx. Outras respostas e falhas de conexão são repetidas com intervalos crescentes por 24 horas; um webhook que falha todas as entregas por um dia é desativado, e os proprietários e administradores são avisados.

Eventos

EventoQuando é enviado
message.received Uma mensagem de um cliente chegou
message.sent Uma mensagem foi enviada a um cliente
message.status_changed Uma mensagem enviada foi entregue, lida ou falhou
conversation.handed_off Uma conversa foi passada para a equipe
conversation.closed Uma conversa foi encerrada
conversation.classified Uma conversa encerrada foi classificada
contact.created Um contato foi criado
contact.updated Um contato foi alterado
lead.captured O robô registrou um lead
lead.stage_changed Um contato mudou de etapa no funil
flow.completed Um cliente preencheu um formulário do WhatsApp
order.created Um pedido foi criado
order.status_changed O status de um pedido mudou
payment.confirmed Um pagamento foi confirmado
quote.accepted Um orçamento foi aceito
document.generated Um documento foi gerado
booking.created Um agendamento foi criado
booking.canceled Um agendamento foi cancelado
booking.rescheduled Um agendamento foi remarcado

Referência

Todas as operações, com a permissão que cada uma exige. O documento OpenAPI completo, com os campos de cada requisição e resposta, pode ser importado em ferramentas como Postman ou Insomnia.

Baixar openapi.json

Contatos

MétodoCaminhoPermissãoO que faz
GET /api/business/v1/contacts contacts:read Lista os contatos
POST /api/business/v1/contacts contacts:write Cria um contato
GET /api/business/v1/contacts/{contactID} contacts:read Lê um contato
PATCH /api/business/v1/contacts/{contactID} contacts:write Altera os campos e as etiquetas de um contato
DELETE /api/business/v1/contacts/{contactID} contacts:write Apaga os dados de um contato

Lead pipeline

MétodoCaminhoPermissãoO que faz
PUT /api/business/v1/contacts/{contactID}/lead contacts:write
GET /api/business/v1/lead-stages contacts:read

Conversas

MétodoCaminhoPermissãoO que faz
GET /api/business/v1/conversations conversations:read Lista as conversas
GET /api/business/v1/conversations/{conversationID} conversations:read Lê uma conversa com suas mensagens
POST /api/business/v1/conversations/{conversationID}/take-over conversations:write Assume uma conversa em nome do membro da chave
POST /api/business/v1/conversations/{conversationID}/return-to-bot conversations:write Devolve uma conversa ao robô
POST /api/business/v1/conversations/{conversationID}/close conversations:write Encerra uma conversa
PUT /api/business/v1/conversations/{conversationID}/department conversations:write Muda o setor de uma conversa

Mensagens

MétodoCaminhoPermissãoO que faz
POST /api/business/v1/messages messages:send Envia um texto, uma mídia ou um modelo a um contato

Pedidos

MétodoCaminhoPermissãoO que faz
GET /api/business/v1/orders orders:read Lista os pedidos
POST /api/business/v1/orders orders:write Cria um pedido
GET /api/business/v1/orders/{orderID} orders:read Lê um pedido
PUT /api/business/v1/orders/{orderID}/status orders:write Muda o status de um pedido
PUT /api/business/v1/orders/{orderID}/tracking orders:write

Pagamentos

MétodoCaminhoPermissãoO que faz
GET /api/business/v1/payment-requests payments:read Lista as cobranças
POST /api/business/v1/payment-requests orders:write Cria uma cobrança
GET /api/business/v1/payment-requests/{paymentRequestID} payments:read Lê uma cobrança

Agendamentos

MétodoCaminhoPermissãoO que faz
GET /api/business/v1/bookings bookings:read Lista os agendamentos
POST /api/business/v1/bookings bookings:write Cria um agendamento
GET /api/business/v1/bookings/{bookingID} bookings:read Lê um agendamento
POST /api/business/v1/bookings/{bookingID}/cancellation bookings:write Cancela um agendamento

Catálogo

MétodoCaminhoPermissãoO que faz
PUT /api/business/v1/catalog/products/{sku} catalog:write Cadastra ou atualiza um produto pelo SKU
PUT /api/business/v1/catalog/products/{sku}/variants/{variantSKU} catalog:write Cadastra ou atualiza uma variação pelo SKU
PUT /api/business/v1/catalog/variants/{sku}/stock catalog:write Ajusta o estoque de uma variação

Cupons

MétodoCaminhoPermissãoO que faz
GET /api/business/v1/coupons/{code} coupons:read Lê um cupom pelo código
PUT /api/business/v1/coupons/{code} coupons:write Cadastra ou atualiza um cupom pelo código

Base de conhecimento

MétodoCaminhoPermissãoO que faz
PUT /api/business/v1/knowledge/text-sources knowledge:write Cadastra ou atualiza um texto da base de conhecimento
PUT /api/business/v1/knowledge/faq-sources/{sourceID}/entries knowledge:write Cadastra ou atualiza uma pergunta frequente

Webhooks

MétodoCaminhoPermissãoO que faz
GET /api/business/v1/webhook-endpoints webhooks:manage Lista os webhooks
POST /api/business/v1/webhook-endpoints webhooks:manage Cria um webhook
GET /api/business/v1/webhook-endpoints/{endpointID} webhooks:manage Lê um webhook
PATCH /api/business/v1/webhook-endpoints/{endpointID} webhooks:manage Altera um webhook
DELETE /api/business/v1/webhook-endpoints/{endpointID} webhooks:manage Exclui um webhook
POST /api/business/v1/webhook-endpoints/{endpointID}/secret-rotation webhooks:manage Troca o segredo de assinatura de um webhook
GET /api/business/v1/webhook-endpoints/{endpointID}/deliveries webhooks:manage Lista as entregas de um webhook