Inyo

Revisão Manual

in_review significa que uma pessoa na Inyo decide o desfecho. Não é uma falha e não é uma resposta final, e pode chegar até você por qualquer um dos pontos de entrada — inclusive na resposta síncrona de POST /v1/verifications e em um redirect no qual seu cliente chega.


Por Que uma Verificação Fica in_review

auto_status informa o que o pipeline decidiu antes de qualquer roteamento ou decisão humana, então in_review nunca é ambíguo:

statusauto_statusO que aconteceu
in_reviewin_reviewUma verificação branda (soft check) falhou — por exemplo um dígito verificador de MRZ, um formato de número de documento incompatível ou uma divergência de dados
in_reviewapprovedUma aprovação no limite, roteada pelo seu limiar de revisão
in_reviewdeclinedUma rejeição retida para um humano, porque você habilitou rejeições retidas

Leia o auto_status antes de decidir como tratar uma sessão retida no seu próprio produto. Uma aprovação no limite e uma rejeição retida são sinais muito diferentes, mesmo que ambos cheguem como in_review.


Roteando uma Aprovação no Limite

Um limiar de revisão configurado captura auto-aprovações cuja confiança fica abaixo do seu critério e as roteia para revisão. Ele se aplica de forma idêntica a sessões do widget e a verificações server-to-server — uma configuração, uma decisão de roteamento, seja qual for o ponto de entrada pelo qual a verificação chegou.

A confiança é a pontuação mais fraca entre as verificações que carregam uma medida calibrada por captura, o que depende de como o resultado de liveness foi obtido:

Resultado de livenessVerificações que contam para a confiançaPisoFaixa operativa nos padrões
Modo selfie (padrão)face_matchSeu limiar de face-match(90, 100]
Sessão de liveness por streamingface_match, livenessO menor dos dois limiares(80, 100]

Ambas as verificações contabilizadas são verificações rígidas (hard checks) que já precisam superar seus próprios limiares para que uma verificação seja aprovada. Um limiar de revisão igual ou abaixo desse piso, portanto, nunca pode disparar — configurar um é rejeitado com uma mensagem informando o piso calculado. E como o piso se move com os seus próprios limiares, leia os valores atuais no detail de cada verificação em vez de assumir os padrões da plataforma.

liveness é deliberadamente excluído no modo selfie: ali sua pontuação é uma heurística de qualidade de imagem sobre confiança do rosto, nitidez e brilho, então rotear com base nela transformaria isso em um portão de qualidade de foto em vez de um portão de confiança. Ele continua sendo uma verificação rígida de qualquer forma — uma captura ruim ainda é recusada; ela apenas não conduz o roteamento para revisão.

Uma verificação sem selfie não carrega nenhuma pontuação biométrica. Isso conta como não medida, não como confiante, então com um limiar configurado ela é roteada para revisão em vez de ser auto-aprovada. Envie uma selfie, ou deixe o limiar sem definir, se você precisa que verificações apenas de documento sejam decididas de forma síncrona.


Retendo uma Rejeição para um Humano

O limiar de revisão captura aprovações no limite. Uma configuração separada — desativada por padrão — captura rejeições: uma verificação que as checagens rejeitaram é roteada para in_review em vez de declined, para que um analista a confirme antes de se tornar final. Uma recusa falsa perde um cliente real silenciosamente, e esse é o caso para o qual isso existe.

O que ela cobre é tudo aquilo que um humano poderia concluir. Uma rejeição é retida quando o documento era legível — expirado, divergência de rosto, liveness, jurisdição rejeitada, falha de autenticidade, recaptura de tela. Ela não é retida quando os campos centrais de identidade nunca saíram do documento, porque aprovar tal sessão entregaria uma identidade verificada sem nada dentro; esses casos continuam sendo auto-recusados, e um analista tampouco pode aprová-los.

Isso se comporta da mesma forma nos dois pontos de entrada. O widget oferece uma nova captura em problemas de captura recuperáveis e o server-to-server não, mas essa diferença é sobre orientar um cliente ao vivo — ela não muda o que a sua configuração significa.

A carga não tem teto. Cada rejeição retida vira uma tarefa de analista e nada limita essa fila, então com essa configuração ativa, o volume de revisão escala com a quantidade de fraude que você atrai.


Como a Decisão Chega Até Você

Quando um analista decide, o resultado armazenado é atualizado no lugar e reentregue.

CanalComportamento
WebhookCom um webhook_url configurado, o resultado decidido é enviado via POST para ele — assinado exatamente como qualquer outra entrega. Isso cobre também sessões em modo redirect e verificações server-to-server, via notificações de resultado
PollingGET /v1/sessions/{session_id} retorna o status e o result atuais. Este é o único canal se você não tem webhook_url, ou se você desabilitou as notificações

O resultado entregue carrega um objeto manual_review:

{
  "session_id": "9f1c8e42-7c3e-4f2b-9d7a-2b1e5c8f4a10",
  "status": "approved",
  "auto_status": "declined",
  "manual_review": {
    "action": "review",
    "reviewer": "analyst-7",
    "reason": "Expiry misread by OCR; document valid through 2029 on the physical card",
    "auto_status": "declined"
  },
  "notified_at": "2026-07-31T14:41:09.882Z"
}
CampoDescrição
actionreview para uma decisão sobre uma sessão na fila, override para uma reversão de controle de qualidade de uma sessão já concluída
reviewerQuem decidiu
reasonO porquê, nas palavras do revisor
auto_statusO veredito original do pipeline, preservado para auditoria

status e auto_status no nível superior contam a mesma história: após uma decisão, status é o desfecho humano e auto_status ainda mostra o que a automação concluiu.


Desfechos Concluídos Podem Mudar

Uma verificação que já chegou a approved ou declined pode ser revertida depois por um override de controle de qualidade. Ela chega pelo mesmo canal, com manual_review.action definido como override.

É por isso que a ordenação importa: aplique o maior notified_at e ignore qualquer coisa mais antiga (veja Recebendo Resultados). Uma sessão pode ter duas entregas em trânsito ao mesmo tempo — uma ainda em retentativa enquanto uma decisão mais nova é despachada.


O Que Construir

RequisitoPor quê
Um estado pendente no seu próprio modelo, distinto de aprovado e rejeitadoin_review não é nenhum dos dois, e seu cliente pode estar esperando em uma landing page que o recebeu
Um handler de resultado idempotente chaveado por session_id, resolvendo por notified_atO resultado da mesma sessão legitimamente chega mais de uma vez
A capacidade de reverter uma decisão sobre a qual você já agiuUm override de controle de qualidade pode inverter um desfecho concluído
Um job de reconciliação para sessões não terminaisA entrega é de melhor esforço; o polling é autoritativo

Se nem o limiar de revisão nem as rejeições retidas estiverem configurados para o seu tenant, in_review ainda ocorre — uma verificação branda que falhou o produz — então trate o estado de qualquer forma.


Próximos Passos