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": "completed",
"decision": "approved",
"document": {
"type": "passport",
"number": "A12345678",
"personalNumber": null,
"issuingState": null,
"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", "severity": "low", "detail": "no screen-recapture signals" },
{ "name": "document_readable", "status": "passed", "group": "document", "severity": "critical", "detail": "all core fields extracted" },
{ "name": "document_authentic", "status": "passed", "group": "document", "severity": "high", "detail": "genuine — laminate sheen, crisp typography, natural depth" },
{ "name": "document_not_expired", "status": "passed", "group": "document", "severity": "critical", "detail": "expirationDate 2033-09-30" },
{ "name": "document_number_valid", "status": "passed", "group": "document", "severity": "medium", "detail": "passport:USA — document number matches the USA passport format" },
{ "name": "document_mrz_valid", "status": "passed", "group": "document", "severity": "low", "detail": "all check digits valid" },
{ "name": "face_detected", "status": "passed", "group": "selfie", "severity": "medium", "detail": "One face, fully visible and facing the camera." },
{ "name": "liveness", "status": "passed", "group": "selfie", "severity": "high", "detail": "heuristic (selfie mode): face confidence + quality vs threshold 80.0" },
{ "name": "face_match", "status": "passed", "group": "selfie", "severity": "high", "detail": "portrait-to-selfie similarity vs threshold 90.0" }
],
"prefillMismatches": [],
"prefillComparison": [],
"provider": "inyo",
"trustIndex": 100
}
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 sessão está no seu ciclo de vida — veja Status e decisão |
decision | O que a Inyo concluiu. Presente somente sob decisionamento gerenciado, e apenas para uma sessão que chegou a uma avaliação — caso contrário a chave fica ausente, não null. Veja Status e decisão |
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 |
trustIndex | A pontuação da verificação, de 0 a 100 |
provider | inyo para uma verificação real, inyo-simulated para uma ditada por um número de documento reservado — veja Sandbox |
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 | A subdivisão conforme impressa — um estado dos EUA em carteiras de motorista. null em passaportes, que não trazem subdivisão; leia issuingCountry para o emissor |
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 e Decisão
São dois campos diferentes. status diz onde a sessão está; decision diz o que a Inyo concluiu, e só existe se você pediu que concluíssemos algo.
status — sempre presente
status | Significado | O que fazer |
|---|---|---|
pending | Criada, ainda não concluída | Aguarde |
completed | O cliente terminou e a sessão foi avaliada | Leia checks, trustIndex e decision, se você tiver |
failed | A captura nunca foi utilizável — no widget, o cliente esgotou as tentativas | Crie uma nova sessão. Não há decision numa sessão failed |
errored | Uma falha de plataforma interrompeu a avaliação. Alcançável apenas em verificações server-to-server | Repita a chamada com uma Idempotency-Key nova. Não há decision, e nada chegou a um revisor |
status nunca nomeia um veredito.
decision — somente no decisionamento gerenciado
decision | Significado | O que fazer |
|---|---|---|
approved | A verificação foi aprovada | Prossiga com o onboarding |
declined | A verificação não foi aprovada | Não prossiga. As linhas failed em checks dizem o motivo |
inconclusive | As evidências não resolveram o caso em nenhuma direção — final | Não prossiga. Não é uma decisão contra o cliente, então uma captura nova e mais nítida pode resolver |
in_review | Um humano está decidindo — não é final | Trate como pendente. Veja Revisão Manual |
Dois modos de decisionamento. Sob decisionamento não gerenciado — o padrão — a Inyo publica a avaliação e você decide: checks e trustIndex estão lá, e decision fica totalmente ausente do payload. Sob decisionamento gerenciado a Inyo também chega a um veredito, que é o campo decision, e pode encaminhar a sessão a um revisor humano antes.
A chave fica ausente, não
null."decision" in payloaddistingue "você nunca receberia uma decisão" de uma decisão que não conseguimos alcançar — esta última não existe.
Lendo checks[]
Cada checagem tem exatamente seis campos: name, status, group, severity, reason, detail.
| Campo | O que fazer com ele |
|---|---|
status | "passed", "failed", "undetermined" ou "not_evaluated". É a autoridade — não o re-derive a partir de detail |
severity | "critical", "high", "medium" ou "low", da mais pesada para a mais leve — quanto peso esta checagem carrega nesta verificação. É um peso, nunca um destino, e é configurável: leia decision para o desfecho em vez de derivá-lo daqui |
group | document, selfie, screening ou policy. O grupo de um nome nunca muda, então filtre por ele em vez de manter suas próprias listas de nomes |
reason | Um token estável nas linhas undetermined e not_evaluated — provider_unavailable, no_mrz e assim por diante. null nas demais |
detail | Texto para uma pessoa ler, incluindo o limiar quando a checagem tem um. Nunca ramifique com base nele — a redação pode mudar, o status não |
O conjunto varia. As checagens aparecem apenas quando aplicáveis — uma zona de leitura automática exige um documento que a carregue, as checagens de rosto exigem uma selfie, várias são habilitadas por conta. Percorra o array; nunca o indexe por posição.
Duas formas de uma checagem não chegar a um veredito, e nenhuma delas é uma constatação contra o cliente. undetermined significa que ela rodou e não concluiu; not_evaluated significa que não obtivemos veredito algum — um provedor que não alcançamos, um dado que o documento não trouxe, uma captura recusada antes da vez dela. Ambas são cobradas como uma fração do peso da checagem, em vez de ignoradas, e reason diz qual foi o caso. Uma linha ausente é uma terceira coisa: a checagem nunca foi aplicável.
As Checagens
Uma linha por checagem. severity é configurável, então o quanto uma falha custa nas suas verificações é definido para a sua conta.
| Checagem | Grupo | O que verifica | Presente |
|---|---|---|---|
document_readable | document | Os campos centrais de identidade — número, nome, data de nascimento — saíram todos do documento | Sempre |
document_not_expired | document | A data de expiração não está no passado | Quando o documento traz uma |
document_authentic | document | Uma análise forense de cada lado enviado não encontra recaptura, impressão, fotocópia ou falsificação. Os lados são mesclados nesta única linha, e detail nomeia o veredito de cada um. Uma recusa é lida duas vezes antes de valer | Quando habilitada na sua conta (padrão: ligada) |
document_scene_clear | document | Nenhum telefone, monitor ou tela está visível em qualquer parte do quadro. Ela lê a imagem inteira, então um display atrás de um documento genuíno também a dispara | Sempre |
document_mrz_valid | document | Os dígitos verificadores da zona de leitura automática validam | Quando o documento tem MRZ |
document_barcode_valid | document | O código de barras no verso carrega um registro de identidade bem formado. Um verso ilegível publica not_evaluated com motivo no_barcode e não custa nada | Quando o documento é uma habilitação ou carteira de identidade estadual dos EUA |
document_sources_agree | document | Os dados de leitura automática do documento — a zona de um passaporte, o código de barras de uma habilitação dos EUA — concordam com o que está impresso na face. Uma divergência nomeia os campos que diferem, nunca os valores | Quando o documento revelou dados de leitura automática e sua face revelou campos para comparar |
document_number_valid | document | O número corresponde ao formato conhecido de sua jurisdição. Consultivo — as tabelas de formato são públicas, porém imperfeitas | Quando existe uma regra para aquela jurisdição |
document_data_match | document | Os dados que você enviou concordam com o documento | Quando você define dataCheck: true e o documento revelou uma identidade |
document_type_match | document | O documento é do tipo que você declarou. O tipo é lido das imagens e comparado com prefill.documentType; sem um tipo declarado, a verificação publica not_evaluated em vez de um veredito | Sempre |
face_detected | selfie | Exatamente um rosto utilizável — não olhos fechados, óculos de sol ou cabeça muito virada | Quando uma selfie foi capturada |
liveness | selfie | A selfie é de uma pessoa ao vivo, não de uma reprodução | Quando uma selfie foi capturada |
face_match | selfie | A selfie é da mesma pessoa do retrato do documento | Quando uma selfie foi capturada |
age_match | selfie | A data de nascimento do documento concorda com a idade estimada a partir da selfie, dentro de uma tolerância definida para a sua conta. Uma estimativa é um indício, não uma prova | Quando a descrição de aparência está habilitada (padrão: desligada), a selfie revelou um rosto utilizável e o documento revelou uma data de nascimento |
sanctions_clear | screening | O nome não coincide com uma listagem OFAC SDN cuja data de nascimento também concorde. Uma coincidência que não pode ser confirmada publica undetermined — veja Triagem de Sanções | Quando a triagem está habilitada na sua conta (padrão: desligada) e o documento revelou uma identidade |
dmv_record_match | screening | Os dados extraídos de uma carteira dos EUA concordam com o registro do DMV emissor | Quando a verificação de DMV está habilitada (padrão: desligada) e o documento revelou uma identidade |
jurisdiction_accepted | policy | O país emissor é um que você aceita para aquele tipo de documento | Quando você configurou jurisdições aceitas |
capture_attempts | policy | O cliente não esgotou o limite de tentativas — veja Entrega pelo Widget | Apenas no fluxo do 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, issuingCountry |
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 — o issuingState de um passaporte é um deles, já que nenhum passaporte evidencia subdivisão. Envie o país em issuingCountry, que é comparado. 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 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 | Efeito |
|---|---|---|
| Nenhuma listagem no seu limiar ou acima | "passed" | inalterado |
| Uma listagem coincide e a data de nascimento concorda | "failed" | cobrada com o peso total desta checagem |
| Uma listagem coincide, mas nenhuma data de nascimento concorda | "undetermined" | cobrada menos — uma coincidência não confirmada não é uma constatação |
Nada ambíguo é resolvido em direção à aprovação. 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 undetermined (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 — o que significa
in_reviewe como uma decisão muda - Recebendo Resultados — como esse payload chega até você
