Zum Hauptinhalt springen
POST
cURL
Verwenden Sie diesen Endpoint, um Workflows über die API zu erstellen, ohne selbst Workflow-Graph-Knoten aufzubauen. Senden Sie ein features-Array in der Reihenfolge, in der Benutzer die Prüfungen durchlaufen sollen. Didit wandelt es intern in einen knotenbasierten Workflow um und fügt automatisch den abschließenden Statusschritt hinzu. Dieser Endpoint POST /v3/workflows/ erstellt nur einfache, lineare Workflows, also eine flache features-Liste. Für Verzweigungen, bedingte Weiterleitung, Document AI sowie Ablehnungs- und Entscheidungsknoten verwenden Sie das Graph-Format, das unten dokumentiert ist. Es bildet die Grundlage für den visuellen Builder in der Konsole und die Workflow-Tools von Didit MCP. Alle config-Felder, die von den einzelnen Funktionen akzeptiert werden, finden Sie unter Workflow-Funktionskonfigurationen.

Basis-KYC-Workflow

Fragebogen-Workflow

Erstellen Sie zuerst den Fragebogen mit POST /v3/questionnaires/. Verwenden Sie danach die zurückgegebene questionnaire_id als questionnaire_uuid.
Die Reihenfolge der Funktionen ist wichtig. Platzieren Sie zum Beispiel OCR vor FACE_MATCH, NFC, DATABASE_VALIDATION oder vor AML-Prüfungen für Benutzer, die auf Dokumentdaten angewiesen sind.

Referenz zur Funktionskonfiguration

Jedes Element in features[] hat folgende Struktur:
Das genaue config-Objekt hängt von der Funktion ab. Die vollständige Feldliste, Standardwerte, erforderlichen Einstellungen, Wertebereiche und Beispiele finden Sie unter Workflow-Funktionskonfigurationen. Bei OCR lassen Sie config.documents_allowed weg, senden null oder {}, um jeden unterstützten Dokumenttyp zuzulassen. Geben Sie es nur an, wenn Sie den Workflow auf bestimmte Länder oder Dokumenttypen beschränken möchten. Bei QUESTIONNAIRE ist config.questionnaire_uuid erforderlich.

Optionale Workflow-Einstellungen

Sie können beim Erstellen eines Workflows eines oder mehrere der folgenden Felder auf oberster Ebene angeben, um das Sitzungsverhalten zu steuern. Alle sind optional; werden sie weggelassen, gelten die Standardwerte des Workflows.

Verzweigungen und knotenbasierte Workflows (Graph)

Eine lineare features-Liste kann keine Bedingung der Form „wenn X, dann Y“ abbilden. Für bedingte Verzweigungen (Ablehnung bei einem Status, Weiterleitung anhand eines extrahierten Feldes, Freigabe eines Schritts nur bei einer Übereinstimmung), einen Document-AI-Anforderungsschritt oder terminale Ablehnungs-/Entscheidungsknoten verwenden Didit-Workflows einen Knotengraphen, also dieselbe Struktur, die der visuelle Builder der Konsole erzeugt.
Der einfachste Weg, einen Graph-Workflow zu erstellen, ist das Didit MCP: Bitten Sie einen Agenten in natürlicher Sprache („Wenn nach der Ausweisverifizierung der Beruf ≈ „Software Engineer“ ist, füge einen Kapitalnachweis-Schritt hinzu“). Er erstellt, validiert und speichert den Graphen für Sie. Die folgende Struktur ist das, was diese Tools (und die Konsole) erzeugen.

Graph-Struktur

