Inyo

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

CampoDescrição
sessionIdO identificador da verificação. Use-o com GET /v1/sessions/{sessionId}
userRefSeu identificador, retornado exatamente como você o forneceu
statusOnde a sessão está no seu ciclo de vida — veja Status e decisão
decisionO 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
documentDados extraídos do documento
personDados de identidade extraídos
checksAs checagens individuais que produziram a decisão — veja Lendo checks[]
prefillMismatchesNomes dos campos de prefill que divergiram do documento. Vazio a menos que você tenha enviado prefill
prefillComparisonDetalhe da comparação por campo — veja Comparação de prefill
selfieDescriptionDescrição estruturada da aparência. Presente apenas quando habilitada para o seu tenant — caso contrário a chave está ausente, não null
screeningCoincidê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
trustIndexA pontuação da verificação, de 0 a 100
providerinyo para uma verificação real, inyo-simulated para uma ditada por um número de documento reservado — veja Sandbox
notifiedAtPresente somente em notificações entregues, não no resultado armazenado. Use-o para ordenar entregas concorrentes — veja Recebendo Resultados

document

CampoDescrição
typepassport, drivers_license ou identity_card — o mesmo vocabulário que você envia em prefill.documentType
numberNúmero do documento tal como lido no documento
personalNumberIdentificador nacional secundário quando o documento o possui
issuingStateA 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
issuingCountryPaís resolvido em ISO 3166-1 alpha-3
issuingCountryNameNome 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, dateOfIssueYYYY-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

statusSignificadoO que fazer
pendingCriada, ainda não concluídaAguarde
completedO cliente terminou e a sessão foi avaliadaLeia checks, trustIndex e decision, se você tiver
failedA captura nunca foi utilizável — no widget, o cliente esgotou as tentativasCrie uma nova sessão. Não há decision numa sessão failed
erroredUma falha de plataforma interrompeu a avaliação. Alcançável apenas em verificações server-to-serverRepita 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

decisionSignificadoO que fazer
approvedA verificação foi aprovadaProssiga com o onboarding
declinedA verificação não foi aprovadaNão prossiga. As linhas failed em checks dizem o motivo
inconclusiveAs evidências não resolveram o caso em nenhuma direção — finalNão prossiga. Não é uma decisão contra o cliente, então uma captura nova e mais nítida pode resolver
in_reviewUm humano está decidindo — não é finalTrate 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 payload distingue "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.

CampoO 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
groupdocument, 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
reasonUm token estável nas linhas undetermined e not_evaluatedprovider_unavailable, no_mrz e assim por diante. null nas demais
detailTexto 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.

ChecagemGrupoO que verificaPresente
document_readabledocumentOs campos centrais de identidade — número, nome, data de nascimento — saíram todos do documentoSempre
document_not_expireddocumentA data de expiração não está no passadoQuando o documento traz uma
document_authenticdocumentUma 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 valerQuando habilitada na sua conta (padrão: ligada)
document_scene_cleardocumentNenhum 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 disparaSempre
document_mrz_validdocumentOs dígitos verificadores da zona de leitura automática validamQuando o documento tem MRZ
document_barcode_validdocumentO 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 nadaQuando o documento é uma habilitação ou carteira de identidade estadual dos EUA
document_sources_agreedocumentOs 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 valoresQuando o documento revelou dados de leitura automática e sua face revelou campos para comparar
document_number_validdocumentO número corresponde ao formato conhecido de sua jurisdição. Consultivo — as tabelas de formato são públicas, porém imperfeitasQuando existe uma regra para aquela jurisdição
document_data_matchdocumentOs dados que você enviou concordam com o documentoQuando você define dataCheck: true e o documento revelou uma identidade
document_type_matchdocumentO 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 vereditoSempre
face_detectedselfieExatamente um rosto utilizável — não olhos fechados, óculos de sol ou cabeça muito viradaQuando uma selfie foi capturada
livenessselfieA selfie é de uma pessoa ao vivo, não de uma reproduçãoQuando uma selfie foi capturada
face_matchselfieA selfie é da mesma pessoa do retrato do documentoQuando uma selfie foi capturada
age_matchselfieA 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 provaQuando 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_clearscreeningO 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çõesQuando a triagem está habilitada na sua conta (padrão: desligada) e o documento revelou uma identidade
dmv_record_matchscreeningOs dados extraídos de uma carteira dos EUA concordam com o registro do DMV emissorQuando a verificação de DMV está habilitada (padrão: desligada) e o documento revelou uma identidade
jurisdiction_acceptedpolicyO país emissor é um que você aceita para aquele tipo de documentoQuando você configurou jurisdições aceitas
capture_attemptspolicyO cliente não esgotou o limite de tentativas — veja Entrega pelo WidgetApenas 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 }
]
CampoDescrição
fieldUm de firstName, lastName, dateOfBirth, documentType, documentNumber, nationality, issuingState, issuingCountry
sent / receivedSeu valor e o valor lido do documento
matchSe são considerados iguais
methodPara 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 / thresholdSimilaridade 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:

Resultadosanctions_clearEfeito
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
    }
  ]
}
CampoSignificado
nameO nome da entidade listada, conforme publicado
sourceListSempre us_ofac hoje
programsProgramas de sanções da OFAC aos quais a listagem pertence
entityIdIdentificador da listagem, para consulta na fonte
scoreSimilaridade de nome, 0-100
dobAgreestrue, 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