Skip to content
Vai integrar a API REST da Zarv com ajuda de IA? Copie a instrução que aponta o modelo para esta documentação.
Ver a instrução
Você vai integrar a API REST da Zarv. Use a documentação oficial como fonte da verdade.

- Página desta integração: https://developers.zarv.com/api/lens/analise
- Autenticação Bearer JWT e hosts: https://developers.zarv.com/setup
- Índice das APIs: https://developers.zarv.com/api
- Índice da documentação em markdown: https://developers.zarv.com/llms.txt
- Documentação completa em um arquivo: https://developers.zarv.com/llms-full.txt

Os specs OpenAPI publicados são a fonte da verdade para rotas e schemas — use o spec da API que você escolher antes de escrever qualquer request.

Antes de escrever qualquer código, leia a página desta integração. Siga exatamente os nomes de campos, endpoints, callbacks e formatos que estiverem documentados — não invente parâmetros nem endpoints, e não deduza comportamento a partir de outras APIs que você conhece. Se algo de que você precisa não estiver na documentação, diga que não está em vez de supor.

Minha tarefa: [ex.: escolher a API certa e fazer a primeira chamada autenticada]

Análise ​

A Análise cruza o que a Coleta trouxe. Ela roda nove dimensões sobre o caso — cada uma responde uma pergunta e devolve um veredito, com os alertas que o sustentam e a evidência de cada alerta.

A regra que manda no desenho: o modelo decide e explica; a prova é do código. Os alertas saem de regras em código, nunca do modelo — é o que impede um achado inventado. Do modelo vem o juízo e o resumo.

Pedir a análise ​

sh
curl -X POST "https://services.zarv.com/api/v1/lens/$WORKSPACE_ID/research/$RESEARCH_ID/analyze" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
json
{ "researchId": "7d2f8e10-4c3b-4a5d-9e8f-1a2b3c4d5e6f", "status": "QUEUED" }

O pedido não tem corpo. Ele responde 202 na hora, e um worker enriquece os envolvidos e roda as dimensões depois — isso leva minutos, e nada disso cabe no tempo de uma requisição HTTP.

O caso vai para a raia Analisando no pedido, e para Analisado ou Análise falhou no fim.

Uma análise por vez, e nunca junto com o envio

Pedir outra análise com uma em andamento é 409. Pedir com o envio dos documentos rodando também é 409: a análise lê o caso que o envio ainda está gravando. Espere documents.status ser DONE.

Pedir a análise de um caso já analisado é permitido: a nova substitui a anterior, e cada dimensão sobrescreve o campo dela.

Uma API que subiu sem o agente de IA responde 503 — não há quem analise.

Acompanhar e ler o resultado ​

Tudo sai no GET do caso, em analysis:

json
{
  "analysis": {
    "status": "DONE",
    "errorCode": "",
    "startedAt": "2026-11-04T12:40:00Z",
    "finishedAt": "2026-11-04T12:46:12Z",
    "result": {
      "dimdocumental": { "status": "apurado", "verdict": "atencao", "alerts": [ … ], "summary": "…" },
      "dimchronology": { "status": "apurado", "verdict": "compativel", "alerts": [], "summary": "…" },
      "dimpossession": { "status": "nao_apurado", "reason": "o caso é uma colisão: não há perda de posse a apurar", "alerts": [] }
    }
  }
}
statusSignificado
""O caso nunca foi analisado; result é null
QUEUEDNa fila
PROCESSINGRodando
DONETerminou
FAILEDParou — o errorCode diz por quê

Cada dimensão grava o resultado dela assim que termina. Uma análise em PROCESSING já tem um result legível, com as dimensões que já rodaram — e uma análise que falhou numa dimensão mantém o resultado de todas as outras.

errorCodeSignificado
DIMENSIONS_FAILEDAlguma dimensão falhou; o resultado das outras está gravado
ANALYSIS_FAILEDA análise parou por outro motivo: caso sem documento, envolvido inválido, banco
ATTEMPTS_EXHAUSTEDA análise derrubou o worker três vezes e não volta à fila

O formato de uma dimensão ​

Toda dimensão devolve a mesma forma:

json
{
  "status": "apurado",
  "verdict": "atencao",
  "reason": "",
  "alerts": [
    {
      "code": "DOC_OWNER_MISMATCH",
      "level": "atencao",
      "entities": ["PERSON:11144477735"],
      "documents": ["b41c9f27-8d3e-4a16-9c5b-2e7f80a1d3c4"],
      "evidence": ["CRLV: MARIA DA SILVA", "Apólice: JOÃO DA SILVA"],
      "message": "O titular do CRLV não é o segurado da apólice."
    }
  ],
  "summary": "Os documentos fecham entre si, com uma divergência de titularidade a esclarecer."
}

status: apurou ou não? ​

statusSignificado
apuradoA dimensão tinha o que cruzar e cruzou
nao_apuradoFaltou dado, fonte ou parte — e o reason diz o quê

Não apurar é uma resposta, não um erro. A dimensão de Posse cala numa colisão: não houve perda de posse a apurar, e dizer isso é mais honesto do que inventar um veredito. Uma dimensão que não apurou não diz que está tudo bem — ela diz que não olhou.

verdict: o pior nível entre os alertas ​

verdictSignificado
criticoO apurado contraria o relato
atencaoHá ponto a esclarecer, mas nada contraria o relato
compativelO apurado sustenta o relato

