Saltar para o conteúdo principal
POST
cURL
Use este endpoint para criar fluxos através da API sem construir você mesmo os nós do grafo do fluxo. Envie um array features pela ordem em que os utilizadores devem concluir as verificações. A Didit converte-o internamente num fluxo baseado em nós e adiciona automaticamente o passo final de estado. Este endpoint POST /v3/workflows/ cria apenas fluxos simples e lineares, com uma lista plana features. Para ramificação, encaminhamento condicional, Document AI e nós de recusa ou decisão, use o formato de grafo descrito abaixo, que é o que alimenta o construtor visual da consola e as ferramentas de fluxo do Didit MCP. Consulte as Configurações de funcionalidades do fluxo para ver todos os campos config aceites por cada funcionalidade.

Fluxo KYC básico

Fluxo de questionários

Crie primeiro o questionário com POST /v3/questionnaires/. Depois, use o questionnaire_id devolvido como questionnaire_uuid.
A ordem das funcionalidades é importante. Por exemplo, coloque OCR antes de FACE_MATCH, NFC, DATABASE_VALIDATION ou das verificações AML de utilizadores que dependam dos dados do documento.

Referência de configuração das funcionalidades

Cada item de features[] tem esta estrutura:
O objeto config exato depende da funcionalidade. Reveja a lista completa de campos, valores predefinidos, definições obrigatórias, intervalos de valores e exemplos em Configurações de funcionalidades do fluxo. Para OCR, omita config.documents_allowed, envie null ou envie {} para permitir todos os tipos de documentos suportados. Inclua-o apenas se quiser restringir o fluxo a países ou tipos de documento específicos. Para QUESTIONNAIRE, config.questionnaire_uuid é obrigatório.

Definições opcionais do fluxo

Pode incluir qualquer um destes campos de nível superior ao criar um fluxo para controlar o comportamento da sessão. Todos são opcionais e, quando são omitidos, assumem os valores predefinidos do fluxo.

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

Uma lista linear features não consegue expressar “se X então Y”. Para a ramificação condicional (recusar com base num estado, encaminhar com base num campo extraído, condicionar um passo a uma correspondência), um passo de pedido de Document AI, ou nós terminais de recusa/decisão, os fluxos da Didit usam um grafo de nós, a mesma estrutura que o construtor visual da consola produz.
A forma mais simples de criar um fluxo em grafo é através do Didit MCP: peça a um agente, em linguagem simples (“após a verificação de identidade, se a profissão for ≈ ‘Software Engineer’, adicione um passo de comprovativo de fundos”), e ele constrói, valida e guarda o grafo por si. A estrutura abaixo é a que essas ferramentas (e a consola) produzem.

Forma 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 através de next (incondicional) e/ou branches[].goto (condicional). start_node tem de ser um nó de funcionalidade. As ramificações são avaliadas por ordem, vence a primeira correspondência; um rules: [] vazio é o “senão” que captura todos os casos restantes (mantenha-o por último). session_status: "Determine" decide automaticamente com base nos resultados combinados das funcionalidades.
Cada nó de ramificação tem de ter uma ramificação “senão” explícita: uma ramificação com rules: [] que encaminha as sessões que não correspondem a nenhuma das condições. Não confie no next do nó de ramificação como fallback: um next isolado aparece como uma aresta ambígua no construtor e é fácil de omitir. Quando envia um nó de ramificação com next e sem ramificação “senão”, a API converte esse next numa ramificação “senão” explícita (por isso, { …, "branches": [<conditions>], "next": "liveness" } é guardado como branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]). Crie o “senão” você mesmo para ser explícito; a conversão é uma rede de segurança, não um substituto.

Regras de ramificação e operadores

Cada regra compara um campo com um valor através de um operador:
  • Campos indicam um resultado de funcionalidade (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 cuja funcionalidade tenha sido executada em todos os caminhos que chegam a 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, um limiar de semelhança, por exemplo profissão com uma semelhança ≥ 80% com “Software Engineer”).

Ramificar com base no motivo pelo qual o NFC não foi executado