Ein Graph ist { start_node, nodes }. nodes ist eine Zuordnung von Knoten-ID zu Knoten. Kanten sind implizit: Jeder Knoten verweist vorwärts über next (unbedingt) und/oder branches[].goto (bedingt). start_node muss ein Funktionsknoten sein. Verzweigungen werden der Reihe nach ausgewertet, der erste Treffer gewinnt. Ein leeres rules: [] ist die Auffangregel „else“ (sie steht immer zuletzt). session_status: "Determine" entscheidet automatisch anhand der kombinierten Ergebnisse der Funktionen.
Jeder Verzweigungsknoten muss einen expliziten else-Zweig haben: einen Zweig mit rules: [], der Sitzungen weiterleitet, auf die keine der Bedingungen zutrifft. Verlassen Sie sich nicht auf das next des Verzweigungsknotens als Ausweichpfad. Ein bloßes next wird im Builder als mehrdeutige Kante dargestellt und wird leicht vergessen. Wenn Sie einen Verzweigungsknoten mit next und ohne else-Zweig senden, wandelt die API dieses next für Sie in einen expliziten else-Zweig um. So wird { …, "branches": [<conditions>], "next": "liveness" } als branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }] gespeichert. Erstellen Sie den else-Zweig selbst, um explizit zu sein. Die Umwandlung ist ein Sicherheitsnetz, kein Ersatz dafür.

Verzweigungsregeln und Operatoren

Jede Regel vergleicht ein Feld mit einem Wert über einen Operator:
  • Felder benennen das Ergebnis einer Funktion (kyc.status, aml.status, document_ai.status, face_match.score, …) oder einen extrahierten Wert (kyc.full_name, kyc.age, kyc.nationality, kyc.extra_fields.profession, ein Document-AI-Feld document_ai.<key>, expected_details.*). Eine Verzweigung darf nur ein Feld lesen, dessen Funktion auf jedem Pfad, der zu ihr führt, ausgeführt wurde.
  • Operatoren: equals, not_equals, greater_than(_or_equals), less_than(_or_equals), contains, not_contains, in, not_in, is_empty, is_not_empty, regex und fuzzy_match (nur für Zeichenkettenfelder; erfordert einen score von 0–100, also einen Ähnlichkeitsschwellenwert, z. B. der Beruf ist zu mindestens 80 % „Software Engineer“ ähnlich).

Verzweigung nach dem Grund, warum NFC nicht ausgeführt wurde

Verwenden Sie nach einem NFC-Knoten nfc.skip_reason mit equals oder in, um Sitzungen danach weiterzuleiten, warum das Auslesen des Chips nicht stattgefunden hat. Das Feld hat diese sieben stabilen Werte:
  • USER_SKIPPED
  • DOCUMENT_WITHOUT_CHIP
  • CHIP_CERTIFICATE_UNAVAILABLE
  • DEVICE_WITHOUT_NFC
  • INTEGRATION_WITHOUT_NFC_ACCESS
  • MRZ_KEY_UNAVAILABLE
  • JPKI_UNAVAILABLE
Was jeder Wert bedeutet, steht unter Gründe für das Überspringen von NFC. Wenn NFC erfolgreich ist, ist nfc.skip_reason null, sodass weder eine equals- noch eine in-Regel für einen Überspringgrund zutrifft. Das Feld wird auch für NFC-Knoten aufgelöst, die durch ein Gate übersprungen wurden. Dazu gehören Fälle, in denen kein NFC-Bericht und keine Warnung existiert, sowie Fälle, in denen allow_nfc_skip den Wert false hat, das Dokument- oder Geräte-Gate das Ausführen von NFC aber verhindert. Sie können diese Sitzungen daher weiterleiten, ohne sich auf einen Eintrag nfc_verifications[] zu verlassen.
Sitzungen, die gespeichert wurden, bevor die NFC-Fähigkeit dreiwertig wurde, können has_device_nfc_support: false haben. Eine ältere Web-Sitzung kann daher zu DEVICE_WITHOUT_NFC statt zu INTEGRATION_WITHOUT_NFC_ACCESS aufgelöst werden.
Dieser Graph verwendet equals für das Überspringen durch den Benutzer, in für das Überspringen aufgrund eines Gates oder fehlender NFC-Fähigkeit und einen expliziten else-Zweig für erfolgreiches NFC. Die Verzweigung folgt auf den NFC-Knoten, und jedes Ziel verweist vorwärts auf einen Endknoten:
Um auszudrücken, dass NFC aus keinem der bekannten Gründe nicht ausgeführt wurde, verwenden Sie in mit allen sieben Werten. Behalten Sie einen expliziten else-Zweig für erfolgreiches NFC (nfc.skip_reason: null) und für jeden künftigen Wert bei, den Ihr Graph noch nicht kennt.

Document AI (z. B. Kapitalnachweis)

