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": "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

CampoDescrição
sessionIdO identificador da verificação. Use-o com GET /v1/sessions/{sessionId}
userRefSeu identificador, retornado exatamente como você o forneceu
statusOnde a verificação terminou — veja Status
autoStatusO que o pipeline decidiu antes de qualquer roteamento de revisão ou decisão humana — veja Revisão Manual
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
providerinyo para uma verificação real, inyo-mock para uma simulada — veja Sandbox
manualReviewPresente somente após uma decisão humana. Veja Revisão Manual
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
issuingStateAutoridade emissora conforme impressa — um estado dos EUA em carteiras de motorista, um código de país em passaportes
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

statusSignificadoO que fazer
pendingCriada, ainda não concluídaAguarde. Nenhuma decisão existe ainda
approvedTodas as checagens passaramProssiga com o onboarding
declinedPelo menos uma checagem hard falhouNão prossiga. O detail da checagem que falhou explica o motivo
in_reviewUm humano decide — não é finalTrate como pendente. Veja Revisão Manual
expiredO cliente nunca a concluiu dentro da validade do linkCrie uma nova sessão se ainda precisar da verificação

Lendo checks[]

Toda checagem tem exatamente quatro campos: name, status, group, detail.

RegraDetalhe
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 situadocument, 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 limiarQuando 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 variaAs 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.

ChecagemGrupoFalha quandoPresente
document_scene_cleardocumentUm telefone, monitor ou tela está visível no quadro — o documento está sendo fotografado a partir de um displaySempre
document_authenticdocumentA 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çãoQuando habilitada para o seu tenant (ativa por padrão), e pelo menos um lado pôde ser analisado
document_readabledocumentOs campos centrais de identidade (número, nome, data de nascimento) não puderam ser todos extraídosSempre
document_not_expireddocumentA data de expiração está no passadoQuando o documento traz uma data de expiração
jurisdiction_acceptedpolicyO país emissor do documento está fora das jurisdições que você aceita para aquele tipo de documentoQuando você configurou jurisdições aceitas
sanctions_clearscreeningO 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çõesQuando a triagem de sanções está habilitada para o seu tenant (padrão desligado)
face_detectedselfieNão há exatamente um rosto utilizável — olhos fechados, óculos de sol ou cabeça muito viradaQuando uma selfie foi capturada
livenessselfieA confiança de prova de vida está abaixo do seu limiarQuando uma selfie foi capturada
face_matchselfieA similaridade entre o retrato do documento e a selfie está abaixo do seu limiarQuando uma selfie foi capturada

Checagens soft encaminham a verificação para in_review em vez de recusá-la.

ChecagemGrupoFalha quandoPresente
document_mrz_validdocumentUm dígito verificador do MRZ não valida — um erro de OCR ou adulteraçãoQuando o documento tem zona de leitura mecânica
document_number_validdocumentO 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 automaticamenteQuando existe uma regra para aquela jurisdição
dmv_record_matchscreeningOs dados extraídos de uma carteira de motorista dos EUA divergem do registro do DMV emissorQuando a verificação no DMV está habilitada para o seu tenant (desativada por padrão)
document_data_matchdocumentOs dados que você enviou divergem do documentoQuando você define dataCheck: true
age_matchselfieA 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 }
]
CampoDescrição
fieldUm de firstName, lastName, dateOfBirth, documentType, documentNumber, nationality, issuingState
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. 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:

Resultadosanctions_clearstatus
Nenhuma listagem no seu limiar ou acima"passed"inalterado
Uma listagem coincide e a data de nascimento concorda"failed" — hard, recusadeclined
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
    }
  ]
}
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