Pular para o conteúdo principal
POST
cURL
Use este endpoint para criar fluxos de verificação (workflows) pela API sem precisar montar você mesmo os nós do grafo do fluxo. Envie um array features na ordem em que os usuários devem concluir as verificações. A Didit o converte internamente em um fluxo baseado em nós e adiciona automaticamente a etapa final de status. Este endpoint POST /v3/workflows/ cria apenas fluxos simples e lineares, ou seja, uma lista features plana. Para ramificações, roteamento condicional, Document AI e nós de recusa/decisão, use o formato de grafo de nós documentado abaixo (usado pelo editor visual no console e pelas ferramentas de fluxo do Didit MCP). Consulte Configurações de recursos do fluxo para ver todos os campos de config aceitos por cada recurso.

Fluxo de KYC básico

Fluxo com questionário

Primeiro, crie o questionário com POST /v3/questionnaires/. Depois, use o questionnaire_id retornado como questionnaire_uuid.
A ordem dos recursos é importante. Por exemplo, coloque OCR antes de FACE_MATCH, NFC, DATABASE_VALIDATION ou de verificações AML do usuário que dependam dos dados do documento.

Referência de configuração de recursos

Cada item de features[] tem este formato:
A estrutura exata do objeto config depende do recurso. Consulte a lista completa de campos, valores padrão, configurações obrigatórias, intervalos de valores e exemplos em Configurações de recursos do fluxo. Para OCR, omita config.documents_allowed, envie null ou envie {} para permitir todos os tipos de documento compatíveis. Inclua-o apenas quando quiser restringir o fluxo a países ou tipos de documento específicos. Para QUESTIONNAIRE, config.questionnaire_uuid é obrigatório.

Configurações opcionais do fluxo

Você pode incluir qualquer um destes campos de nível superior ao criar um fluxo para controlar o comportamento das sessões. Todos são opcionais e, quando omitidos, assumem os valores padrão do fluxo.

Ramificação e fluxos baseados em nós (grafo)

Uma lista linear de features não consegue expressar “se X, então Y”. Para ramificação condicional (recusar com base em um status, rotear com base em um campo extraído, condicionar uma etapa a uma correspondência), uma etapa de requisição de Document AI ou nós terminais de recusa/decisão, os fluxos de verificação (workflows) da Didit usam um grafo de nós, a mesma estrutura que o construtor visual do console gera.
A forma mais simples de montar um fluxo em grafo é o Didit MCP: peça a um agente em linguagem natural (“após a verificação de identidade, se a profissão for ≈ ‘Software Engineer’, adicione uma etapa de comprovante de fundos”) e ele constrói, valida e salva o grafo para você. A estrutura abaixo é o que essas ferramentas (e o console) geram.

Formato do grafo

Um grafo é { start_node, nodes }. nodes é um mapa de id do nó → nó. As arestas são implícitas: cada nó aponta para a frente via next (incondicional) e/ou branches[].goto (condicional). start_node deve ser um nó de recurso. As ramificações são avaliadas em ordem e a primeira correspondência prevalece; um rules: [] vazio é o “else” que captura todo o resto (mantenha-o por último). session_status: "Determine" decide automaticamente com base nos resultados combinados dos recursos.
Todo nó de ramificação deve ter uma ramificação else explícita, ou seja, uma ramificação com rules: [] que roteia as sessões que não atendem a nenhuma das condições. Não dependa do next do nó de ramificação como alternativa: um next isolado aparece como uma aresta ambígua no construtor e é fácil de omitir. Quando você envia um nó de ramificação com um next e sem ramificação else, a API converte esse next em uma ramificação else explícita para você (assim, { …, "branches": [<conditions>], "next": "liveness" } é salvo como branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]). Crie o else você mesmo para ser explícito; a conversão é uma rede de segurança, não um substituto.

Regras e operadores de ramificação

Cada regra compara um campo a um valor usando um operador:
  • Campos identificam um resultado de recurso (kyc.status, aml.status, document_ai.status, face_match.score, …) ou um valor extraído (kyc.full_name, kyc.age, kyc.nationality, kyc.extra_fields.profession, um campo do Document AI document_ai.<key>, expected_details.*). Uma ramificação só pode ler um campo cujo recurso tenha sido executado em todos os caminhos que chegam até ela.
  • Operadores: equals, not_equals, greater_than(_or_equals), less_than(_or_equals), contains, not_contains, in, not_in, is_empty, is_not_empty, regex e fuzzy_match (apenas campos de texto; exige um score de 0 a 100, que é um limiar de similaridade, por exemplo, profissão ≥ 80% semelhante a “Software Engineer”).