Ein DOCUMENT_AI-Funktionsknoten fordert ein oder mehrere Dokumente an und extrahiert benannte Felder:
Jedes konfigurierte Feld wird zu einem verzweigbaren Wert document_ai.<key>, und das Ergebnis des Schritts ist document_ai.status. Setzen Sie "is_full_name": true für das Feld, das den vollständigen Namen des Dokumentinhabers enthält. Sein extrahierter Wert wird mit dem vollständigen Namen der verifizierten Identität verglichen (dem Namen aus OCR bzw. der Ausweisverifizierung oder dem vollständigen Namen aus den erwarteten Sitzungsangaben). document_ai_name_mismatch_action legt fest, was bei einer Abweichung unterhalb von document_ai_name_match_score_threshold geschieht. Die Markierung ist optional: Ein Dokument darf kein Feld markieren, und höchstens ein Feld pro Dokument darf sie setzen. Alle Konfigurationsfelder für Document AI finden Sie unter Workflow-Funktionskonfigurationen → Document AI.

Endpoints und Entwurfs-Lebenszyklus

Die Bearbeitung von Graphen erfolgt pro Anwendung über die Konsolen- bzw. Management-Endpoints (Benutzer-Bearer + read:workflows/write:workflows). Ein Graph kann nur in einer Entwurfsversion bearbeitet werden, daher lautet der Lebenszyklus Entwurf erstellen → Graph festlegen → veröffentlichen:

Validierungswarnungen

Der Validierungs-Endpoint antwortet mit { "is_valid": true, "graph": …, "warnings": [] }. Eine Warnung ist rein informativ: Der Graph ist gültig, er wird gespeichert und veröffentlicht, auch wenn Warnungen vorliegen. Jeder Eintrag nennt den Verzweigungsknoten und den Zweig, auf den er sich bezieht, damit ein Ersteller genau die betreffende Bedingung finden kann:
Ein ungültiger Graph führt zu einer 400-Antwort mit errors und einer nach bestem Bemühen erstellten warnings-Liste. Nur errors verhindern das Speichern.

Praxisbeispiel: Softwareingenieure zum Kapitalnachweis leiten

Nach der Ausweisverifizierung: Wurde sie abgelehnt, lehnen Sie die Sitzung ab; ist der Beruf des Inhabers ≈ “Software Engineer” (≥80% Übereinstimmung), fordern Sie ein Dokument zum Kapitalnachweis an; treffen Sie dann eine abschließende Entscheidung.
Der letzte Knoten verwendet session_status: "Determine", der automatisch entscheidet (genehmigt / abgelehnt / in Prüfung) anhand der Funktionen, die bei der Sitzung tatsächlich ausgeführt wurden. So werden sowohl der Pfad mit dem Kapitalnachweis als auch der Else-Pfad korrekt aufgelöst, ohne dass ein Zweig document_ai.status liest. Dieses Feld existiert auf dem Pfad nicht, der Document AI überspringt. Beachten Sie: Ein Zweig darf nur ein Feld lesen, dessen Funktion auf jedem Pfad zu ihm ausgeführt wurde. Senden Sie ihn als { "graph": <above> } an den Endpoint …/workflow-graph/ (validieren Sie zuerst). Um einen neuen Workflow von Grund auf zu erstellen, verwenden Sie didit_workflow_set_graph aus dem MCP. Um einen bestehenden Workflow zu ändern, verwenden Sie didit_workflow_edit_graph (kleine Operationen, die die vorhandenen Knoten und Allow-Listen beibehalten). Siehe Didit MCP.

Autorisierungen

x-api-key
string
header
erforderlich

Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese- oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde, der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als null. Siehe https://docs.didit.me/console/api-keys.

Body

application/json

Erstellen Sie einen einfachen linearen Workflow. Die API wandelt diese Funktionsliste intern in einen knotenbasierten Workflow-Graphen um. STRIKTE Feld-Whitelist: Jeder hier nicht aufgeführte Schlüssel (einschließlich workflow_type) wird mit 400 abgelehnt.

features
object[]
erforderlich

Verifizierungsfunktionen in Ausführungsreihenfolge. Die API verknüpft jedes Element mit dem nächsten und fügt automatisch einen abschließenden Statusknoten hinzu.

