Vai al contenuto principale
POST
cURL
Usa questo endpoint per creare workflow tramite API senza costruire tu stesso i nodi del grafo del workflow. Invia un array features nell’ordine in cui gli utenti devono completare i controlli. Didit lo converte internamente in un workflow basato su nodi e aggiunge automaticamente il passaggio finale di stato. Questo endpoint POST /v3/workflows/ crea solo workflow semplici e lineari, cioè un elenco piatto di features. Per ramificazioni, instradamento condizionale, Document AI e nodi di rifiuto o decisione, usa il formato a grafo descritto di seguito. Questo formato alimenta il builder visuale della console e gli strumenti workflow del Didit MCP. Consulta Configurazioni delle funzionalità del workflow per ogni campo config accettato da ciascuna funzionalità.

Workflow KYC di base

Workflow del questionario

Crea prima il questionario con POST /v3/questionnaires/. Poi usa il questionnaire_id restituito come questionnaire_uuid.
L’ordine delle funzionalità è importante. Ad esempio, inserisci OCR prima di FACE_MATCH, NFC, DATABASE_VALIDATION o dei controlli AML sugli utenti che dipendono dai dati del documento.

Riferimento della configurazione delle funzionalità

Ogni elemento di features[] ha questa struttura:
L’oggetto config esatto dipende dalla funzionalità. Consulta l’elenco completo dei campi, i valori predefiniti, le impostazioni obbligatorie, gli intervalli di valori ed esempi in Configurazioni delle funzionalità del workflow. Per OCR, ometti config.documents_allowed, invia null oppure invia {} per consentire ogni tipo di documento supportato. Includilo solo se vuoi limitare il workflow a paesi o tipi di documento specifici. Per QUESTIONNAIRE, config.questionnaire_uuid è obbligatorio.

Impostazioni opzionali del workflow

Puoi includere questi campi di primo livello quando crei un workflow per controllare il comportamento delle sessioni. Sono tutti facoltativi e, se omessi, vengono usati i valori predefiniti del workflow.

Grafo dei flussi con ramificazioni e nodi

Una lista features lineare non può esprimere “se X allora Y”. Per le ramificazioni condizionali (rifiutare in base a uno stato, instradare in base a un campo estratto, far dipendere un passaggio da una corrispondenza), un passaggio di richiesta di Document AI o i nodi terminali di rifiuto/decisione, i flussi di Didit usano un grafo di nodi: la stessa struttura prodotta dal builder visuale della console.
Il modo più semplice per costruire un flusso a grafo è il Didit MCP: chiedi a un agente in linguaggio naturale (“dopo la verifica dell’identità, se la professione è ≈ ‘Software Engineer’, aggiungi un passaggio di prova dei fondi”) e lui costruirà, convaliderà e salverà il grafo per te. La struttura descritta di seguito è quella prodotta da questi strumenti e dalla console.

Struttura del grafo

Un grafo è { start_node, nodes }. nodes è una mappa dall’ID del nodo al nodo. Gli archi sono impliciti: ogni nodo punta in avanti tramite next (incondizionato) e/o branches[].goto (condizionato). start_node deve essere un nodo di tipo feature. I rami vengono valutati in ordine e vince il primo che corrisponde; un rules: [] vuoto è il ramo generico “altrimenti” (va messo per ultimo). session_status: "Determine" decide automaticamente in base all’esito combinato delle funzionalità.
Ogni nodo di tipo branch deve avere un ramo “altrimenti” esplicito: un ramo con rules: [] che instrada le sessioni che non corrispondono a nessuna delle condizioni. Non affidarti al next del nodo branch come fallback: un next isolato viene visualizzato come un arco ambiguo nel generatore visuale ed è facile da dimenticare. Quando invii un nodo branch con un next e senza un ramo “altrimenti” esplicito, l’API converte quel next in un ramo “altrimenti” esplicito al posto tuo (quindi { …, "branches": [<conditions>], "next": "liveness" } viene salvato come branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]). Scrivi tu il ramo “altrimenti” per essere esplicito: la conversione è una rete di sicurezza, non un sostituto.

Regole di ramificazione e operatori

Ogni regola confronta un campo con un valore tramite un operatore:
  • I campi indicano un esito di una funzionalità (kyc.status, aml.status, document_ai.status, face_match.score, …) oppure un valore estratto (kyc.full_name, kyc.age, kyc.nationality, kyc.extra_fields.profession, un campo di Document AI document_ai.<key>, expected_details.*). Un ramo può leggere solo un campo la cui funzionalità sia stata eseguita su ogni percorso che porta al ramo stesso.
  • Operatori: 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 (solo per campi stringa; richiede un score da 0 a 100, cioè una soglia di somiglianza, ad esempio professione simile almeno all’80% a “Software Engineer”).

