O momento em que o cliente abre um sinistro é o teste de fogo da relação com a seguradora. Ele acabou de bater o carro, teve a casa furtada ou caiu da escada e ouviu "passa em alguma agência" ou "preenche este formulário web de 27 campos". Pesquisa interna de uma seguradora top 5 mostra: 41% dos sinistros iniciados em formulário web são abandonados antes da finalização. O mesmo cliente, atendido via WhatsApp, finaliza em 88% dos casos — porque o canal já está aberto, ele tira foto direto da câmera, e a comunicação flui em mensagens curtas em vez de um questionário interminável.
Este guia mostra como uma seguradora estrutura o ciclo completo de sinistro via WhatsApp API: abertura guiada, coleta de fotos, geração de protocolo, acompanhamento de status, agendamento de vistoria e fechamento — tudo sem o segurado precisar baixar app ou ligar pra central.
Por que sinistro via WhatsApp tem 70% menos abandono
Três barreiras quebram o funil tradicional:
- Burocracia inicial: formulário web pede CPF, número da apólice, placa, modelo, ano, cor — antes de o cliente entender o que está sendo pedido. No WhatsApp, o bot puxa esses dados do CPF e só pergunta o que faltou.
- Upload de fotos: em web, cliente tira foto no celular, transfere pro PC, faz upload em conexão WiFi. No WhatsApp, ele aponta a câmera e manda. Tempo médio: 7 minutos vs 45 segundos.
- Acompanhamento: em web, cliente esquece a senha do portal e liga pra central. No WhatsApp, o status chega como notificação push — abertura sem custo de retenção.
Resultado direto no NPS: seguradoras que migraram abertura de sinistro pra WhatsApp viram NPS subir 22 pontos em 6 meses, segundo benchmarks de mercado de 2025.
Arquitetura do bot de sinistro
O fluxo é uma máquina de estados orientada a coleta progressiva. Cada estado representa um pedaço da informação necessária, e o bot avança apenas quando a peça anterior está validada.
Estados do sinistro
INICIO— cliente mandou "abrir sinistro", bot pede CPFVALIDANDO_APOLICE— bot consulta sistema legado, valida apólice ativaCOLETA_TIPO— bot pergunta tipo (auto, residencial, vida) via buttonsCOLETA_DADOS— perguntas específicas por tipo (data, hora, local)COLETA_LOCATION— bot pede localização do evento (type:location)COLETA_FOTOS— cliente envia 3-8 fotos (type:image), bot valida quantidadeCOLETA_RELATO— descrição livre do ocorridoGERANDO_PROTOCOLO— bot cria protocolo no sistema, retorna númeroAGENDANDO_VISTORIA— para sinistros que exigem períciaAGUARDANDO_ANALISE— bot envia atualizações conforme analista avançaFINALIZADO— pagamento ou negativa comunicada
Persistência da sessão
// Chave: sinistro:{telefone}
// TTL longo (72h) — sinistro pode ser pausado e retomado
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL);
async function getSinistro(phone) {
const raw = await redis.get(`sinistro:${phone}`);
return raw ? JSON.parse(raw) : { state: "INICIO", fotos: [], dados: {} };
}
async function saveSinistro(phone, sinistro) {
await redis.set(`sinistro:${phone}`, JSON.stringify(sinistro), "EX", 60 * 60 * 72);
}
Webhook recebendo mensagens do segurado
import express from "express";
import axios from "axios";
const ZAP = axios.create({
baseURL: "https://api.zap-api.tech/v1",
headers: { Authorization: `Bearer ${process.env.ZAP_TOKEN}` },
});
const app = express();
app.use(express.json());
app.post("/webhook/zap", async (req, res) => {
res.status(200).send("ok"); // ack imediato
const { type, instanceId, message } = req.body;
if (type !== "message.received") return;
const phone = message.from;
const sinistro = await getSinistro(phone);
switch (sinistro.state) {
case "INICIO":
await ZAP.post(`/instances/${instanceId}/messages`, {
to: phone,
type: "text",
text: { body: "Olá! Para abrir um sinistro preciso confirmar seu CPF. Pode digitar (apenas números)?" },
});
sinistro.state = "VALIDANDO_APOLICE";
break;
case "VALIDANDO_APOLICE":
const cpf = (message.body?.text || "").replace(/\D/g, "");
const apolice = await consultarApolice(cpf);
if (!apolice) {
await replyText(instanceId, phone, "Não encontrei apólice ativa para esse CPF. Quer falar com um atendente?");
return;
}
sinistro.dados.cpf = cpf;
sinistro.dados.apoliceId = apolice.id;
await ZAP.post(`/instances/${instanceId}/messages`, {
to: phone,
type: "buttons",
buttons: {
text: `Olá ${apolice.nome}! Que tipo de sinistro é?`,
buttons: [
{ id: "auto", text: "Automóvel" },
{ id: "casa", text: "Residencial" },
{ id: "vida", text: "Vida/Saúde" },
],
},
});
sinistro.state = "COLETA_TIPO";
break;
case "COLETA_FOTOS":
if (message.body?.type === "image") {
sinistro.fotos.push({ messageId: message.id, mediaUrl: message.body.url });
if (sinistro.fotos.length >= 3) {
await replyText(instanceId, phone, `Recebi ${sinistro.fotos.length} fotos. Pode me contar com suas palavras o que aconteceu?`);
sinistro.state = "COLETA_RELATO";
} else {
await replyText(instanceId, phone, `Recebi a foto ${sinistro.fotos.length}. Mande pelo menos 3 imagens diferentes (ex: visão geral, detalhe do dano, placa).`);
}
} else {
await replyText(instanceId, phone, "Por favor, envie a foto direto pela câmera ou galeria.");
}
break;
}
await saveSinistro(phone, sinistro);
});
async function replyText(instanceId, phone, body) {
await ZAP.post(`/instances/${instanceId}/messages`, {
to: phone, type: "text", text: { body },
});
}
Coleta de localização do acidente
Para sinistro automotivo, a localização exata economiza horas de perícia depois. O WhatsApp tem mensagem nativa de localização — basta pedir.
// Em estado COLETA_LOCATION
await ZAP.post(`/instances/${instanceId}/messages`, {
to: phone,
type: "text",
text: {
body: "Agora preciso da localização do acidente. No WhatsApp clique no clipe (📎), depois Localização e escolha 'Localização atual' ou aponte no mapa onde foi.",
},
});
sinistro.state = "AGUARDANDO_LOCATION";
// No webhook, quando recebe message.body.type === "location":
case "AGUARDANDO_LOCATION":
if (message.body?.type === "location") {
sinistro.dados.local = {
lat: message.body.latitude,
lng: message.body.longitude,
address: message.body.address,
};
await replyText(instanceId, phone, `Localização registrada. Agora preciso de fotos do veículo e do local.`);
sinistro.state = "COLETA_FOTOS";
}
break;
Geração de protocolo e notificação ao analista
Após coletar tudo, o bot gera o protocolo no sistema legado e devolve o número ao segurado. Mesmo que o sistema legado não tenha API, a maioria das seguradoras tem um endpoint interno ou fila SAP que aceita JSON.
async function gerarProtocolo(sinistro) {
// Chama sistema legado interno
const { data } = await axios.post(
`${process.env.LEGADO_URL}/sinistros`,
{
apoliceId: sinistro.dados.apoliceId,
tipo: sinistro.dados.tipo,
dataOcorrencia: sinistro.dados.dataHora,
local: sinistro.dados.local,
relato: sinistro.dados.relato,
fotos: sinistro.fotos.map((f) => f.mediaUrl),
},
{ headers: { Authorization: `Bearer ${process.env.LEGADO_TOKEN}` } }
);
return data.protocolo; // ex: "SIN-2026-887713"
}
// Após COLETA_RELATO completa
const protocolo = await gerarProtocolo(sinistro);
sinistro.dados.protocolo = protocolo;
await ZAP.post(`/instances/${instanceId}/messages`, {
to: phone,
type: "text",
text: {
body:
`Sinistro aberto com sucesso!\n\n` +
`Protocolo: *${protocolo}*\n\n` +
`Próximo passo: agendar vistoria. Vou te enviar 3 horários disponíveis nas próximas horas.\n\n` +
`Acompanhe seu sinistro digitando *status* a qualquer momento.`,
},
});
sinistro.state = "AGENDANDO_VISTORIA";
Notificações de status proativas
Não espere o segurado perguntar. A cada mudança de status no sistema interno, dispare mensagem WhatsApp. Webhook reverso interno → ZAP API:
// Endpoint interno disparado pelo sistema de análise
app.post("/internal/sinistro-status-changed", async (req, res) => {
const { protocolo, status, telefone, observacao, instanceId } = req.body;
const mensagens = {
em_analise: `Seu sinistro ${protocolo} entrou em análise. Prazo estimado: 5 dias úteis.`,
perita_agendada: `Vistoriador irá em ${observacao}. Mantenha o veículo no local combinado.`,
aprovado: `Sinistro ${protocolo} APROVADO. Indenização será depositada em até 3 dias úteis.`,
pendente_documento: `Falta documento: ${observacao}. Por favor mande aqui.`,
negado: `Sinistro ${protocolo} negado. Motivo: ${observacao}. Para recurso, responda *recurso*.`,
};
await ZAP.post(`/instances/${instanceId}/messages`, {
to: telefone,
type: "text",
text: { body: mensagens[status] || `Atualização: ${status}` },
});
res.json({ ok: true });
});
LGPD: consentimento explícito
Sinistro envolve dados sensíveis (saúde no caso de seguro de vida, localização precisa, fotos com terceiros). LGPD exige base legal específica. Na primeira interação:
case "INICIO":
// Antes de pedir CPF, registra consentimento
await ZAP.post(`/instances/${instanceId}/messages`, {
to: phone,
type: "buttons",
buttons: {
text:
"Para abrir seu sinistro precisamos coletar dados pessoais (CPF, fotos, localização) por base legal de execução de contrato (LGPD Art. 7º V). Confirma que deseja prosseguir?",
buttons: [
{ id: "aceito", text: "Sim, prosseguir" },
{ id: "recuso", text: "Não, cancelar" },
],
},
});
sinistro.state = "AGUARDANDO_CONSENTIMENTO";
break;
case "AGUARDANDO_CONSENTIMENTO":
if (message.body?.text === "aceito") {
sinistro.consentimento = { aceito: true, em: new Date().toISOString(), ip: message.metadata?.ip };
sinistro.state = "INICIO";
await replyText(instanceId, phone, "Obrigada. Pode digitar seu CPF (apenas números).");
}
break;
Esse sinistro.consentimento entra no audit log e satisfaz a base legal exigida pela ANS e ANPD.
Casos práticos
Auto: batida pequena em estacionamento
Cliente bateu retrovisor. Abre sinistro 14:00, manda 4 fotos e localização do shopping, recebe protocolo às 14:08. Vistoriador agenda para o dia seguinte 10h. Pagamento aprovado em 4 dias úteis. Tempo total de cliente investido: 12 minutos.
Residencial: furto durante viagem
Cliente volta da praia, encontra casa arrombada. Liga pra polícia, depois abre sinistro pelo WhatsApp. Manda BO em PDF (type:document), fotos do estrago e lista do que sumiu (texto livre). Bot pede 3 ângulos diferentes, encaminha pro analista. Em vez de visita presencial, perícia faz vídeochamada via WhatsApp para ver os cômodos.
Vida: internação
Esposa do segurado acessa o WhatsApp do cônjuge internado, abre sinistro de hospitalização. Manda fotos da internação, atestado, guia médica (PDF). Bot detecta tipo "saúde" e roteia para fila prioritária. Reembolso aprovado em 24h.
FAQ
Como detectar tentativa de fraude?
Cruze metadados: hora da mensagem vs timestamp da foto (EXIF), localização declarada vs GPS da foto, tempo entre fotos (3 fotos enviadas em 8 segundos seguidos = câmera; em 4 minutos = mais provável real). Sinistros suspeitos vão para fila de revisão humana antes de aprovação.
Funciona com sistema legado COBOL/AS400?
Sim. A integração não exige API REST nativa do legado — basta um middleware (Node, Python, Java) que: (1) recebe webhook do WhatsApp, (2) traduz pra formato do legado (DB direto, fila MQ, arquivo CSV), (3) lê resposta e devolve. Sua TI já tem esse padrão de "anti-corrosion layer".
Posso fazer perícia 100% online?
Para sinistros de baixa monta (até R$5k em auto, até R$10k em residencial), sim — vídeochamada WhatsApp com vistoriador segura o caso. Acima disso ainda recomendamos perícia presencial pra evitar contestação judicial. Sua circular interna define a régua.
Segurador direto vs corretor — quem manda mensagem?
Em modelo bilateral (segurador → cliente direto), seguradora opera a instância. Em modelo via corretor, corretor pode usar a instância dele com white-label da seguradora ou acessar painel multi-tenant da seguradora. Ambos os modelos estão suportados.
E se o cliente prefere ligar pra central?
WhatsApp não substitui — complementa. Bot mantém botão "falar com atendente" em todos os estados, que abre ticket na fila humana sem perder contexto. NPS de quem prefere telefone também sobe quando o canal alternativo é decente, porque a fila telefônica desafoga.
Pronto para abrir sinistro via WhatsApp na sua seguradora? A ZAP API atende seguradoras de pequeno e médio porte com modelo de instância dedicada e SLA de envio para casos críticos. Criar conta grátis e testar com sandbox antes de migrar a operação real.