Para quem desenvolve · Conexões da Lachev

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.

Endereço base: 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…" }
  }
}
TipoQuandoPrincipais dados
lead.novoPrimeira mensagem no WhatsApp ou formulário do sitelead, origem
lead.etapaO lead mudou de etapa no atendimento (SDR)lead.etapa, lead.etapaAnterior
lead.qualificadoLead pronto para o vendedorlead.respostas, origem.anuncioId
reuniao.marcadaReunião marcada com o leadlead.reuniaoEm
conversa.escaladaA conversa pediu uma pessoamotivo, lead.link
negocio.criadoNegócio aberto no funil de vendasnegocio, contato
negocio.etapaO negócio mudou de etapanegocio.etapa
negocio.ganhoVenda fechadanegocio.valorCents
negocio.perdidoNegócio perdidonegocio.motivoPerda
pagamento.recebidoDinheiro entroupagamento.valorCents, pagamento.pagoEm
assinatura.ativada · assinatura.canceladaAssinatura ativada, renovada ou canceladaassinatura
nota.emitidaNota fiscal emitidanota
cadastro.criadoCadastro novo num sistema da Lachevcontato

Nos filtros, lead.* pega o grupo inteiro e * pega tudo. O texto das conversas não entra nos eventos.

API de leitura

RotaO que faz
GET /v1/eventosMais 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-eventoO catálogo acima
GET /v1/contaA 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

  1. Gatilho de agendamento (a cada 5 minutos, por exemplo).
  2. Requisição HTTP GET /v1/eventos?depois={{cursor guardado}}&limite=200 com o cabeçalho da chave.
  3. Para cada item de dados, faça o que precisar (linha na planilha, lançamento no ERP).
  4. Guarde o cursor da 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.