API do Combot
O Combot é o WhatsApp e o Telefone com IA da sua empresa. A API só precisa da chave de API: com ela o seu sistema envia mensagens (texto, PDF, botões de copiar PIX e boleto) e, se quiser, recebe as respostas e atende o telefone.
Disponível no plano Bot com IA. Gere sua chave em Integrações.
Visão geral
A API é REST sobre HTTPS e usa JSON. A URL base é:
https://combot.com.br/api/v1api.combot.com.br e app.combot.com.br não existem — use exatamente o endereço acima.
Primeiro: o que o seu sistema vai fazer?
- Só enviar mensagens (código de acesso, aviso, cobrança, lembrete) — o caso mais comum.
Precisa: só a chave de API ePOST /api/v1/messages. Não configure webhook. - Receber o que o cliente escreve e responder pelo seu sistema (ERP, CRM, provedor).
Precisa: a chave de API e um endereçohttpsno seu sistema. Ao salvar a chave, o seu sistema chama PUT /api/v1/integration uma vez — ninguém copia URL nem marca nada no painel do Combot. - Atender o Telefone com IA com os dados do seu sistema (provedor de internet, TV por assinatura, banco, qualquer ERP) — como a integração pronta com o SGP.
Precisa: o caso 2 comphoneAi: true. Veja Telefone pelo seu sistema. - Não tem sistema: use a IA treinável do Combot no painel, ou peça uma resposta a ela em
POST /api/v1/ai/reply.
Para agentes de IA
A API é feita para integrações — inclusive por agentes de IA. Há uma descrição machine-readable pronta para consumo automático:
- /llms.txt — resumo do serviço e endpoints em texto, no formato llms.txt.
- /openapi.json — especificação OpenAPI 3.1 (importe em ferramentas de IA e SDKs).
Basta apontar seu agente para o OpenAPI e usar a chave de API da empresa como Bearer token. Na tela do sistema que ele integrar, peça só a chave de API — nada de campo “segredo do webhook”.
Autenticação
Todas as chamadas usam sua chave de API no header Authorization. Gere e rotacione a chave em Integrações.
Authorization: Bearer cb_live_sua_chave_aquiMantenha a chave no backend. Nunca a exponha no navegador ou em apps públicos.
Regras que não mudam
Valem para qualquer sistema, ERP ou IA:
- A única credencial é a chave de API. Não existe segredo de webhook,
whsec_, token de app ou senha. - Webhook não é obrigatório: só existe para quem recebe (casos 2 e 3), e o seu sistema o configura sozinho pela API.
- Para responder a uma mensagem que chegou pelo webhook, use o
conversationIdque veio nele — não o telefone. - Para começar uma conversa (cobrança, aviso), use
tocom o telefone em qualquer formato: com ou sem 55, com ou sem o 9º dígito, com pontuação. O Combot acha a conta de WhatsApp de verdade e usa a conversa que já existir com o cliente. - Sempre confira
okna resposta.ok: falsequer dizer que a mensagem não chegou, eerrordiz o motivo (ex.:numero_sem_whatsapp). - No webhook, responda
200em até 8 segundos e processe depois; usemessage.idpara não responder duas vezes.
Enviar mensagem de WhatsApp
Envia uma mensagem de texto pelo número de WhatsApp conectado da sua empresa.
O to aceita o telefone em qualquer formato — (38) 99999-0000, 38999990000, +55 38 9999-0000. O WhatsApp guarda parte dos celulares sem o 9º dígito; o Combot descobre a forma certa sozinho.
Corpo — por telefone:
{
"to": "5511999998888",
"text": "Olá! Recebemos seu pedido e já estamos preparando."
}Ou respondendo uma conversa existente:
{
"conversationId": "clx123...",
"text": "Seu protocolo é #4821."
}Botões de copiar (PIX, boleto) — opcional:
Envie até 3 botões em buttons. Cada um copia um código com um toque. O Combot também manda o código numa mensagem própria, dentro de um bloco de código — isso é importante porque um código solto (o PIX contém br.gov.bcb.pix) vira link no WhatsApp e o cliente acaba copiando só um pedaço.
{
"to": "5511999998888",
"text": "*PIX copia-e-cola* — R$ 119,90",
"footer": "Fast Telekom",
"buttons": [
{ "displayText": "📋 Copiar código Pix", "copyCode": "00020126..." },
{ "displayText": "📋 Copiar código do boleto", "copyCode": "34191.79001..." }
]
}displayText = texto do botão (até 25 caracteres). copyCode = o que vai para a área de transferência. footer é opcional. Se o aparelho do cliente não exibir o botão, o código ainda chega na mensagem seguinte.
Arquivo (PDF do boleto) e imagem (QR Code do PIX):
Informe type + url (URL pública em https — o Combot baixa o arquivo para enviar; endereço interno ou de rede privada é recusado). Com mídia, o campo text deixa de ser obrigatório: a legenda vai em caption. O documento chega como um cartão com o nome do arquivo e botão de baixar.
{
"to": "5511999998888",
"type": "document",
"url": "https://exemplo.com/boleto.pdf",
"filename": "Fatura.pdf",
"caption": "Total: R$ 119,90"
}{
"to": "5511999998888",
"type": "image",
"url": "https://exemplo.com/qrcode-pix.png",
"caption": "Aponte a câmera do banco e pague"
}Exemplo (cURL):
curl -X POST https://combot.com.br/api/v1/messages \
-H "Authorization: Bearer cb_live_sua_chave" \
-H "Content-Type: application/json" \
-d '{"to":"5511999998888","text":"Olá!"}'Resposta:
{
"ok": true,
"simulated": false,
"messageId": "clx456...",
"conversationId": "clx123..."
}Quando não chega ao cliente (HTTP 200, mas ok: false):
{
"ok": false,
"error": "numero_sem_whatsapp",
"messageId": "clx456...",
"conversationId": "clx123..."
}Gerar resposta da IA
Gera uma resposta usando o agente de IA e a base de conhecimento treinada da sua empresa. Não envia nada ao cliente — apenas devolve o texto.
Corpo:
{ "message": "vocês entregam em Curitiba?" }Resposta:
{
"reply": "Sim! Entregamos em Curitiba em até 3 dias úteis.",
"handoff": false,
"tokensIn": 812,
"tokensOut": 34
}handoff: true indica que a IA sugere transferir para um atendente humano.
Configurar recebimento (o seu sistema chama sozinho)
Diz ao Combot para onde entregar o que o seu sistema recebe. Chame quando o usuário salvar a chave no seu sistema. Mande só o que quer mudar. GET /api/v1/integration mostra como está.
{
"webhookUrl": "https://seu-sistema.com/webhooks/combot",
"forwardInbound": true,
"phoneAi": false
}webhookUrl: https num domínio público, sem porta.nulldesliga o recebimento.forwardInbound:true= as mensagens vão para o seu sistema e a IA do Combot não responde.phoneAi:true= o Telefone com IA usa o treinamento e as ferramentas do seu sistema.
Resposta:
{ "ok": true, "webhookUrl": "https://seu-sistema.com/webhooks/combot", "forwardInbound": true, "phoneAi": false }Receber mensagens (caso 2)
Só para o caso 2. Depois do PUT /api/v1/integration com forwardInbound: true, cada mensagem recebida é enviada por POST para o seu endereço, e a IA do Combot fica calada (quem responde é o seu sistema):
Corpo enviado ao seu sistema:
{
"event": "message.received",
"conversationId": "clx123...",
"contact": { "id": "clx...", "name": "Maria", "phone": "5511999998888" },
"message": {
"id": "clm789...",
"externalId": "wamid.HBg...",
"text": "quero trocar meu produto",
"direction": "inbound"
},
"isNewContact": false
}Responda ao cliente chamando POST /api/v1/messages com o conversationId recebido. Retorne 200 rapidamente — o processamento pesado deve ser assíncrono do seu lado.
Deduplicação: use message.id (id estável do Combot) ou message.externalId (o wamid do WhatsApp) como chave idempotente — a Meta pode reentregar o mesmo evento.
Telefone com IA pelo seu sistema (caso 3)
A ligação é atendida pela IA de voz do Combot no número da empresa — idioma, voz e minutos continuam do Combot —, mas o que ela sabe e o que ela faz vem do seu sistema. Exemplo: a pessoa liga, fala o CPF, a IA consulta o seu sistema (“seu plano é o Fibra 300, em dia”) e manda a 2ª via no WhatsApp. Ligue com phoneAi: true no PUT /api/v1/integration (ou o dono escolhe em Telefone com IA → Quem atende → Meu sistema).
Durante a ligação o Combot faz POST no seu endereço (o mesmo do caso 2), separando pelo campo event:
O idioma e a voz são escolhidos na página de cada número, inclusive quando o ERP atende. O ERP recebe idioma e voz e deve responder com informações compatíveis. A voz do Combot segue o idioma selecionado; ele não depende da língua usada no painel.
Para validar a conexão sem fazer uma ligação, implemente o evento integration.test: verifique a assinatura normalmente e responda {"ok":true}, sem criar pedidos, chamados ou mensagens. O botão Testar conexão na tela de Integrações envia esse evento assinado e aguarda até 6 segundos.
1. call.started — responda em até 6 segundos
// recebe
{ "event": "call.started", "evento": "ligacao.inicio", "ligacaoId": "clx...", "de": "31999990000", "para": "553130309999", "idioma": "en-US", "voz": "ana" }
// devolve
{
"ok": true,
"saudacao": "Empresa Exemplo, olá! Aqui é a Ana. Em que posso ajudar?",
"instrucoes": "Você é a Ana, da Empresa Exemplo... (o treinamento e, se 'de' for cliente, os dados dele)",
"ferramentas": [
{
"nome": "consultar_assinatura",
"descricao": "Acha o cliente pelo CPF e diz o plano e se está em dia.",
"parametros": [{ "nome": "cpf_cnpj", "tipo": "string", "descricao": "Só números", "obrigatorio": true }]
},
{ "nome": "enviar_segunda_via", "descricao": "Manda a fatura com PIX no WhatsApp de quem liga.", "parametros": [] }
]
}Sem resposta a tempo, ok: false ou HTTP 409: a ligação informa que o ERP está indisponível e encerra com educação. Não usa outro treinamento, agenda, produto ou serviço do Combot.
2. call.tool — a IA pediu uma ferramenta; responda em até 20 segundos
// recebe
{ "event": "call.tool", "ligacaoId": "clx...", "de": "31999990000",
"ferramenta": "consultar_assinatura", "argumentos": { "cpf_cnpj": "12345678909" } }
// devolve — "texto" é o que a IA vai FALAR
{ "ok": true, "texto": "Cliente Maria. Plano Fibra 300, em dia." }Nunca devolva código PIX ou de barras para a IA ditar: envie pelo WhatsApp com POST /api/v1/messages (to = o número de) e devolva “mandei no WhatsApp”. Coisa lenta? Responda primeiro e faça depois.
3. call.ended — para o seu histórico
{ "event": "call.ended", "ligacaoId": "clx...", "de": "31999990000",
"duracaoSeg": 140, "resumo": "...", "transcricao": "..." }Assinatura (opcional)
Toda chamada do Combot ao seu sistema (mensagens e telefone) leva o header X-Combot-Signature: HMAC-SHA256 do corpo cru, feito com a sua chave de API — a mesma do Authorization. Não existe outro segredo. Conferir é opcional, mas recomendado:
import crypto from "crypto";
function isValid(rawBody, signature, apiKey) {
const expected =
"sha256=" + crypto.createHmac("sha256", apiKey).update(rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}Erros
A API usa códigos HTTP convencionais e um corpo { "error": "..." }:
401 missing_token / invalid_token— chave ausente ou inválida.402 billing_blocked— a conta está bloqueada por mensalidade em atraso. Pague em Financeiro e a API volta.403 plan_without_api_access— o plano da empresa não libera a API.403 account_inactive— a conta foi encerrada ou bloqueada.400 missing_text / missing_recipient / missing_message— corpo incompleto.400 invalid_webhook_url / webhook_url_required— endereço inválido ou faltando noPUT /api/v1/integration.429 ai_monthly_limit_reached— a IA do mês chegou ao limite do plano (POST /api/v1/ai/reply); volta no mês seguinte.403 plan_without_ai— o plano não inclui IA.429 rate_limit_exceeded— espere o tempo do cabeçalhoRetry-Aftere tente de novo.404 conversation_not_found— conversa inexistente para a empresa.409 no_whatsapp_channel— nenhum WhatsApp conectado na empresa.200comok: false— a mensagem foi registrada, mas não chegou ao cliente;errordiz o motivo.
Quando algo não funciona
Ache em qual ponto a mensagem parou, nesta ordem:
- A mensagem do cliente não chega no seu sistema. Chame
GET /api/v1/integration: owebhookUrltem de ser o seu endereço, emhttps, eforwardInboundtem de estartrue. Confira também se o WhatsApp da empresa está Conectado em Canais. - Chega, mas o seu sistema recusa. Se confere a assinatura, use o corpo cru (antes de converter o JSON) e a chave de API; responda
200em até 8 segundos — processe depois. - O seu sistema responde, mas o cliente não recebe. Leia o
oke oerrorda resposta dePOST /api/v1/messages:numero_sem_whatsappquer dizer que aquele telefone não tem WhatsApp; os erros que começam comevolution_quase sempre são o celular da empresa desconectado — leia o QR Code de novo. - Responde em dobro. Use
message.idcomo chave: o mesmo evento pode chegar mais de uma vez.
Pronto para integrar?
Gere sua chave de API em Integrações — é a única coisa que o seu sistema precisa.
Ir para Integrações