Minimum array length: 1
workflow_label
string
Standard:ID Verification

Anzeigename für den Workflow (max. 50 Zeichen). Standardmäßig "ID Verification", wenn weggelassen – immer angeben, damit Workflows unterscheidbar bleiben.

Maximum string length: 50
Beispiel:

"Standard KYC"

is_default
boolean

Legen Sie diesen Workflow als Standard für neue Sitzungen fest.

status
enum<string>

Lassen Sie dieses Feld weg, um einen veröffentlichten Workflow zu erstellen, der für Sitzungen bereit ist. Verwenden Sie draft nur, wenn Sie speichern möchten, ohne zu veröffentlichen.

Verfügbare Optionen:
draft,
published
is_white_label_enabled
boolean
Standard:false

White-Label-Anpassung für Sitzungen aktivieren, die mit diesem Workflow erstellt wurden.

is_desktop_allowed
boolean
Standard:false

Ermöglicht die Ausführung des Verifizierungs-Workflows in Desktop-Browsern.

max_retry_attempts
integer
Standard:3

Maximale Anzahl an Wiederholungsversuchen, die nach einer abgelehnten Verifizierung zulässig sind. 0 blockiert den Benutzer nach der ersten Ablehnung.

Erforderlicher Bereich: 0 <= x <= 10
retry_window_days
integer | null
Standard:7

Gleitendes Zeitfenster in Tagen zur Zählung der Wiederholungsversuche. null erzwingt ein Limit für den gesamten Zeitraum.

Erforderlicher Bereich: 1 <= x <= 365
face_liveness_max_attempts
integer
Standard:3

Maximale Anzahl an Liveness-Übermittlungen pro Sitzung. Standardwert 3: ein erster Versuch plus zwei Wiederholungsversuche. Dieser Wert wird auch in generierte Liveness- und Altersschätzungs-Workflow-Knoten kopiert, sofern er nicht durch die Konfiguration auf Funktionsebene überschrieben wird.

Erforderlicher Bereich: 1 <= x <= 3
face_match_max_attempts
integer
Standard:3

Maximale Anzahl an Gesichtsabgleich-Übermittlungen pro Sitzung. Standardwert 3: ein erster Versuch plus zwei Wiederholungsversuche. Dieser Wert wird auch in generierte Gesichtsabgleich-Workflow-Knoten kopiert, sofern er nicht durch die Konfiguration auf Funktionsebene überschrieben wird.

Erforderlicher Bereich: 1 <= x <= 3
session_expiration_time
integer
Standard:604800

Sekunden, bis eine nicht abgeschlossene Sitzung abläuft. Mindestens 1 Stunde (3600), maximal 4 Wochen (2419200).

Erforderlicher Bereich: 3600 <= x <= 2419200

Antwort

Workflow erstellt. Der Antwort-Body enthält die VOLLSTÄNDIGE Workflow-Konfiguration – dieselbe unveränderte VerificationSettings-Serialisierung, die von GET /v3/workflows/{settings_uuid}/ zurückgegeben wird (~190 Felder: jede Funktionseinstellung, Schwellenwert, jede Aktion und der generierte workflow_graph), nicht das kompakte Listenelement. Speichern Sie die uuid (auch als workflow_id bereitgestellt), damit Sie bei späteren Aufrufen zur Sitzungserstellung darauf verweisen können. Hinweis: features ist ein mit " + " verknüpfter String und Preise sind JSON-Zahlen.

Die folgenden Felder sind typisiert; das Objekt enthält außerdem jede andere Spalte der Workflow-Konfiguration (Funktionsschalter, Schwellenwerte, Warnungsaktionen, zulässige Dokumente, Callbacks) als zusätzliche Eigenschaften. Felder, die für den workflow_type nicht gelten, sind null.

uuid
string<uuid>

Versionsspezifische Kennung (settings_uuid). Jede Version eines Workflows hat ihre eigene.

workflow_id
string<uuid>

Stabiler Identifikator, der von jeder Version des Workflows geteilt wird. Damit erstellte Sitzungen verwenden die neueste veröffentlichte Version.

workflow_label
string

Anzeigename des Workflows.

workflow_type
enum<string> | null

