Passer au contenu principal
POST
cURL
Utilisez cet endpoint pour créer des workflows via l’API sans construire vous-même les nœuds du graphe de workflow. Envoyez un tableau features dans l’ordre dans lequel les utilisateurs doivent effectuer les vérifications. Didit le convertit en interne en workflow basé sur des nœuds et ajoute automatiquement l’étape finale indiquant le statut. Cet endpoint POST /v3/workflows/ ne crée que des workflows simples et linéaires, à partir d’une simple liste features. Pour le routage conditionnel et les branchements, Document AI, ainsi que les nœuds de refus et de décision, utilisez le format en graphe décrit ci-dessous (il alimente l’éditeur visuel de la console et les outils de workflow du Didit MCP). Consultez Configurations des fonctionnalités de workflow pour connaître chaque champ config accepté par chaque fonctionnalité.

Workflow KYC de base

Workflow de questionnaire

Créez d’abord le questionnaire avec POST /v3/questionnaires/. Utilisez ensuite le questionnaire_id renvoyé comme questionnaire_uuid.
L’ordre des fonctionnalités compte. Par exemple, placez OCR avant FACE_MATCH, NFC, DATABASE_VALIDATION, ou les contrôles AML sur les utilisateurs qui dépendent des données du document.

Référence de configuration des fonctionnalités

Chaque élément de features[] a la structure suivante :
L’objet config exact dépend de la fonctionnalité. Consultez la liste complète des champs, les valeurs par défaut, les paramètres obligatoires, les plages de valeurs et les exemples dans Configurations des fonctionnalités de workflow. Pour OCR, omettez config.documents_allowed, envoyez null ou envoyez {} pour autoriser tous les types de documents pris en charge. Ne l’incluez que si vous souhaitez restreindre le workflow à certains pays ou types de documents. Pour QUESTIONNAIRE, config.questionnaire_uuid est obligatoire.

Paramètres de workflow facultatifs

Vous pouvez inclure n’importe lequel de ces champs de premier niveau lors de la création d’un workflow pour contrôler le comportement des sessions. Ils sont tous facultatifs et prennent les valeurs par défaut du workflow lorsqu’ils sont omis.

Branchements et workflows à nœuds (graphe)

Une liste features linéaire ne permet pas d’exprimer « si X alors Y ». Pour les branchements conditionnels (refuser selon un statut, router selon un champ extrait, conditionner une étape à une correspondance), une étape de requête Document AI, ou des nœuds terminaux decline/decision, les workflows Didit utilisent un graphe de nœuds, c’est-à-dire la même structure que celle produite par le générateur visuel de la console.
Le moyen le plus simple de construire un workflow en graphe est le Didit MCP : demandez à un agent en langage courant (« après la vérification d’identité, si la profession est ≈ “Software Engineer”, ajoutez une étape de justificatif de fonds ») et il construit, valide et enregistre le graphe pour vous. La structure ci-dessous est celle que produisent ces outils (et la console).

Structure du graphe

Un graphe est un objet { start_node, nodes }. nodes est une association entre un identifiant de nœud et un nœud. Les arêtes sont implicites : chaque nœud pointe vers l’avant via next (inconditionnel) et/ou branches[].goto (conditionnel). start_node doit être un nœud de fonctionnalité. Les branches sont évaluées dans l’ordre, la première correspondance l’emporte ; un rules: [] vide correspond à la branche « else » de repli (placez-la en dernier). session_status: "Determine" décide automatiquement à partir des résultats combinés des fonctionnalités.
Chaque nœud de branche doit avoir une branche else explicite, c’est-à-dire une branche avec rules: [] qui route les sessions ne correspondant à aucune des conditions. Ne vous fiez pas au next du nœud de branche comme repli : un next seul s’affiche comme une arête ambiguë dans le générateur et est facile à oublier. Lorsque vous envoyez un nœud de branche avec un next et sans branche else, l’API convertit ce next en branche else explicite à votre place (ainsi { …, "branches": [<conditions>], "next": "liveness" } est enregistré comme branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]). Créez la branche else vous-même pour être explicite ; la conversion est un filet de sécurité, pas un substitut.

Règles de branchement et opérateurs

Chaque règle compare un champ à une valeur à l’aide d’un opérateur :
  • Champs désignent un résultat de fonctionnalité (kyc.status, aml.status, document_ai.status, face_match.score, …) ou une valeur extraite (kyc.full_name, kyc.age, kyc.nationality, kyc.extra_fields.profession, un champ Document AI document_ai.<key>, expected_details.*). Une branche ne peut lire qu’un champ dont la fonctionnalité a été exécutée sur tous les chemins qui y mènent.
  • Opérateurs : equals, not_equals, greater_than(_or_equals), less_than(_or_equals), contains, not_contains, in, not_in, is_empty, is_not_empty, regex, et fuzzy_match (champs de type chaîne uniquement ; nécessite un score de 0 à 100, soit un seuil de similarité, par exemple une profession présentant une similarité d’au moins 80% avec « Software Engineer »).