Depois de um nó NFC, use nfc.skip_reason com equals ou in para encaminhar as sessões consoante 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 ignorar o NFC para saber o que significa cada valor. Quando o NFC é bem-sucedido, nfc.skip_reason é null, por isso nem uma regra equals nem uma regra in para um motivo de omissão correspondem. O campo também é resolvido para nós NFC ignorados devido a uma condição de controlo. Isto inclui casos em que não existe qualquer relatório ou aviso de NFC, e casos em que allow_nfc_skip é false, mas o controlo do documento ou do dispositivo impede a execução do NFC. Pode, por isso, encaminhar estas sessões sem depender de uma entrada em nfc_verifications[].
As sessões guardadas antes de a capacidade NFC passar a ser tri-estado podem ter has_device_nfc_support: false. Uma sessão web mais antiga pode, por isso, resolver para DEVICE_WITHOUT_NFC em vez de INTEGRATION_WITHOUT_NFC_ACCESS.
Este grafo usa equals para uma omissão pelo utilizador, in para omissões por controlo de acesso ou capacidade, e um “senão” explícito para o NFC bem-sucedido. A ramificação vem depois do nó NFC, e todos os destinos apontam para a frente, para um nó terminal:
Para expressar “o NFC não foi executado por nenhum motivo conhecido”, use in com todos os sete valores. Mantenha uma ramificação “senão” 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, comprovativo de fundos)

Um nó de funcionalidade DOCUMENT_AI pede um ou mais documentos e extrai campos nomeados:
Cada campo configurado torna-se um valor que pode ser usado numa ramificação, document_ai.<key>, e o resultado do passo é 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 obtido por OCR/verificação de identidade, ou os detalhes esperados da sessão), e document_ai_name_mismatch_action decide o que acontece em caso de divergência abaixo de document_ai_name_match_score_threshold. A flag é opcional: um documento pode não definir nenhum campo, e no máximo um campo por documento pode defini-la. Consulte Configurações de funcionalidades dos fluxos → 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 da consola/gestão (Bearer do utilizador + read:workflows/write:workflows). Um grafo só pode ser editado numa versão em rascunho, por isso o ciclo de vida é criar rascunho → definir grafo → publicar:

Avisos de validação

O endpoint de validação responde com { "is_valid": true, "graph": …, "warnings": [] }. Um aviso é consultivo: o grafo é válido, é guardado e é publicado mesmo com avisos presentes. Cada entrada indica o nó de ramificação e o ramo a que diz respeito, para que quem constrói o fluxo possa apontar para a condição exata:
Um grafo inválido responde com 400, com errors e com uma lista warnings tanto quanto possível. Apenas errors bloqueiam a gravação.

Exemplo prático: encaminhar Engenheiros de software para comprovativo de fundos

Após a verificação de identidade: se foi recusada, recusar a sessão; se a profissão do titular ≈ “Software Engineer” (≥80% semelhante), pedir um comprovativo de fundos; depois tomar uma decisão final.
O nó final usa session_status: "Determine", que decide automaticamente (aprovação / recusa / em análise) com base nas funcionalidades que foram efetivamente executadas na sessão - por isso, tanto o caminho do comprovativo de fundos como o caminho else são resolvidos corretamente, sem que nenhum ramo leia document_ai.status (que não existe no caminho que ignora o Document AI). Lembre-se: um ramo só pode ler um campo cuja funcionalidade tenha sido executada em todos os caminhos que chegam a ele. Envie-o como { "graph": <above> } para o endpoint …/workflow-graph/ (valide primeiro). Para criar um novo fluxo do zero, use didit_workflow_set_graph do MCP; para modificar um fluxo existente, use didit_workflow_edit_graph (pequenas operações que preservam os nós existentes e as listas de permissão). Consulte o Didit MCP.

Autorizações

x-api-key
string
header
obrigatório

A chave de API da sua aplicação, a partir de Programadores -> Chaves de API na Business Console. A chave principal tem acesso total. Uma chave nomeada pode ter o âmbito definido: nenhum, 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á incorreta, 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 o pedido veio de um endereço fora da sua lista de IP; 404 numa rota de sessão significa que a sessão está fora dos fluxos ou estados da chave. Uma chave sem acesso a multimédia recebe URLs de imagens, vídeos e PDFs como nulos, e uma chave sem permissão de escrita em sessões recebe ligações de sessão e tokens como nulos. Consulte https://docs.didit.me/console/api-keys.

Corpo

application/json

Crie um fluxo linear simples. A API converte internamente esta lista de funcionalidades num grafo de fluxo baseado em nós. Lista de permissões ESTRITA de campos: qualquer chave não listada aqui (incluindo workflow_type) é rejeitada com o código 400.