Ramificazione in base al motivo per cui l’NFC non è stato eseguito

Dopo un nodo NFC, usa nfc.skip_reason con equals o in per instradare le sessioni in base al motivo per cui la lettura del chip non è avvenuta. Il campo ha questi sette valori stabili:
  • USER_SKIPPED
  • DOCUMENT_WITHOUT_CHIP
  • CHIP_CERTIFICATE_UNAVAILABLE
  • DEVICE_WITHOUT_NFC
  • INTEGRATION_WITHOUT_NFC_ACCESS
  • MRZ_KEY_UNAVAILABLE
  • JPKI_UNAVAILABLE
Consulta Motivi di mancata NFC per il significato di ciascun valore. Quando l’NFC ha esito positivo, nfc.skip_reason è null, quindi né una regola equals né una regola in per un motivo di salto corrispondono. Il campo viene risolto anche per i nodi NFC saltati a causa di un controllo. Questo include i casi in cui non esistono né un report né un avviso NFC, e i casi in cui allow_nfc_skip è false ma il gate sul documento o sul dispositivo impedisce l’esecuzione dell’NFC. Puoi quindi instradare queste sessioni senza fare affidamento su una voce di nfc_verifications[].
Le sessioni memorizzate prima che la capacità NFC diventasse tri-stato possono avere has_device_nfc_support: false. Una sessione web meno recente può quindi risolversi in DEVICE_WITHOUT_NFC invece che in INTEGRATION_WITHOUT_NFC_ACCESS.
Questo grafo usa equals per il salto dell’utente, in per i salti dovuti a gate o capacità, e un ramo “altrimenti” esplicito per l’NFC riuscito. Il ramo si trova dopo il nodo NFC, e ogni destinazione punta in avanti verso un nodo terminale:
Per esprimere “l’NFC non è stato eseguito per nessun motivo noto”, usa in con tutti e sette i valori. Mantieni un ramo “altrimenti” esplicito per l’NFC riuscito (nfc.skip_reason: null) e per qualsiasi valore futuro che il tuo grafo non riconosce ancora.

Document AI (ad esempio prova dei fondi)

Un nodo di funzionalità DOCUMENT_AI richiede uno o più documenti ed estrae campi denominati:
Ogni campo configurato diventa un valore utilizzabile in una ramificazione, document_ai.<key>, e l’esito del passaggio è document_ai.status. Imposta "is_full_name": true sul campo che contiene il nome completo del titolare del documento. Il suo valore estratto viene confrontato con il nome completo dell’identità verificata (il nome ottenuto tramite OCR o verifica dell’identità, oppure i dettagli attesi della sessione), e document_ai_name_mismatch_action decide cosa succede in caso di mancata corrispondenza sotto document_ai_name_match_score_threshold. Il flag è facoltativo: un documento può non contrassegnare alcun campo, e al massimo un campo per documento può impostarlo. Consulta Configurazioni delle funzionalità dei flussi → Document AI per ogni campo di configurazione di Document AI.

Endpoint e ciclo di vita della bozza

La modifica del grafo avviene per applicazione e usa gli endpoint della console e della gestione (Bearer dell’utente + read:workflows/write:workflows). Un grafo può essere modificato solo su una versione in bozza, quindi il ciclo di vita è crea bozza → imposta grafo → pubblica:

Avvisi di validazione

L’endpoint di validazione risponde con { "is_valid": true, "graph": …, "warnings": [] }. Un avviso è consultivo: il grafo è valido, può essere salvato e pubblicato anche in presenza di avvisi. Ogni voce indica il nodo di ramo e il braccio a cui si riferisce, così chi costruisce il flusso può individuare con precisione la condizione:
Un grafo non valido risponde con 400 includendo errors e un elenco warnings redatto al meglio. Solo errors bloccano il salvataggio.

Esempio svolto: indirizzare gli ingegneri del software verso la prova dei fondi

Dopo la verifica dell’identità: se è stata rifiutata, rifiuta la sessione; se la professione del titolare ≈ “Software Engineer” (somiglianza ≥80%), richiedi un documento di prova dei fondi; poi prendi una decisione finale.
Il nodo finale usa session_status: "Determine", che decide automaticamente (approva / rifiuta / in revisione) in base alle funzionalità effettivamente eseguite nella sessione. Così sia il percorso della prova dei fondi sia quello else si risolvono correttamente, senza che alcun ramo legga document_ai.status (che non esiste nel percorso che salta Document AI). Ricorda: un ramo può leggere solo un campo la cui funzionalità è stata eseguita su ogni percorso che lo raggiunge. Invia il grafo come { "graph": <above> } all’endpoint …/workflow-graph/ (prima convalida). Per creare un nuovo workflow da zero usa didit_workflow_set_graph dell’MCP; per modificare un workflow esistente usa didit_workflow_edit_graph (piccole operazioni che conservano i nodi esistenti e le liste di elementi consentiti). Vedi Didit MCP.