Ramificação com base no motivo de o NFC não ter sido executado

Após um nó NFC, use nfc.skip_reason com equals ou in para rotear as sessões de acordo com o motivo pelo qual a leitura do chip não aconteceu. O campo tem estes sete valores estáveis:
  • USER_SKIPPED
  • DOCUMENT_WITHOUT_CHIP
  • CHIP_CERTIFICATE_UNAVAILABLE
  • DEVICE_WITHOUT_NFC
  • INTEGRATION_WITHOUT_NFC_ACCESS
  • MRZ_KEY_UNAVAILABLE
  • JPKI_UNAVAILABLE
Consulte Motivos para pular o NFC para saber o significado de cada valor. Quando o NFC é bem-sucedido, nfc.skip_reason é null, portanto nenhuma regra equals ou in para um motivo de pulo corresponde. O campo também é preenchido para nós NFC pulados por uma condição de bloqueio. Isso inclui casos em que não existe relatório nem aviso de NFC, e casos em que allow_nfc_skip é false, mas a condição do documento ou do dispositivo impede a execução do NFC. Assim, você pode rotear essas sessões sem depender de uma entrada em nfc_verifications[].
Sessões armazenadas antes de a capacidade de NFC passar a ter três estados podem ter has_device_nfc_support: false. Por isso, uma sessão web mais antiga pode ser resolvida como DEVICE_WITHOUT_NFC em vez de INTEGRATION_WITHOUT_NFC_ACCESS.
Este grafo usa equals para um pulo feito pelo usuário, in para pulos por condição de bloqueio ou por capacidade, e um else explícito para o NFC bem-sucedido. A ramificação vem depois do nó NFC, e cada destino aponta para a frente até um nó terminal:
Para expressar “o NFC não foi realizado por nenhum motivo conhecido”, use in com todos os sete valores. Mantenha uma ramificação else explícita para o NFC bem-sucedido (nfc.skip_reason: null) e para qualquer valor futuro que o seu grafo ainda não reconheça.

Document AI (por exemplo, comprovante de fundos)

Um nó de recurso DOCUMENT_AI solicita um ou mais documentos e extrai campos nomeados:
Cada campo configurado se torna um valor ramificável document_ai.<key>, e o resultado da etapa é document_ai.status. Defina "is_full_name": true no campo que contém o nome completo do titular do documento. O valor extraído é comparado com o nome completo da identidade verificada (o nome do OCR/da verificação de identidade ou os dados esperados da sessão), e document_ai_name_mismatch_action decide o que acontece quando há divergência abaixo de document_ai_name_match_score_threshold. A flag é opcional (um documento pode não marcar nenhum campo) e no máximo um campo por documento pode defini-la. Consulte Configurações de recursos do fluxo → Document AI para ver todos os campos de configuração do Document AI.

Endpoints e ciclo de vida do rascunho

A edição do grafo é feita por aplicação e usa os endpoints do console/de gerenciamento (Bearer de usuário + read:workflows/write:workflows). Um grafo só pode ser editado em uma versão de rascunho, então o ciclo de vida é criar rascunho → definir grafo → publicar:

Avisos de validação

O endpoint de validação responde { "is_valid": true, "graph": …, "warnings": [] }. Um aviso é apenas informativo: o grafo é válido, é salvo e é publicado mesmo com avisos. Cada entrada indica o nó de ramificação e o ramo a que se refere, para que um construtor possa apontar para a condição exata:
Um grafo inválido responde 400 com errors e uma lista warnings gerada conforme possível. Apenas errors impedem que o grafo seja salvo.

Exemplo prático: direcionar engenheiros de software para comprovante de fundos

