> ## 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.

# Passos condicionais

> Como pedir um módulo pago só em alguns casos: os sinais e as comparações, "e" e "ou", o que acontece quando um sinal fica sem resposta conclusiva, o preço em faixa, a versão da regra e o teste no histórico do flow.

## Passos condicionais

Um passo condicional é um módulo do flow que só é pedido quando uma regra sua acontece. No construtor de flow, sob o módulo, use **Rodar somente quando...** e monte a regra em linhas: um sinal, uma comparação e um valor. Sem regra, o módulo roda em toda verificação, como sempre.

**Passo condicional é escolha de custo, nunca proteção.** Só aceitam regra as consultas pagas e informacionais, que não decidem a verificação: Assinatura eletrônica, Atestado de pessoa verificada, Benefícios do Governo, Boa Vista SCPC, Cadeia Societária, CADIN, Certidão trabalhista (CNDT), CNPJ - Cadastro Completo, CNPJ - Participação Societária, CNPJ - Receita em Tempo Real, CNPJ + Sócios, Coerência Cadastral, CPF - Contatos, CPF - Empresas no Nome, CPF - Endereços, CPF - Receita e Óbito, Custódia da autorização de consulta, Dados Cadastrais, Dívidas e Negativações, Inscrição estadual, PGFN Dívida Ativa, Protestos Cenprot, SCR Banco Central, Sua base de clientes. Captura do titular, compliance e antifraude rodam sempre, porque deixar de rodá-los quando um sinal vem bom abriria a saída justamente para quem tem sinal bom e documento roubado.

**Sinais e comparações.** A nota, de 0 a 100, de Documento (OCR), OCR do CNPJ, Face Match, Liveness: for menor que, for no máximo, for maior que ou for pelo menos o número que você escolher. O resultado (aprovado ou reprovado) de Documento (OCR), OCR do CNPJ, Face Match, Liveness, Detecção de Múltiplas Contas, Motor Antifraude, Verificação de IP, Risco de e-mail, Validação de e-mail, Telefone: código por SMS, Telefone: linha e operadora. E a resposta da sua base de clientes: for, não for ou for um destes (conhecido, desconhecido, pedido de revisão). Só aparece o sinal de um módulo que está no flow, roda antes do passo e não é ele mesmo condicional. A aferição de idade não é sinal de regra: ela só serve para verificar a idade.

**"E" e "ou".** Dentro de uma alternativa as condições se somam ("e"); entre alternativas basta uma ("ou"). A regra aceita até 8 condições no total e até 4 alternativas, e até 16 passos condicionais por flow. Para pôr a mesma regra em vários passos de uma vez, use **Aplicar também a**: cada passo guarda a regra e a versão dele, e o rodapé do construtor mostra uma linha por regra.

**O sinal sem resposta conclusiva pede o passo.** Se algum sinal lido pela regra não tiver resposta conclusiva (não foi lido, o módulo ficou indisponível, ainda estava em análise ou não havia o que medir), o passo é pedido, como se não houvesse regra. O passo só deixa de ser pedido quando todo sinal lido existe e nenhuma alternativa acontece.

**Preço.** Com passo condicional o flow tem uma faixa: o piso é o que toda verificação custa, e cada passo condicional só entra na conta quando a regra dele acontece e ele entrega. O que não é entregue não é cobrado.

**Versão.** A regra que vale é a do momento em que o titular envia a verificação. Cada mudança no conteúdo da regra cria uma versão nova, e cada verificação guarda a regra e a versão que valeram para ela.

**Testar no histórico.** No editor do passo de um flow salvo, **Testar no histórico** avalia a regra sobre as até 1.000 verificações decididas mais recentes do flow, nos últimos 7, 30 ou 90 dias, e diz em quantas o passo seria pedido, em quantas não, em quantas algum sinal ficou sem resposta conclusiva, e a comparação com a regra de hoje. O teste não cobra, não consulta fonte nenhuma, não abre mídia e não grava nada. Ele usa os sinais como ficaram gravados em cada verificação. No sandbox as notas são simuladas pelo final do documento, então a taxa não representa o seu público.

**Prova de ponta a ponta no sandbox.** Com a regra "a nota do Face Match for menor que 75 pontos", um documento de teste terminado em `-01` (nota 60 em cada módulo) pede o passo, e um terminado em `-00` (nota 95) não pede. O webhook traz o módulo só quando ele foi pedido.

**Na verificação.** No painel, o detalhe da verificação ganha o bloco **Passos condicionais**: por passo, se foi pedido pela regra, se não foi (não rodou e não foi cobrado), se foi pedido porque um sinal ficou sem resposta conclusiva, ou se ainda não foi avaliado, com os sinais lidos pela regra no fim da primeira análise e a versão. Esse bloco não vai no webhook.

**Quem pode o quê.** Montar, editar e testar a regra: papel owner, admin ou dev. Ler a regra, a versão e o bloco da verificação: qualquer papel. As rotas são do painel, nunca da chave secreta.

```
# credencial: sessao do painel (papel owner, admin ou dev). A chave secreta nao alcanca estas rotas.
# PATCH /v1/flows/:id (e POST /v1/flows): module_conditions, por modulo alvo
{
  "module_conditions": {
    "cpf_contacts": { "v": 1, "when": "post_analysis",
                      "all": [ { "fact": "module.face.score", "op": "lt", "value": 75 } ] },
    "credit_debts": { "v": 2, "when": "post_analysis",
                      "any": [ { "all": [ { "fact": "module.face.score", "op": "lt", "value": 75 },
                                          { "fact": "module.fraud_ai.passed", "op": "eq", "value": false } ] },
                               { "all": [ { "fact": "module.liveness.score", "op": "lt", "value": 85 } ] } ] }
  }
}
# A resposta devolve a forma canonica (v2 de uma alternativa volta como v1) e
# module_condition_versions: { "cpf_contacts": 1, "credit_debts": 1 }.
# Omitir module_conditions preserva as regras; {} limpa todas.

# POST /v1/flows/:id/condition-preview
{ "modules": ["cpf_ocr", "face", "liveness", "fraud_ai", "cpf_contacts"],
  "module_conditions": { "cpf_contacts": { ... } }, "window_days": 30 }
# 200: { flow_id, environment, window: { from, to, days, sampled_from }, verifications, truncated,
#        targets: { cpf_contacts: { requested, skipped, unreadable, current, newly_requested,
#                                   no_longer_requested } } }
```

```
# Codigos de recusa
422 condition_module_not_in_flow       regra para modulo fora do flow
422 module_not_conditionable           captura, compliance ou antifraude
422 conditional_module_is_dependency   outro modulo do flow depende deste
422 condition_cycle                    a regra le o proprio passo
422 condition_references_future_step   sinal de passo condicional ou de inicio
422 condition_fact_module_not_in_flow  sinal de modulo fora do flow
422 condition_fact_not_readable        sinal que so existe depois da decisao
422 condition_fact_not_allowed         afericao de idade como sinal
422 condition_value_out_of_range       nota fora de 0 a 100
422 condition_too_many_predicates      mais de 8 condicoes na regra
422 condition_too_many_groups          mais de 4 alternativas
422 invalid_run_condition              documento fora da gramatica
403 insufficient_role                  papel viewer escrevendo ou testando
404 flow_not_found                     flow de outra conta ou inexistente
429 rate_limited                       mais de 20 testes por minuto na conta
503 condition_preview_unavailable      teste ocupado ou demorado; veja Retry-After
503 service_unavailable                banco indisponivel; veja Retry-After
```


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