Autorizzazioni

x-api-key
string
header
obbligatorio

La chiave API della tua applicazione, da Developers -> API keys nella Business Console. La chiave primaria ha accesso completo. Una chiave con nome può avere un ambito definito: nessuno, lettura o scrittura per risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco di indirizzi IP e a una data di scadenza. 401 indica che la chiave è errata, revocata o scaduta; 403 indica che non è stata inviata alcuna chiave, che la chiave non ha accesso a questa risorsa o azione, oppure che la richiesta proviene da un indirizzo non incluso nel suo elenco IP; 404 su una route di sessione indica che la sessione non rientra nei workflow o negli stati previsti dalla chiave. Una chiave senza accesso ai media riceve gli URL di immagini, video e PDF come null, e una chiave senza permessi di scrittura sulle sessioni riceve link e token di sessione come null. Consulta https://docs.didit.me/console/api-keys.

Corpo

application/json

Crea un workflow lineare semplice. L'API converte internamente questo elenco di funzionalità in un grafo di workflow basato su nodi. Whitelist dei campi RIGIDA: qualsiasi chiave non presente in questo elenco (incluso workflow_type) viene rifiutata con un 400.

features
object[]
obbligatorio

Funzionalità di verifica in ordine di esecuzione. L'API collega ciascun elemento a quello successivo e aggiunge automaticamente un nodo di stato finale.

Minimum array length: 1
workflow_label
string
predefinito:ID Verification

Nome visualizzato per il workflow (massimo 50 caratteri). Il valore predefinito è "ID Verification" se omesso: impostalo sempre affinché i workflow rimangano distinguibili.

Maximum string length: 50
Esempio:

"Standard KYC"

is_default
boolean

Imposta questo workflow come predefinito per le nuove sessioni.

status
enum<string>

Ometti questo campo per creare un workflow pubblicato pronto per le sessioni. Usa draft solo quando vuoi salvare senza pubblicare.

Opzioni disponibili:
draft,
published
is_white_label_enabled
boolean
predefinito:false

Abilita la personalizzazione White label per le sessioni create con questo workflow.

is_desktop_allowed
boolean
predefinito:false

Consenti l'esecuzione del flusso di verifica sui browser desktop.

max_retry_attempts
integer
predefinito:3

Numero massimo di nuovi tentativi consentiti dopo una verifica rifiutata. 0 blocca l'utente dopo il primo rifiuto.

Intervallo richiesto: 0 <= x <= 10
retry_window_days
integer | null
predefinito:7

Finestra mobile in giorni utilizzata per contare i nuovi tentativi. null applica un limite complessivo.

Intervallo richiesto: 1 <= x <= 365
face_liveness_max_attempts
integer
predefinito:3

Numero massimo di invii per il rilevamento della vitalità per sessione. Valore predefinito 3: un tentativo iniziale più due nuovi tentativi. Questo valore viene copiato anche nei nodi di workflow generati per il rilevamento della vitalità e la stima dell'età, a meno che la configurazione a livello di funzionalità non lo sovrascriva.

Intervallo richiesto: 1 <= x <= 3
face_match_max_attempts
integer
predefinito:3

Numero massimo di invii per il confronto facciale per sessione. Valore predefinito 3: un tentativo iniziale più due nuovi tentativi. Questo valore viene copiato anche nei nodi di workflow generati per il confronto facciale, a meno che la configurazione a livello di funzionalità non lo sovrascriva.

Intervallo richiesto: 1 <= x <= 3
session_expiration_time
integer
predefinito:604800

Secondi prima della scadenza di una sessione non completata. Minimo 1 ora (3600), massimo 4 settimane (2419200).

Intervallo richiesto: 3600 <= x <= 2419200

Risposta

Workflow creato. Il corpo della risposta contiene l'INTERA configurazione del workflow — la stessa serializzazione non elaborata di VerificationSettings restituita da GET /v3/workflows/{settings_uuid}/ (~190 campi: ogni toggle di funzionalità, soglia, azione e il workflow_graph generato), non l'elemento sintetico dell'elenco. Salva lo uuid (esposto anche come workflow_id) per poterlo referenziare nelle successive chiamate di creazione della sessione. Nota: features è una stringa unita da " + " e i prezzi sono numeri JSON.