Brancher selon la raison pour laquelle la NFC n’a pas été exécutée

Après un nœud NFC, utilisez nfc.skip_reason avec equals ou in pour router les sessions selon la raison pour laquelle la lecture de la puce n’a pas eu lieu. Le champ possède ces sept valeurs stables :
  • USER_SKIPPED
  • DOCUMENT_WITHOUT_CHIP
  • CHIP_CERTIFICATE_UNAVAILABLE
  • DEVICE_WITHOUT_NFC
  • INTEGRATION_WITHOUT_NFC_ACCESS
  • MRZ_KEY_UNAVAILABLE
  • JPKI_UNAVAILABLE
Consultez Raisons de non-exécution NFC pour le sens de chaque valeur. Lorsque la NFC réussit, nfc.skip_reason vaut null : aucune règle equals ou in portant sur une raison de non-exécution ne correspond alors. Le champ est également résolu pour les nœuds NFC ignorés en raison d’une condition de garde. Cela inclut les cas où aucun rapport ni avertissement NFC n’existe, et les cas où allow_nfc_skip vaut false mais où la condition de garde liée au document ou à l’appareil empêche l’exécution de la NFC. Vous pouvez donc router ces sessions sans vous appuyer sur une entrée nfc_verifications[].
Les sessions enregistrées avant que la capacité NFC ne devienne à trois états peuvent avoir has_device_nfc_support: false. Une ancienne session web peut donc être résolue en DEVICE_WITHOUT_NFC au lieu de INTEGRATION_WITHOUT_NFC_ACCESS.
Ce graphe utilise equals lorsqu’une session est ignorée par l’utilisateur, in pour les omissions liées à une condition de garde ou à une capacité, et une branche else explicite pour une NFC réussie. La branche vient après le nœud NFC, et chaque destination pointe vers l’avant, vers un nœud terminal :
Pour exprimer « la NFC n’a pas été effectuée pour une raison connue », utilisez in avec les sept valeurs. Conservez une branche else explicite pour une NFC réussie (nfc.skip_reason: null) ainsi que pour toute valeur future que votre graphe ne reconnaît pas encore.

Document AI (par exemple justificatif de fonds)

Un nœud de fonctionnalité DOCUMENT_AI demande un ou plusieurs documents et extrait des champs nommés :
Chaque champ configuré devient une valeur utilisable dans une branche, document_ai.<key>, et le résultat de l’étape est document_ai.status. Définissez "is_full_name": true sur le champ qui contient le nom complet du titulaire du document. Sa valeur extraite est comparée au nom complet de l’identité vérifiée (le nom issu de l’OCR ou de la vérification d’identité, ou les détails attendus de la session), et document_ai_name_mismatch_action détermine ce qui se passe en cas de non-correspondance en dessous de document_ai_name_match_score_threshold. Cet indicateur est facultatif : un document peut ne marquer aucun champ, et au plus un champ par document peut le définir. Consultez Configurations des fonctionnalités de workflow → Document AI pour tous les champs de configuration Document AI.

Endpoints et cycle de vie du brouillon

La modification du graphe se fait par application et utilise les endpoints de la console et de gestion (Bearer utilisateur + read:workflows/write:workflows). Un graphe ne peut être modifié que sur une version brouillon, le cycle de vie est donc créer le brouillon → définir le graphe → publier :

Avertissements de validation

L’endpoint de validation renvoie { "is_valid": true, "graph": …, "warnings": [] }. Un avertissement est consultatif : le graphe est valide, il s’enregistre et il se publie même en présence d’avertissements. Chaque entrée indique le nœud de branchement et la branche concernés, afin qu’un créateur puisse repérer la condition exacte :
Un graphe invalide renvoie 400 avec errors et une liste warnings renvoyée dans la mesure du possible. Seules les erreurs (errors) empêchent l’enregistrement.

Exemple pratique : orienter les ingénieurs logiciels vers le justificatif de fonds