Após a verificação de identidade: se ela foi recusada, recuse a sessão; se a profissão ≈ “Software Engineer” do titular (≥80% de similaridade), solicite um documento de comprovante de fundos; em seguida, tome uma decisão final.
O nó final usa session_status: "Determine", que decide automaticamente (aprova / recusa / coloca em revisão) com base nos recursos que de fato foram executados na sessão — assim, tanto o caminho do comprovante de fundos quanto o caminho else são resolvidos corretamente sem que nenhuma ramificação leia document_ai.status (que não existe no caminho que pula o Document AI). Lembre-se: uma ramificação só pode ler um campo cujo recurso foi executado em todos os caminhos que chegam até ela. Envie-o como { "graph": <above> } para o endpoint …/workflow-graph/ (valide antes). Para criar um fluxo novo do zero, use o didit_workflow_set_graph do MCP; para modificar um fluxo existente, use didit_workflow_edit_graph (operações pequenas, preserva os nós e as listas de permissão existentes). Consulte o Didit MCP.

Autorizações

x-api-key
string
header
obrigatório

Chave de API da sua aplicação, em Developers -> API keys no Business Console. A chave principal tem acesso total. Uma chave nomeada pode ter escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a uma data de validade. 401 significa que a chave está errada, revogada ou expirada; 403 significa que nenhuma chave foi enviada, que a chave não tem acesso a este recurso ou ação, ou que a requisição veio de um endereço fora da sua lista de IPs; 404 em uma rota de sessão significa que a sessão está fora dos fluxos ou status da chave. Uma chave sem acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave sem permissão de escrita em sessões recebe links e tokens de sessão como null. Consulte https://docs.didit.me/console/api-keys.

Corpo

application/json

Cria um fluxo de verificação (workflow) linear simples. A API converte internamente esta lista de recursos em um grafo de fluxo baseado em nós. Lista de campos permitidos RESTRITA: qualquer chave não listada aqui (incluindo workflow_type) é rejeitada com 400.

features
object[]
obrigatório

Recursos de verificação em ordem de execução. A API vincula cada item ao seguinte e adiciona automaticamente um nó final de status.

Minimum array length: 1
workflow_label
string
padrão:ID Verification

Nome de exibição do fluxo de verificação (workflow) (máximo de 50 caracteres). O padrão é "ID Verification" quando omitido; sempre defina-o para que os fluxos continuem distinguíveis.

Maximum string length: 50
Exemplo:

"Standard KYC"

is_default
boolean

Define este fluxo como padrão para novas sessões.

status
enum<string>

Omita este campo para criar um fluxo publicado, pronto para sessões. Use draft somente quando quiser salvar sem publicar.

Opções disponíveis:
draft,
published
is_white_label_enabled
boolean
padrão:false

Ativa a personalização de marca própria para as sessões criadas com este fluxo.

is_desktop_allowed
boolean
padrão:false

Permite que o fluxo de verificação seja executado em navegadores desktop.

max_retry_attempts
integer
padrão:3

Número máximo de novas tentativas permitidas após uma verificação recusada. 0 bloqueia o usuário após a primeira recusa.

Intervalo obrigatório: 0 <= x <= 10
retry_window_days
integer | null
padrão:7

Janela móvel em dias usada para contar as novas tentativas. null aplica um limite para todo o histórico.

Intervalo obrigatório: 1 <= x <= 365
face_liveness_max_attempts
integer
padrão:3

Número máximo de envios de prova de vida por sessão. Padrão 3: uma tentativa inicial mais duas novas tentativas. Esse valor também é copiado para os nós de prova de vida e de estimativa de idade gerados no fluxo de verificação (workflow), a menos que a configuração no nível do recurso o substitua.

Intervalo obrigatório: 1 <= x <= 3
face_match_max_attempts
integer
padrão:3

Número máximo de envios de correspondência facial por sessão. Padrão 3: uma tentativa inicial mais duas novas tentativas. Esse valor também é copiado para os nós de correspondência facial gerados no fluxo de verificação (workflow), a menos que a configuração no nível do recurso o substitua.

Intervalo obrigatório: 1 <= x <= 3
session_expiration_time
integer
padrão:604800

Segundos até a expiração de uma sessão não concluída. Mínimo de 1 hora (3600), máximo de 4 semanas (2419200).

Intervalo obrigatório: 3600 <= x <= 2419200

Resposta

Fluxo de verificação (workflow) criado. O corpo da resposta é a configuração COMPLETA do fluxo, a mesma serialização bruta de VerificationSettings retornada por GET /v3/workflows/{settings_uuid}/ (~190 campos: cada ativação de recurso, limiar, ação e o workflow_graph gerado), e não o item compacto da lista. Armazene o uuid (também exposto como workflow_id) para poder referenciá-lo em chamadas posteriores de criação de sessão. Observação: features é uma string unida por " + " e os preços são números JSON.