I campi sottostanti sono tipizzati; l'oggetto contiene inoltre ogni altra colonna della configurazione del workflow (attivazione delle funzionalità, soglie, azioni di avviso, documenti consentiti, callback) come proprietà aggiuntive. I campi non applicabili al workflow_type sono null.

uuid
string<uuid>

Identificativo per versione (settings_uuid). Ogni versione di un workflow ha il proprio.

workflow_id
string<uuid>

Identificatore stabile condiviso da tutte le versioni del workflow. Le sessioni create con esso utilizzano l'ultima versione pubblicata.

workflow_label
string

Nome visualizzato del workflow.

workflow_type
enum<string> | null

Modello di workflow. null per i workflow a grafo creati senza un modello.

Opzioni disponibili:
kyc,
kyb,
adaptive_age_verification,
biometric_authentication,
address_verification,
questionnaire_verification,
email_verification,
phone_verification,
null
is_default
boolean

Indica se questo è il workflow predefinito dell'applicazione.

is_archived
boolean

I workflow archiviati non possono avviare nuove sessioni.

version
integer

Numero di versione all'interno del workflow.

status
enum<string>

Le versioni in bozza sono modificabili; le versioni pubblicate sono immutabili e utilizzate per le nuove sessioni.

Opzioni disponibili:
draft,
published
published_at
string<date-time> | null

Quando è stata pubblicata questa versione. null per le bozze.

is_simple_workflow
boolean

true quando il workflow non presenta un workflow_graph personalizzato.

is_editable
boolean

true solo per le versioni draft.

workflow_url
string<uri>

URL pubblico che avvia una sessione con questo workflow.

workflow_graph
object | null

Struttura a grafo del workflow (nodi e archi). null per i workflow semplici.

features
string

Funzionalità abilitate unite con " + ", ad esempio "OCR + LIVENESS".

total_price
number | null

Prezzo per sessione; per i workflow a grafo, il percorso più costoso.

min_price
number | null

Prezzo del percorso più economico all'interno del workflow.

max_price
number | null

Prezzo del percorso più costoso all'interno del workflow.

special_add_on_prices
object | null

Prezzi delle funzionalità aggiuntive specifici per l'organizzazione, oppure null se non ne è impostato alcuno.

max_retry_attempts
integer

Nuovi tentativi consentiti dopo una verifica rifiutata.

retry_window_days
integer | null

Giorni durante i quali sono consentiti i nuovi tentativi.

session_expiration_time
integer

Secondi prima della scadenza di una sessione non completata.

questionnaire
object | null

Il questionario associato al workflow, o null.

kyb_role_settings
object[]

Impostazioni di verifica per ruolo per le persone chiave KYB.

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

Quali livelli di Firma elettronica possono essere utilizzati per firmare in questo momento. Verificalo prima di impostare signature_level. Restituito nei workflow kyc, kyb e a grafo.

is_bank_verification_enabled
boolean

Indica se un workflow semplice di KYC o KYB esegue la verifica bancaria. Viene eseguita dopo i passaggi di contatto (e la verifica della posizione geografica) e prima della validazione su database, dello screening AML e dell'analisi IP. La verifica bancaria non è ancora disponibile a livello generale: l'attivazione viene rifiutata ovunque non sia abilitata.

bank_verification_config
object

Impostazioni della verifica bancaria di un workflow semplice, con le stesse chiavi accettate da un nodo BANK_VERIFICATION (ad esempio bank_countries e bank_method_order). Le chiavi sconosciute vengono ignorate. Ogni chiave è facoltativa e una chiave assente mantiene il proprio valore predefinito, pertanto {} indica tutti i valori predefiniti. Consulta Impostazioni della verifica bancaria.

Esempio:
is_geolocation_enabled
boolean

Indica se un semplice workflow KYC esegue la verifica della posizione geografica. Viene eseguita dopo i passaggi di contatto e prima della verifica bancaria e della validazione su database. I workflow aziendali (KYB) non possono eseguirla.

geolocation_config
object

Impostazioni di verifica della posizione di un workflow semplice, con le stesse chiavi accettate da un nodo GEOLOCATION (ad esempio is_geolocation_geofencing_enabled e geolocation_max_attempts). Le chiavi sconosciute vengono ignorate. Ogni chiave è facoltativa e una chiave assente mantiene il valore predefinito, quindi {} indica tutti i valori predefiniti.

Esempio:
Ultima modifica il 7 novembre 2026