features
object[]
obrigatório

Funcionalidades de verificação por ordem de execução. A API liga cada item ao seguinte e adiciona automaticamente um nó final de estado.

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

Nome de apresentação do fluxo (máx. 50 carateres). Assume por predefinição "ID Verification" quando omitido — configure-o sempre para que os fluxos permaneçam distinguíveis.

Maximum string length: 50
Exemplo:

"Standard KYC"

is_default
boolean

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

status
enum<string>

Omita este campo para criar um fluxo publicado pronto para sessões. Utilize draft apenas quando pretender guardar sem publicar.

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

Ativar a personalização em marca branca para sessões criadas com este fluxo.

is_desktop_allowed
boolean
padrão:false

Permitir que o fluxo de verificação seja executado em navegadores de computador.

max_retry_attempts
integer
padrão:3

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

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

Janela móvel em dias utilizada para contar tentativas. null aplica um limite histórico total.

Intervalo necessá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 e duas novas tentativas). Este valor também é copiado para os nós do fluxo de prova de vida e de estimativa de idade gerados, a menos que a configuração ao nível da funcionalidade o substitua.

Intervalo necessá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 e duas novas tentativas). Este valor também é copiado para os nós do fluxo de correspondência facial gerados, a menos que a configuração ao nível da funcionalidade o substitua.

Intervalo necessário: 1 <= x <= 3
session_expiration_time
integer
padrão:604800

Segundos até uma sessão inacabada expirar. Mínimo de 1 hora (3600), máximo de 4 semanas (2419200).

Intervalo necessário: 3600 <= x <= 2419200

Resposta

Fluxo criado. O corpo da resposta é a configuração COMPLETA do fluxo — a mesma serialização bruta de VerificationSettings devolvida por GET /v3/workflows/{settings_uuid}/ (~190 campos: todas as opções de funcionalidades, limiares, ações e o workflow_graph gerado), e não o elemento compacto da lista. Guarde o uuid (também exposto como workflow_id) para poder referenciá-lo em chamadas posteriores de criação de sessões. Nota: features é uma cadeia unida por " + " e os preços são números JSON.

Os campos abaixo são tipados; o objeto também contém todas as outras colunas da configuração do fluxo (comutadores de funcionalidades, 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 por versão (settings_uuid). Cada versão de um fluxo tem o seu próprio.

workflow_id
string<uuid>

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

workflow_label
string

Nome de apresentação do fluxo.

workflow_type
enum<string> | null

Modelo de fluxo. null para fluxos em grafo criados sem um 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 predefinido da aplicação.

is_archived
boolean

Os 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 utilizadas 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úblico que inicia uma sessão com este fluxo.

workflow_graph
object | null

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

features
string

Funcionalidades ativadas unidas 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 económico ao longo do fluxo.

max_price
number | null

Preço do caminho mais caro ao longo do fluxo.

special_add_on_prices
object | null

Preços de suplementos específicos da organização, ou null quando nenhum estiver definido.

max_retry_attempts
integer

Tentativas permitidas após uma verificação recusada.

retry_window_days
integer | null

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

session_expiration_time
integer

Segundos até uma sessão inacabada expirar.

questionnaire
object | null

O questionário associado ao fluxo, ou null.

kyb_role_settings
object[]

Definições de verificação por função para pessoas-chave de KYB.

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

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

is_bank_verification_enabled
boolean

Se um fluxo simples de KYC ou KYB executa a verificação bancária. É executada após os passos de contacto (e a verificação de localização) e antes da validação de base de dados, AML e análise de IP. A verificação bancária ainda não está disponível de forma geral: a sua ativação é recusada onde não estiver ativada.

bank_verification_config
object

Definições de verificação bancária de um fluxo simples, com as mesmas chaves que um nó BANK_VERIFICATION aceita (por exemplo, bank_countries e bank_method_order). Chaves desconhecidas são ignoradas. Todas as chaves são opcionais e uma chave ausente mantém o seu valor predefinido, pelo que {} significa todas as predefinições. Consulte Definições de verificação bancária.

Exemplo:
is_geolocation_enabled
boolean

Se um fluxo simples de KYC executa a verificação de localização. É executada após os passos de contacto e antes da verificação bancária e da validação de base de dados. Os fluxos de empresas (KYB) não a podem executar.

geolocation_config
object

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

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