Après la vérification d’identité : si elle a été refusée, refuser la session ; si la profession ≈ “Software Engineer” du titulaire présente une similarité ≥80%, demander un justificatif de fonds ; puis prendre une décision finale.
Le nœud final utilise session_status: "Determine", qui décide automatiquement (approuver / refuser / en cours d’examen) à partir des fonctionnalités réellement exécutées sur la session. Ainsi, le chemin du justificatif de fonds et le chemin else aboutissent tous deux correctement, sans qu’aucune branche ne lise document_ai.status (qui n’existe pas sur le chemin où Document AI n’est pas exécuté). Rappel : une branche ne peut lire qu’un champ dont la fonctionnalité a été exécutée sur tous les chemins qui y mènent. Envoyez-le sous la forme { "graph": <above> } à l’endpoint …/workflow-graph/ (validez-le d’abord). Pour créer un nouveau workflow à partir de zéro, utilisez didit_workflow_set_graph du MCP ; pour modifier un workflow existant, utilisez didit_workflow_edit_graph (petites opérations, qui conserve les nœuds existants et les listes d’autorisation). Consultez le MCP Didit.

Autorisations

x-api-key
string
header
requis

La clé API de votre application, issue de Développeurs -> Clés API dans la Business Console. La clé principale dispose d'un accès complet. Une clé nommée peut être restreinte : aucun, lecture ou écriture par ressource, limitée à certains workflows ou aux sessions approuvées, à une liste d'adresses IP et à une date d'expiration. 401 signifie que la clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a été envoyée, que la clé n'a pas accès à cette ressource ou action, ou que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur une route de session signifie que la session est hors des workflows ou des statuts de la clé. Une clé sans accès aux médias reçoit les URL d'images, de vidéos et de PDF à null, et une clé sans accès en écriture aux sessions reçoit les liens et tokens de session à null. Voir https://docs.didit.me/console/api-keys.

Corps

application/json

Créez un workflow linéaire simple. L'API convertit en interne cette liste de fonctionnalités en un graphe de workflow basé sur des nœuds. Liste blanche de champs STRICTE : toute clé non répertoriée ici (y compris workflow_type) est rejetée avec une erreur 400.

features
object[]
requis

Fonctionnalités de vérification dans l'ordre d'exécution. L'API relie automatiquement chaque élément au suivant et ajoute un nœud de statut final.

Minimum array length: 1
workflow_label
string
défaut:ID Verification

Nom d'affichage du workflow (50 caractères maximum). La valeur par défaut est "ID Verification" lorsqu'il est omis — définissez-le toujours pour que les workflows restent faciles à distinguer.

Maximum string length: 50
Exemple:

"Standard KYC"

is_default
boolean

Définir ce workflow comme celui par défaut pour les nouvelles sessions.

status
enum<string>

Omettez ce champ pour créer un workflow publié et prêt pour les sessions. Utilisez draft uniquement si vous souhaitez enregistrer sans publier.

Options disponibles:
draft,
published
is_white_label_enabled
boolean
défaut:false

Activer la personnalisation en marque blanche pour les sessions créées avec ce workflow.

is_desktop_allowed
boolean
défaut:false

Autoriser l'exécution du flux de vérification sur les navigateurs sur ordinateur.

max_retry_attempts
integer
défaut:3

Nombre maximal de tentatives de réessai autorisées après une vérification refusée. 0 bloque l'utilisateur après le premier refus.

Plage requise: 0 <= x <= 10
retry_window_days
integer | null
défaut:7

Fenêtre glissante en jours utilisée pour compter les nouvelles tentatives. null applique une limite globale depuis le début.

Plage requise: 1 <= x <= 365
face_liveness_max_attempts
integer
défaut:3

Nombre maximal de soumissions de détection du vivant par session. Par défaut 3 : une tentative initiale plus deux nouvelles tentatives. Cette valeur est également copiée dans les nœuds de workflow de détection du vivant et d'estimation de l'âge générés, sauf si la configuration au niveau de la fonctionnalité la remplace.

Plage requise: 1 <= x <= 3
face_match_max_attempts
integer
défaut:3

Nombre maximal de soumissions de correspondance faciale par session. Par défaut 3 : une tentative initiale plus deux nouvelles tentatives. Cette valeur est également copiée dans les nœuds de workflow de correspondance faciale générés, sauf si la configuration au niveau de la fonctionnalité la remplace.

Plage requise: 1 <= x <= 3
session_expiration_time
integer
défaut:604800

Secondes avant l'expiration d'une session inachevée. Minimum 1 heure (3600), maximum 4 semaines (2419200).

Plage requise: 3600 <= x <= 2419200

Réponse

