> ## Documentation Index
> Fetch the complete documentation index at: https://docs.unifokal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Verificação de idade

> O módulo idade responde se o titular tem pelo menos 18 anos, pela selfie com prova de vida, e entrega só o veredito e o mínimo.

## Verificação de idade

O módulo `age_assurance` responde **uma** pergunta, e não a que a maioria espera: ele **não diz a idade do titular**, ele diz se o titular **tem pelo menos 18 anos**. A aferição sai da selfie, com prova de vida, e existe para o caso em que pedir documento de todo mundo é desproporcional. Ela depende da **prova de vida**: sem ela não há rosto ao vivo para aferir, e o módulo recusa antes de aferir qualquer coisa.

**Disponível desde 11 de setembro de 2026.** Ele aparece na tabela de preços e no `GET /v1/capabilities` com preço e status `available`, e pode ser ligado num flow. Até essa data a venda estava pausada, por licença do modelo que estima a idade: o peso anterior tinha origem restrita a pesquisa e foi retirado do produto. O que roda hoje tem cadeia de licença aberta, declarada na página de segurança.

**O que chega é o veredito, e nada além dele.** O bloco do módulo traz `decision` e `minimum`. A idade mínima é **18 anos**, fixa: é a maioridade, e nenhum flow pede outra. A idade estimada **não** sai no payload, no webhook nem no painel, e não fica guardada: o sinal de idade atesta a condição sem revelar dado pessoal adicional. O sim só sai com margem de segurança acima dos 18, e o resto da faixa de dúvida vira inconclusivo em vez de chute. O seu código se apoia em `decision`.

```
// idade: tem pelo menos 18 anos
{ "module": "age_assurance", "passed": true, "outcome": "approved", "score": 92,
  "data": { "decision": "YES",     // YES | NO | INCONCLUSIVE | NO_LIVENESS
            "minimum": 18 } }

// faixa de dúvida: nem confirma nem nega
{ "module": "age_assurance", "passed": null, "outcome": "pending", "score": 50,
  "data": { "decision": "INCONCLUSIVE", "minimum": 18 } }

// a prova de vida não sustentou a aferição: recusamos ANTES de aferir
{ "module": "age_assurance", "passed": false, "outcome": "failed", "score": 5,
  "data": { "decision": "NO_LIVENESS", "minimum": null } }
```

Os quatro vereditos têm significados distintos que vale separar: `YES` é "tem a idade", `NO` é "não tem", `INCONCLUSIVE` é a faixa em que não afirmamos nem uma coisa nem outra, e `NO_LIVENESS` é o caso em que nem chegamos a aferir. O `minimum` pode vir `null` quando a selfie não teve qualidade para medida nenhuma.

**O inconclusivo leva ao documento.** Num flow de aferição de idade (a finalidade `age_assurance`, que todo flow só de `age_assurance` e `liveness` tem), o inconclusivo nunca é tratado como aprovação nem fica parado numa fila: a verificação termina sem aprovar, com o motivo `age_document_required`, e o seu servidor abre na hora uma nova sessão num flow com documento, que confirma os 18 anos pela data de nascimento. Num flow de identidade com idade, o inconclusivo continua indo à sua fila de revisão, e a sua política escolhe o passo seguinte. O roteiro completo, com o grau de risco e o que vale como verificação, está em [ECA Digital: o que é seu e o que é nosso](https://docs.unifokal.com/modulos/eca-digital.md#eca-digital).

**Quem discorda do resultado tem por onde contestar.** Nas telas de recusa e de análise de um flow com `age_assurance`, o widget mostra ao titular, ao lado do botão de atendimento da sua empresa, que ele pode falar com o atendimento e pedir outra forma de comprovar a idade. Por isso, em produção, a criação de sessão de um flow com `age_assurance` exige o atendimento ligado na tela Customização do painel, e devolve `age_contest_channel_required` (422) quando ele está desligado; o sandbox fica livre. A reavaliação é pelo documento, e quem decide e responde ao titular é a sua empresa. Explique a aferição a quem vai passar por ela antes de abrir o widget e aponte a página [Verificação de idade](https://unifokal.com/verificacao-de-idade), escrita para o titular e a família.

**No sandbox só existem `YES` e `NO`**: o ambiente de testes não produz `INCONCLUSIVE` nem `NO_LIVENESS`, e chega a emitir o par `outcome: "pending"` com `decision: "NO"`, que a produção nunca emite (lá `NO` é sempre `failed`). Trate esses dois vereditos como caminhos a implementar às cegas, e teste-os com o seu próprio duplo.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.