Workflow-Vorlage. null für Graph-Workflows, die ohne Vorlage erstellt wurden.

Verfügbare Optionen:
kyc,
kyb,
adaptive_age_verification,
biometric_authentication,
address_verification,
questionnaire_verification,
email_verification,
phone_verification,
null
is_default
boolean

Gibt an, ob dies der Standard-Workflow der Anwendung ist.

is_archived
boolean

Archivierte Workflows können keine neuen Sitzungen starten.

version
integer

Versionsnummer innerhalb des Workflows.

status
enum<string>

Entwurfsversionen können bearbeitet werden; veröffentlichte Versionen sind unveränderlich und werden für neue Sitzungen verwendet.

Verfügbare Optionen:
draft,
published
published_at
string<date-time> | null

Wann diese Version veröffentlicht wurde. null für Entwürfe.

is_simple_workflow
boolean

true, wenn der Workflow keinen benutzerdefinierten workflow_graph hat.

is_editable
boolean

true nur für draft-Versionen.

workflow_url
string<uri>

Öffentliche URL, die eine Sitzung mit diesem Workflow startet.

workflow_graph
object | null

Graphstruktur des Workflows (Knoten und Kanten). null für einfache Workflows.

features
string

Aktivierte Funktionen, verbunden mit " + ", zum Beispiel "OCR + LIVENESS".

total_price
number | null

Preis pro Sitzung; bei Graph-Workflows der teuerste Pfad.

min_price
number | null

Preis des günstigsten Pfads durch den Workflow.

max_price
number | null

Preis des teuersten Pfads durch den Workflow.

special_add_on_prices
object | null

Organisationsspezifische Zusatzpreise oder null, wenn keine festgelegt sind.

max_retry_attempts
integer

Zulässige Wiederholungsversuche nach einer abgelehnten Verifizierung.

retry_window_days
integer | null

Tage, während derer Wiederholungsversuche zulässig sind.

session_expiration_time
integer

Sekunden, bis eine nicht abgeschlossene Sitzung abläuft.

questionnaire
object | null

Der an den Workflow angehängte Fragebogen oder null.

kyb_role_settings
object[]

Verifizierungseinstellungen pro Rolle für KYB-Schlüsselpersonen.

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

Welche E-Signatur-Stufen derzeit signieren können. Prüfen Sie dies, bevor Sie signature_level festlegen. Wird bei kyc-, kyb- und Graph-Workflows zurückgegeben.

is_bank_verification_enabled
boolean

Gibt an, ob ein einfacher KYC- oder KYB-Workflow die Bankverifizierung ausführt. Sie läuft nach den Kontaktschritten (und der Standortverifizierung) sowie vor der Datenbankvalidierung, AML und IP-Analyse. Die Bankverifizierung ist noch nicht allgemein verfügbar: Ihre Aktivierung wird überall abgelehnt, wo sie nicht freigeschaltet ist.

bank_verification_config
object

Bankverifizierungseinstellungen eines einfachen Workflows mit denselben Schlüsseln, die ein BANK_VERIFICATION-Knoten akzeptiert (z. B. bank_countries und bank_method_order). Unbekannte Schlüssel werden verworfen. Jeder Schlüssel ist optional, und ein fehlender Schlüssel behält seinen Standardwert bei, sodass {} für alle Standardwerte steht. Siehe Bankverifizierungseinstellungen.

Beispiel:
is_geolocation_enabled
boolean

Gibt an, ob ein einfacher KYC-Workflow die Standortverifizierung ausführt. Sie läuft nach den Kontaktschritten sowie vor der Bankverifizierung und Datenbankvalidierung. Unternehmens-Workflows (KYB) können sie nicht ausführen.

geolocation_config
object

Standortverifizierungs-Einstellungen eines einfachen Workflows mit denselben Schlüsseln, die ein GEOLOCATION-Knoten akzeptiert (zum Beispiel is_geolocation_geofencing_enabled und geolocation_max_attempts). Unbekannte Schlüssel werden verworfen. Jeder Schlüssel ist optional und ein fehlender Schlüssel behält seinen Standardwert, sodass {} alle Standardwerte bedeutet.

Beispiel:
Zuletzt geändert am 7. November 2026