Os campos abaixo são tipados; o objeto também traz todas as outras colunas da configuração do fluxo de verificação (ativação de recursos, limiares, ações de aviso, documentos permitidos, callbacks) como propriedades adicionais. Os campos que não se aplicam ao workflow_type são null.

uuid
string<uuid>

Identificador da versão (settings_uuid). Cada versão de um fluxo tem o seu próprio.

workflow_id
string<uuid>

Identificador estável compartilhado por todas as versões do fluxo. As sessões criadas com ele usam a versão publicada mais recente.

workflow_label
string

Nome de exibição do fluxo.

workflow_type
enum<string> | null

Modelo do fluxo. null para fluxos em grafo criados sem modelo.

Opções disponíveis:
kyc,
kyb,
adaptive_age_verification,
biometric_authentication,
address_verification,
questionnaire_verification,
email_verification,
phone_verification,
null
is_default
boolean

Se este é o fluxo de verificação (workflow) padrão da aplicação.

is_archived
boolean

Fluxos arquivados não podem iniciar novas sessões.

version
integer

Número da versão dentro do fluxo.

status
enum<string>

As versões de rascunho são editáveis; as versões publicadas são imutáveis e usadas para novas sessões.

Opções disponíveis:
draft,
published
published_at
string<date-time> | null

Quando esta versão foi publicada. null para rascunhos.

is_simple_workflow
boolean

true quando o fluxo não tem um workflow_graph personalizado.

is_editable
boolean

true apenas para versões draft.

workflow_url
string<uri>

URL pública que inicia uma sessão com este fluxo.

workflow_graph
object | null

Estrutura de grafo do fluxo (nós e arestas). null para fluxos simples.

features
string

Recursos ativados unidos por " + ", por exemplo "OCR + LIVENESS".

total_price
number | null

Preço por sessão; para fluxos em grafo, o caminho mais caro.

min_price
number | null

Preço do caminho mais barato do fluxo.

max_price
number | null

Preço do caminho mais caro do fluxo.

special_add_on_prices
object | null

Preços de complementos específicos da organização, ou null quando nenhum está definido.

max_retry_attempts
integer

Novas tentativas permitidas após uma verificação recusada.

retry_window_days
integer | null

Dias durante os quais as novas tentativas são permitidas.

session_expiration_time
integer

Segundos até a expiração de uma sessão não concluída.

questionnaire
object | null

O questionário vinculado ao fluxo, ou null.

kyb_role_settings
object[]

Configurações de verificação por função para as pessoas-chave do KYB.

created_at
string<date-time>
updated_at
string<date-time>
signature_availability
object

Quais níveis de Assinatura eletrônica podem assinar neste momento. Verifique antes de definir signature_level. Retornado em fluxos kyc, kyb e de grafo.

is_bank_verification_enabled
boolean

Indica se um fluxo simples de KYC ou KYB executa a Verificação bancária. Ela é executada após as etapas de contato (e a Verificação de localização) e antes da validação de banco de dados, da AML e da análise de IP. A Verificação bancária ainda não está disponível para todos: ativá-la é recusado onde quer que ela não esteja habilitada.

bank_verification_config
object

Configurações de verificação bancária de um fluxo simples, com as mesmas chaves aceitas por um nó BANK_VERIFICATION (por exemplo, bank_countries e bank_method_order). Chaves desconhecidas são descartadas. Todas as chaves são opcionais e uma chave ausente mantém seu valor padrão, então {} significa todos os valores padrão. Consulte Configurações de verificação bancária.

Exemplo:
is_geolocation_enabled
boolean

Indica se um fluxo simples de KYC executa a Verificação de localização. Ela é executada após as etapas de contato e antes da Verificação bancária e da validação de banco de dados. Fluxos de empresas (KYB) não podem executá-la.

geolocation_config
object

Configurações de verificação de localização de um fluxo de verificação (workflow) simples, com as mesmas chaves que um nó GEOLOCATION aceita (por exemplo, is_geolocation_geofencing_enabled e geolocation_max_attempts). Chaves desconhecidas são descartadas. Todas as chaves são opcionais e uma chave ausente mantém seu valor padrão, então {} significa todos os valores padrão.

Exemplo:
Última modificação em 1 de novembro de 2026