Checagens e Decisões
Toda verificação — via widget ou servidor-a-servidor — resolve para o mesmo resultado normalizado. Esta página é a referência para interpretá-lo.
O Payload de Resultado
{
"sessionId": "9f1c8e42-7c3e-4f2b-9d7a-2b1e5c8f4a10",
"userRef": "user-123",
"status": "approved",
"autoStatus": "approved",
"document": {
"type": "passport",
"number": "A12345678",
"personalNumber": null,
"issuingState": "USA",
"issuingCountry": "USA",
"issuingCountryName": "United States",
"expirationDate": "2033-09-30",
"dateOfIssue": null
},
"person": {
"firstName": "ALEX",
"lastName": "MORGAN",
"fullName": "ALEX MORGAN",
"dateOfBirth": "1988-03-04",
"gender": "F",
"nationality": "USA",
"address": null,
"city": null,
"region": null,
"postalCode": null
},
"checks": [
{ "name": "document_scene_clear", "status": "passed", "group": "document", "detail": "no screen-recapture signals" },
{ "name": "document_readable", "status": "passed", "group": "document", "detail": "all core fields extracted" },
{ "name": "document_number_valid", "status": "passed", "group": "document", "detail": "passport:USA — document number matches the USA passport format" },
{ "name": "document_mrz_valid", "status": "passed", "group": "document", "detail": "all check digits valid" },
{ "name": "document_not_expired", "status": "passed", "group": "document", "detail": "expirationDate 2033-09-30" },
{ "name": "document_authentic", "status": "passed", "group": "document", "detail": "genuine — laminate sheen, crisp typography, natural depth" },
{ "name": "face_detected", "status": "passed", "group": "selfie", "detail": "eyes_open=True sunglasses=False frontal=True" },
{ "name": "liveness", "status": "passed", "group": "selfie", "detail": "heuristic (selfie mode): face confidence + quality vs threshold 80.0" },
{ "name": "face_match", "status": "passed", "group": "selfie", "detail": "CompareFaces similarity vs threshold 90.0" }
],
"prefillMismatches": [],
"prefillComparison": [],
"provider": "inyo"
}
Campos de Nível Superior
| Campo | Descrição |
|---|---|
sessionId | O identificador da verificação. Use-o com GET /v1/sessions/{sessionId} |
userRef | Seu identificador, retornado exatamente como você o forneceu |
status | Onde a verificação terminou — veja Status |
autoStatus | O que o pipeline decidiu antes de qualquer roteamento de revisão ou decisão humana — veja Revisão Manual |
document | Dados extraídos do documento |
person | Dados de identidade extraídos |
checks | As checagens individuais que produziram a decisão — veja Lendo checks[] |
prefillMismatches | Nomes dos campos de prefill que divergiram do documento. Vazio a menos que você tenha enviado prefill |
prefillComparison | Detalhe da comparação por campo — veja Comparação de prefill |
selfieDescription | Descrição estruturada da aparência. Presente apenas quando habilitada para o seu tenant — caso contrário a chave está ausente, não null |
screening | Coincidências de listagens de sanções por trás de uma triagem que falhou. Presente apenas quando há algo a adjudicar — a chave está ausente quando a triagem sai limpa, e ausente por completo se a triagem não estiver habilitada para o seu tenant. Veja Triagem de Sanções |
provider | inyo para uma verificação real, inyo-mock para uma simulada — veja Sandbox |
manualReview | Presente somente após uma decisão humana. Veja Revisão Manual |
notifiedAt | Presente somente em notificações entregues, não no resultado armazenado. Use-o para ordenar entregas concorrentes — veja Recebendo Resultados |
document
| Campo | Descrição |
|---|---|
type | passport, drivers_license ou identity_card — o mesmo vocabulário que você envia em prefill.documentType |
number | Número do documento tal como lido no documento |
personalNumber | Identificador nacional secundário quando o documento o possui |
issuingState | Autoridade emissora conforme impressa — um estado dos EUA em carteiras de motorista, um código de país em passaportes |
issuingCountry | País resolvido em ISO 3166-1 alpha-3 |
issuingCountryName | Nome de exibição de issuingCountry (por exemplo, United States). Recorre ao próprio código quando não é um país reconhecido, e é null somente quando issuingCountry é null |
expirationDate, dateOfIssue | YYYY-MM-DD, ou null quando o documento não os traz |
person
firstName, lastName, fullName, dateOfBirth, gender, nationality, address, city, region, postalCode.
Qualquer campo que o documento não traga — ou que não pôde ser lido — é null. Campos de endereço são comumente null em passaportes e preenchidos a partir de carteiras de motorista. Os nomes chegam como impressos no documento, o que em passaportes significa letras maiúsculas.
Status
status | Significado | O que fazer |
|---|---|---|
pending | Criada, ainda não concluída | Aguarde. Nenhuma decisão existe ainda |
approved | Todas as checagens passaram | Prossiga com o onboarding |
declined | Pelo menos uma checagem hard falhou | Não prossiga. O detail da checagem que falhou explica o motivo |
in_review | Um humano decide — não é final | Trate como pendente. Veja Revisão Manual |
expired | O cliente nunca a concluiu dentro da validade do link | Crie uma nova sessão se ainda precisar da verificação |
Lendo checks[]
Toda checagem tem exatamente quatro campos: name, status, group, detail.
| Regra | Detalhe |
|---|---|
status é autoritativo | "passed", "failed" ou "indeterminate" — é o resultado da checagem. Não o rederive — detail explica o resultado, mas não o define. Uma checagem hard que falhou recusa a verificação; uma checagem soft que falhou — e qualquer indeterminate — a encaminha para in_review |
group diz onde a checagem se situa | document, selfie, screening ou policy. O grupo de um nome nunca muda, então filtre por group em vez de manter suas próprias listas de nomes |
detail cita o limiar | Quando uma checagem tem um limiar, detail o menciona. Os limiares de liveness e face_match são por tenant, então leia-os aqui em vez de assumir os padrões da plataforma |
| O conjunto varia | As checagens aparecem somente quando aplicáveis: document_mrz_valid requer uma zona de leitura mecânica, checagens faciais requerem uma selfie, e várias são habilitadas por tenant. Itere sobre o array; não o indexe posicionalmente nem assuma um comprimento fixo |
Hoje sanctions_clear é a única checagem que publica indeterminate — uma coincidência de nome de sanções não confirmada, veja Triagem de Sanções — mas trate o status de forma genérica em vez de tratar o nome como caso especial: qualquer checagem indeterminate significa que um humano decide.
document_authentic mescla todos os lados analisados em uma única linha. É uma checagem hard — uma linha failed recusa a verificação de imediato. Em uma carteira, a frente e um verso enviado são ambos analisados e mesclados nesta única linha: qualquer lado que falhe a reprova, e o detail traz o veredito de cada lado como classificação — o que o examinador observou, prefixado pelo lado quando mais de um lado foi analisado ("front: genuine — …; back: photocopy — …") e sem prefixo quando apenas um foi. A análise falha aberta por lado — um lado que não pôde ser julgado simplesmente sai do cálculo, e se nenhum lado produziu veredito a linha está ausente.
age_match só é publicada quando a descrição de aparência está habilitada para o seu tenant e o documento revelou uma data de nascimento. Ela passa quando a idade derivada do documento no momento da captura cai dentro da faixa de idade estimada pela descrição da selfie, alargada por uma tolerância que a Inyo configura para o seu tenant (5 anos por padrão, indicada no detail como ±5), e falha caso contrário. A tolerância absorve a imprecisão de uma estimativa de idade; com 0, a comparação é exatamente contra a faixa estimada. Como uma estimativa de idade é um indício, não uma prova, uma falha nunca recusa — é uma checagem soft que encaminha para in_review. Está ausente sempre que a descrição de aparência está desligada, o documento não trouxe data de nascimento, ou a própria descrição falhou aberta (uma indisponibilidade nunca bloqueia a verificação) — nada disso é, por si só, um indício.
As Checagens
Checagens hard reprovam a verificação — a falha de qualquer uma delas resulta em declined.
| Checagem | Grupo | Falha quando | Presente |
|---|---|---|---|
document_scene_clear | document | Um telefone, monitor ou tela está visível no quadro — o documento está sendo fotografado a partir de um display | Sempre |
document_authentic | document | A análise forense do documento julga qualquer lado analisado — a frente, mais um verso de carteira enviado — uma recaptura, impressão, fotocópia ou falsificação | Quando habilitada para o seu tenant (ativa por padrão), e pelo menos um lado pôde ser analisado |
document_readable | document | Os campos centrais de identidade (número, nome, data de nascimento) não puderam ser todos extraídos | Sempre |
document_not_expired | document | A data de expiração está no passado | Quando o documento traz uma data de expiração |
jurisdiction_accepted | policy | O país emissor do documento está fora das jurisdições que você aceita para aquele tipo de documento | Quando você configurou jurisdições aceitas |
sanctions_clear | screening | O nome do documento coincide com uma listagem OFAC SDN e a data de nascimento de uma listagem coincidente concorda. Uma coincidência de nome que não pôde ser confirmada publica esta mesma checagem como indeterminate, encaminhando para in_review — veja Triagem de Sanções | Quando a triagem de sanções está habilitada para o seu tenant (padrão desligado) |
face_detected | selfie | Não há exatamente um rosto utilizável — olhos fechados, óculos de sol ou cabeça muito virada | Quando uma selfie foi capturada |
liveness | selfie | A confiança de prova de vida está abaixo do seu limiar | Quando uma selfie foi capturada |
face_match | selfie | A similaridade entre o retrato do documento e a selfie está abaixo do seu limiar | Quando uma selfie foi capturada |
Checagens soft encaminham a verificação para in_review em vez de recusá-la.
| Checagem | Grupo | Falha quando | Presente |
|---|---|---|---|
document_mrz_valid | document | Um dígito verificador do MRZ não valida — um erro de OCR ou adulteração | Quando o documento tem zona de leitura mecânica |
document_number_valid | document | O número não corresponde ao formato conhecido de sua jurisdição. Consultiva — as tabelas de formato são publicadas-mas-imperfeitas, então isso nunca recusa automaticamente | Quando existe uma regra para aquela jurisdição |
dmv_record_match | screening | Os dados extraídos de uma carteira de motorista dos EUA divergem do registro do DMV emissor | Quando a verificação no DMV está habilitada para o seu tenant (desativada por padrão) |
document_data_match | document | Os dados que você enviou divergem do documento | Quando você define dataCheck: true |
age_match | selfie | A idade derivada do documento no momento da captura fica fora da faixa de idade estimada pela descrição da selfie, alargada pela tolerância do seu tenant (5 anos por padrão) | Quando a descrição de aparência está habilitada para o seu tenant (desativada por padrão) e o documento revelou uma data de nascimento |
Uma checagem adicional aparece apenas no fluxo do widget: capture_attempts (grupo policy) falha quando o cliente esgotou o limite de tentativas, o que recusa a sessão — veja Entrega via Widget.
Comparação de Prefill
Quando você envia prefill, o resultado relata como cada campo comparável se alinhou. prefillMismatches é a lista curta de nomes de campos que divergiram; prefillComparison traz o detalhe:
"prefillComparison": [
{ "field": "lastName", "sent": "Silva", "received": "SILVA SANTOS", "match": true, "method": "subset", "score": 0.95, "threshold": 0.85 },
{ "field": "dateOfBirth", "sent": "1988-03-04", "received": "1988-03-04", "match": true, "method": "exact", "score": null, "threshold": null },
{ "field": "issuingState", "sent": "Florida", "received": "FL", "match": true, "method": "normalized", "score": null, "threshold": null }
]
| Campo | Descrição |
|---|---|
field | Um de firstName, lastName, dateOfBirth, documentType, documentNumber, nationality, issuingState |
sent / received | Seu valor e o valor lido do documento |
match | Se são considerados iguais |
method | Para nomes: exact, subset (um sobrenome composto que contém o seu, pontuado com 0.95), fuzzy (pontuação por similaridade) ou empty. Para estados e tipos de documento: normalized. Caso contrário, exact |
score / threshold | Similaridade do nome e o limiar de aceitação, null para campos que não são nomes |
Campos ausentes em qualquer um dos lados não são comparados, então nunca aparecem. Nomes usam correspondência fuzzy — acentos removidos, sobrenomes compostos aceitos como correspondências de subconjunto, erros próximos de OCR tolerados até o limiar — de modo que variações comuns de grafia não criam falsas divergências. Estados e tipos de documento são normalizados primeiro, e é por isso que Florida corresponde a FL.
Uma divergência só afeta a decisão quando você define dataCheck: true, o que adiciona a checagem soft document_data_match. Sem isso, a comparação é apenas informativa.
Descrição da Selfie
null a menos que a descrição de aparência esteja habilitada para o seu tenant. Quando presente, traz atributos observáveis da selfie para comparação em reverificações futuras:
"selfieDescription": {
"estimatedAgeLow": 30,
"estimatedAgeHigh": 40,
"skinTone": "light",
"eyeColor": "brown",
"hairColor": "dark brown",
"hairStyle": "shoulder length, straight",
"facialHair": "none",
"eyewear": "none",
"headwear": "none",
"distinguishingFeatures": ["small scar above left eyebrow"],
"notes": null
}
Qualquer atributo que não possa ser observado é null.
Descrições de aparência são dados pessoais sensíveis. Elas carregam exposição a GDPR e a leis de privacidade biométrica (por exemplo, BIPA), e a selfie é processada por um serviço de visão externo. Confirme que você tem base legal, um acordo de processamento de dados em vigor e uma justificativa de retenção documentada antes de nos pedir para ativar isso.
Triagem de Sanções
Desligada por padrão, e habilitada por tenant pela Inyo quando solicitado. Quando ativa, o nome extraído do documento é triado contra a lista OFAC de Nacionais Especialmente Designados (SDN).
Um nome que coincide não é uma pessoa
Dois tokens de nome comuns aparecem em muitos nomes listados, então uma coincidência de nome por si só nunca recusa. A confirmação é pela data de nascimento, e o resultado é o status da única checagem sanctions_clear:
| Resultado | sanctions_clear | status |
|---|---|---|
| Nenhuma listagem no seu limiar ou acima | "passed" | inalterado |
| Uma listagem coincide e a data de nascimento concorda | "failed" — hard, recusa | declined |
| Uma listagem coincide, mas nenhuma data de nascimento concorda | "indeterminate" | in_review |
Nada ambíguo é resolvido em direção à aprovação: uma coincidência não confirmável vai para um humano, não adiante. Baseie decisões em status. O limiar de aceitação é configurado por tenant — pergunte ao seu contato na Inyo qual é o seu.
O bloco screening
Presente apenas quando houve uma coincidência entregue — ou seja, junto de um sanctions_clear que está failed (coincidência confirmada) ou indeterminate (não confirmada). Está ausente quando a triagem sai limpa, portanto sua presença significa "há algo a adjudicar", não "a triagem foi executada".
"screening": {
"matches": [
{
"name": "SAMPLE, Ali Hassan",
"sourceList": "us_ofac",
"programs": ["SDGT"],
"entityId": "12345",
"score": 91.5,
"dobAgrees": true
}
]
}
| Campo | Significado |
|---|---|
name | O nome da entidade listada, conforme publicado |
sourceList | Sempre us_ofac hoje |
programs | Programas de sanções da OFAC aos quais a listagem pertence |
entityId | Identificador da listagem, para consulta na fonte |
score | Similaridade de nome, 0-100 |
dobAgrees | true, false, ou null quando indecidível — a data de nascimento do documento não pôde ser lida, ou a listagem não publica nenhuma |
No máximo cinco coincidências são entregues — o suficiente para distinguir uma coincidência única plausível de um agrupamento óbvio de colisões. Apenas candidatos no seu limiar ou acima aparecem.
Uma peculiaridade que vale saber na adjudicação: a OFAC publica datas imprecisas colapsadas em 1º de janeiro, então um candidato listado nesse dia é comparado apenas pelo ano. Para quem nasceu genuinamente em 1º de janeiro isso afrouxa a correspondência, na direção da recusa.
Seu cliente nunca é informado de que uma coincidência de sanções foi o que o rejeitou. A resposta de recusa é idêntica byte a byte a qualquer outra falha sem nova tentativa.
Se a triagem estiver indisponível
A triagem falha aberta: uma indisponibilidade do provedor pula a checagem em vez de bloquear ou recusar a verificação. Nada no resultado entregue distingue uma sessão que seguiu sem triagem de uma que foi triada e saiu limpa — nesse caso simplesmente não existe nenhuma linha sanctions_clear. Se você precisa de evidência positiva de que toda verificação foi triada, verifique a presença dessa checagem, não a ausência de coincidência.
Próximos Passos
- Revisão Manual —
in_review,autoStatusemanualReview - Recebendo Resultados — como esse payload chega até você