Workflow créé. Le corps de la réponse contient la configuration COMPLÈTE du workflow — la même sérialisation brute VerificationSettings renvoyée par GET /v3/workflows/{settings_uuid}/ (~190 champs : chaque activation de fonctionnalité, seuil, action et le workflow_graph généré), et non l'élément de liste compact. Enregistrez l'uuid (également exposé sous le nom workflow_id) afin de pouvoir le référencer lors de futurs appels de création de session. Remarque : features est une chaîne jointe par " + " et les prix sont des nombres JSON.

Les champs ci-dessous sont typés ; l'objet contient également toutes les autres colonnes de la configuration du workflow (activation des fonctionnalités, seuils, actions d'avertissement, documents autorisés, rappels) sous forme de propriétés supplémentaires. Les champs qui ne s'appliquent pas au workflow_type sont null.

uuid
string<uuid>

Identifiant par version (settings_uuid). Chaque version d'un workflow possède le sien.

workflow_id
string<uuid>

Identifiant stable partagé par toutes les versions du workflow. Les sessions créées avec celui-ci utilisent la dernière version publiée.

workflow_label
string

Nom d'affichage du workflow.

workflow_type
enum<string> | null

Modèle de workflow. null pour les workflows sous forme de graphe créés sans modèle.

Options disponibles:
kyc,
kyb,
adaptive_age_verification,
biometric_authentication,
address_verification,
questionnaire_verification,
email_verification,
phone_verification,
null
is_default
boolean

Indique s'il s'agit du workflow par défaut de l'application.

is_archived
boolean

Les workflows archivés ne peuvent pas démarrer de nouvelles sessions.

version
integer

Numéro de version au sein du workflow.

status
enum<string>

Les versions de brouillon sont modifiables ; les versions publiées sont immuables et utilisées pour les nouvelles sessions.

Options disponibles:
draft,
published
published_at
string<date-time> | null

Date et heure auxquelles cette version a été publiée. null pour les brouillons.

is_simple_workflow
boolean

true lorsque le workflow ne comporte aucun workflow_graph personnalisé.

is_editable
boolean

true uniquement pour les versions draft.

workflow_url
string<uri>

URL publique qui démarre une session avec ce workflow.

workflow_graph
object | null

Structure en graphe du workflow (nœuds et arêtes). null pour les workflows simples.

features
string

Fonctionnalités activées jointes par " + ", par exemple "OCR + LIVENESS".

total_price
number | null

Prix par session ; pour les workflows de graphe, le parcours le plus cher.

min_price
number | null

Prix du parcours le moins cher dans le workflow.

max_price
number | null

Prix du parcours le plus cher dans le workflow.

special_add_on_prices
object | null

Prix des modules complémentaires spécifiques à l'organisation, ou null si aucun n'est défini.

max_retry_attempts
integer

Réessais autorisés après une vérification refusée.

retry_window_days
integer | null

Nombre de jours pendant lesquels les nouvelles tentatives sont autorisées.

session_expiration_time
integer

Secondes avant l'expiration d'une session inachevée.

questionnaire
object | null

Le questionnaire associé au workflow, ou null.

kyb_role_settings
object[]

Paramètres de vérification par rôle pour les personnes clés KYB.

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

Quels niveaux de Signature électronique peuvent signer actuellement. Vérifiez-le avant de définir signature_level. Renvoyé sur les workflows kyc, kyb et de graphe.

is_bank_verification_enabled
boolean

Indique si un workflow KYC ou KYB simple exécute la vérification bancaire. Elle s'exécute après les étapes de contact (et la vérification de localisation) et avant la validation en base de données, le filtrage AML et l'analyse IP. La vérification bancaire n'est pas encore disponible pour tous : son activation est refusée partout où elle n'est pas activée.

bank_verification_config
object

Paramètres de vérification bancaire d'un workflow simple, avec les mêmes clés qu'un nœud BANK_VERIFICATION (par exemple bank_countries et bank_method_order). Les clés inconnues sont ignorées. Chaque clé est optionnelle et une clé absente conserve sa valeur par défaut, {} désigne donc toutes les valeurs par défaut. Voir Paramètres de vérification bancaire.

Exemple:
is_geolocation_enabled
boolean

Indique si un workflow KYC simple exécute la vérification de localisation. Elle s'exécute après les étapes de contact et avant la vérification bancaire et la validation en base de données. Les workflows d'entreprise (KYB) ne peuvent pas l'exécuter.

geolocation_config
object

Paramètres de vérification de localisation d'un workflow simple, avec les mêmes clés qu'un nœud GEOLOCATION (par exemple is_geolocation_geofencing_enabled et geolocation_max_attempts). Les clés inconnues sont ignorées. Chaque clé est facultative et une clé absente conserve sa valeur par défaut, {} correspond donc à toutes les valeurs par défaut.

Exemple:
Dernière modification le 7 novembre 2026