API, webhooks e MCP
Tudo o que acontece nos sistemas da Lachev (Chev, Chev Vendas e os próximos) vira um evento na linha do tempo da empresa. Você lê essa linha do tempo pela API, recebe cada evento num webhook ou deixa um assistente de IA consultar pelo MCP.
https://api.lachev.tech. A API e os webhooks usam uma chave lch_;
o MCP aceita a chave ou o login pelo navegador (conector OAuth).
Autenticação
Crie uma chave na tela Integrações do Chev Vendas (dono ou gestor). Ela começa com lch_, aparece uma vez só e vai no cabeçalho
Authorization: Bearer lch_…. Crie uma chave por uso (n8n, planilha, assistente) para poder revogar só aquela.
Limite: 120 pedidos por minuto por chave.
Eventos
Todo evento tem o mesmo formato. O que muda é o tipo e o conteúdo de dados. Valores em dinheiro vêm em centavos.
{
"id": "evt_8Qk2…", // único; use para não processar duas vezes
"tipo": "negocio.ganho",
"versao": 1,
"ocorrido_em": "2026-10-22T18:40:00.000Z",
"produto": "chev-vendas",
"cursor": "1842", // posição na linha do tempo (API)
"conta": { "id": "cta_…" }, // a sua empresa na Lachev
"dados": {
"negocio": { "id": "…", "titulo": "Ana — Ótica Ana", "valorCents": 199700, "status": "GANHO", "etapa": "Fechado", "link": "…" },
"contato": { "nome": "Ana Souza", "telefone": "5519…", "origem": "META_ADS", "anuncioId": "120…" }
}
}
| Tipo | Quando | Principais dados |
|---|---|---|
lead.novo | Primeira mensagem no WhatsApp ou formulário do site | lead, origem |
lead.etapa | O lead mudou de etapa no atendimento (SDR) | lead.etapa, lead.etapaAnterior |
lead.qualificado | Lead pronto para o vendedor | lead.respostas, origem.anuncioId |
reuniao.marcada | Reunião marcada com o lead | lead.reuniaoEm |
conversa.escalada | A conversa pediu uma pessoa | motivo, lead.link |
negocio.criado | Negócio aberto no funil de vendas | negocio, contato |
negocio.etapa | O negócio mudou de etapa | negocio.etapa |
negocio.ganho | Venda fechada | negocio.valorCents |
negocio.perdido | Negócio perdido | negocio.motivoPerda |
pagamento.recebido | Dinheiro entrou | pagamento.valorCents, pagamento.pagoEm |
assinatura.ativada · assinatura.cancelada | Assinatura ativada, renovada ou cancelada | assinatura |
nota.emitida | Nota fiscal emitida | nota |
cadastro.criado | Cadastro novo num sistema da Lachev | contato |
Nos filtros, lead.* pega o grupo inteiro e * pega tudo. O texto das conversas não entra nos eventos.
API de leitura
| Rota | O que faz |
|---|---|
GET /v1/eventos | Mais novos primeiro. Filtros: tipo (vírgula separa), desde (ISO), limite (até 200) |
GET /v1/eventos?depois=<cursor> | O que chegou depois do cursor, do mais antigo para o mais novo. Comece com depois=0 e guarde o cursor da resposta |
GET /v1/eventos/<id> | Um evento |
GET /v1/tipos-de-evento | O catálogo acima |
GET /v1/conta | A conta e os sistemas da Lachev ligados a ela |
curl "https://api.lachev.tech/v1/eventos?depois=0&limite=100" \
-H "Authorization: Bearer lch_…"
# resposta
{ "dados": [ …eventos em ordem… ], "cursor": "1842" } # próxima leitura: ?depois=1842
Webhooks
Cadastre o endereço (https) na tela de Integrações, ou pela API com uma chave que tenha o escopo webhooks.
Cada evento marcado chega num POST com o JSON acima e estes cabeçalhos:
X-Lachev-Evento: negocio.ganho
X-Lachev-Entrega: 9812
X-Lachev-Assinatura: t=1792519200,v1=5f2c… # HMAC-SHA256(segredo, "<t>.<corpo cru>")
Responda com 2xx em até 15 segundos. Qualquer outra resposta é tentada de novo em 1, 5, 15 e 60 minutos, 3 e 12 horas; erros 4xx (fora 408, 409, 425 e 429)
não são repetidos. Responder 410 desliga o webhook. Depois de 30 falhas seguidas ele é desligado e a tela mostra o motivo.
Conferir a assinatura (Node)
import { createHmac, timingSafeEqual } from "node:crypto";
function veioDaLachev(segredo, cabecalho, corpoCru) {
const p = Object.fromEntries(cabecalho.split(",").map((x) => x.trim().split("=")));
if (Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false; // entrega velha
const esperado = createHmac("sha256", segredo).update(`${p.t}.${corpoCru}`).digest("hex");
return esperado.length === p.v1.length && timingSafeEqual(Buffer.from(esperado), Buffer.from(p.v1));
}
Conferir a assinatura (Python)
import hmac, hashlib, time
def veio_da_lachev(segredo: str, cabecalho: str, corpo_cru: bytes) -> bool:
p = dict(x.strip().split("=", 1) for x in cabecalho.split(","))
if abs(time.time() - int(p["t"])) > 300:
return False
esperado = hmac.new(segredo.encode(), f'{p["t"]}.'.encode() + corpo_cru, hashlib.sha256).hexdigest()
return hmac.compare_digest(esperado, p["v1"])
Assinatura REST (Zapier e afins)
POST /v1/webhooks { "url": "https://…", "eventos": ["negocio.ganho"] } # ou "hookUrl"
→ 201 { "id": "dst_…", "segredo": "whsec_…" }
GET /v1/webhooks
DELETE /v1/webhooks/dst_…
MCP: a IA lendo a linha do tempo
Servidor MCP em https://api.lachev.tech/mcp (Streamable HTTP, sem estado), com a mesma chave no cabeçalho. Ferramentas, todas só de leitura:
resumo_do_periodo: leads, qualificados, reuniões, vendas, valor vendido e recebido, taxas.eventos_recentes: o que aconteceu, com filtro por tipo e por dias.historico_do_contato: tudo de uma pessoa, por nome, telefone ou e-mail.tipos_de_evento: o catálogo.
# Claude Code
claude mcp add --transport http lachev https://api.lachev.tech/mcp \
--header "Authorization: Bearer lch_…"
# Clientes que leem um arquivo de configuração
{ "mcpServers": { "lachev": { "type": "http", "url": "https://api.lachev.tech/mcp",
"headers": { "Authorization": "Bearer lch_…" } } } }
Conector com login (claude.ai, ChatGPT e outros)
Nos clientes que adicionam um servidor só pelo endereço, não precisa de chave. No claude.ai:
Configurações → Conectores → Adicionar conector personalizado, cole https://api.lachev.tech/mcp
e clique em Conectar. Abre o login com o Google: entre com a conta de dono ou gestor no Chev Vendas e escolha a empresa.
- O acesso é só de leitura e de uma empresa por vez. Para outra empresa, adicione o conector de novo.
- A sessão renova sozinha. Quem deixa de ser dono ou gestor perde o acesso na renovação seguinte.
- Para cortar o acesso, remova o conector no cliente.
Por baixo, é a especificação de autorização do MCP: 401 com WWW-Authenticate apontando para
/.well-known/oauth-protected-resource/mcp, servidor em /.well-known/oauth-authorization-server,
registro dinâmico de cliente, código de autorização com PKCE (S256) e token de 1 hora com renovação.
Receitas: n8n e Make
Receber na hora
No n8n, um nó Webhook (POST); no Make, um Custom webhook. Cadastre o endereço gerado na tela de Integrações e marque os eventos.
Buscar de tempos em tempos
- Gatilho de agendamento (a cada 5 minutos, por exemplo).
- Requisição HTTP
GET /v1/eventos?depois={{cursor guardado}}&limite=200com o cabeçalho da chave. - Para cada item de
dados, faça o que precisar (linha na planilha, lançamento no ERP). - Guarde o
cursorda resposta para a próxima rodada (no n8n, static data do workflow; no Make, um data store).
Precisa de algo que não está aqui? Escreva para a Lachev.