Um alerta critico basta para a dimensão inteira ser critico. Sem nenhum crítico, um atencao basta para ser atencao. Só compativel — ou nenhum alerta — é compativel.

alerts: o achado, com a prova ​

Os alertas vêm do mais grave para o informativo. Cada um traz:

  • code — o achado, num vocabulário fechado por dimensão (DOC_OWNER_MISMATCH, COVERAGE_PLATE_MISMATCH, …). É por ele que você decide, não pela frase.
  • entities e documents — a quem e a quais documentos o alerta aponta. É o que permite destacar na tela exatamente a peça em questão.
  • evidence — o que sustenta o achado, em texto curto: a data, a placa, o nome.
  • message — a frase que o analista lê.

summary ​

A leitura do caso em uma frase — a única parte escrita pelo modelo.

As nove dimensões ​

CampoDimensãoA pergunta que ela responde
dimdocumentalDocumentalAs peças do caso falam da mesma gente e do mesmo veículo?
dimchronologyCronologiaAs datas fecham entre si, e algo aconteceu antes do próprio fato?
dimcoverageCoberturaO evento caiu na vigência da apólice, e o veículo do sinistro é o veículo segurado?
dimpossessionPosseHouve perda de posse material, e a base, o boletim e as fotos sustentam isso?
dimimageryImagemAs fotos se sustentam como conjunto — mesma peça, mesma placa, mesma cadeia de custódia?
dimterritoryTerritórioO evento aconteceu na praça de alguma das partes?
dimeconomicEconômicaO valor segurado bate com o valor do veículo, há gravame, o veículo cabe na vida de quem o tem?
dimnetworkRede de vínculosA que distância as partes estão umas das outras, e os veículos se ligam por alguém?
dimphysicalFísicaO dano que aparece nas fotos é o dano que esse evento faria nesse veículo?

Cada uma persegue uma tese de fraude diferente:

  • Documental — o mesmo CPF com nomes diferentes, a mesma placa com chassis diferentes, quem aciona o seguro sem ser o dono do carro.
  • Cronologia — a data do fato diverge entre as fontes, há ordem impossível (um documento que descreve o fato datado antes dele, a apólice que só passa a valer depois), ou o aviso veio muito depois do fato.
  • Cobertura — o sinistro está fora da apólice: fora da vigência, ou a apólice de um carro "emprestada" para o sinistro de outro.
  • Posse — o veículo não foi subtraído: a perda é declarada mas nenhum documento a descreve, ou o fato foi tentativa (e na tentativa não houve perda).
  • Imagem — as fotos não são do veículo do caso: outro carro do mesmo modelo, fotos de anúncio, fotos de um sinistro anterior.
  • Território — o lugar que não se explica: o evento longe de todos, sem motivo para ninguém estar ali; ou exatamente na praça de uma das partes, com a outra tendo viajado até lá.
  • Econômica — o dono endividado que fabrica ou infla o sinistro para quitar a dívida, ou o veículo que vale muito menos do que a apólice paga.
  • Rede de vínculos — os dois lados se conhecem: sinistro combinado, com os veículos ligados por endereço, telefone, sociedade ou parentesco.
  • Física — o dano não bate com a dinâmica declarada: sinistro forjado, dano anterior aproveitado, dano exagerado.

Imagem e Física olham a mesma foto e perguntam coisas diferentes. A Imagem pergunta "é este carro?"; a Física, "é este dano?".

Trate nao_apurado como informação

Uma dimensão responde nao_apurado quando falta o que cruzar — não há boletim de ocorrência, o caso não tem foto, a fonte que mediria aquilo não está disponível. O reason diz o quê, e o cartão do analista deve mostrar isso como está: não olhamos, e não está tudo bem.

O que o Lens enriquece antes de rodar ​

Antes das dimensões, o worker busca dados externos sobre quem tem função no caso — e só sobre eles. Quem não tem nenhuma dessas funções (o dono do veículo do segurado, o passageiro, a testemunha) não é enriquecido:

LadoFunçãoO que o Lens busca
Seguradoo segurado (CPF ou CNPJ)Zarv ID completo
o condutorZarv ID completo + CNH
o veículo (PRINCIPAL)Asset completo
Terceiroo condutorZarv ID completo + CNH
o proprietário (CPF ou CNPJ)Zarv ID completo
o veículo (TERCEIRO_ENVOLVIDO)Valor de mercado + histórico de donos

O condutor pode ser o proprietário: é a mesma pessoa com duas funções, e cada consulta é feita uma vez só.

É por isso que a análise leva minutos — ela consulta antes de cruzar —, e é por isso que os papéis dos envolvidos importam tanto: é o papel que diz ao Lens quem é o segurado, quem é o terceiro e qual veículo é qual. Um caso com papéis errados enriquece a pessoa errada.

Esperar a análise ​

Não há long polling nem webhook: consulte o caso a cada poucos segundos até o status ser terminal.

js
async function waitForAnalysis(workspaceId, researchId, accessToken) {
  const url = `https://services.zarv.com/api/v1/lens/${workspaceId}/research/${researchId}`;
  for (;;) {
    const res = await fetch(url, {
      headers: { Authorization: `Bearer ${accessToken}` },
    });
    const research = await res.json();
    const { status } = research.analysis;
    if (status === "DONE" || status === "FAILED") return research.analysis;
    await new Promise((r) => setTimeout(r, 5000));
  }
}

Com o resultado na mão, a decisão é do analista — e o que ele faz com ela é a Investigação.