> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow per API erstellen: KYC-Flow aufbauen

> Didit-Workflow programmatisch per API erstellen, mit geordneten Funktionen. KYC, KYB, AML und Biometrie in einem Ablauf. Pay-per-Call, keine Verträge.



API-Prompt zum Erstellen eines Workflows
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\`Create a simple Didit workflow through the Management API.

Endpoint:
POST https://verification.didit.me/v3/workflows/

Authentication:
Use the x-api-key header with my Didit API key.

Requirements:
\- Use the simple v3 API shape with features.
\- Send features in the exact order users should complete them.
\- Do not send workflow_graph, branches, actions, webhooks, or conditional logic.
\- Didit will convert the features array into a linear node-based workflow and add the final status step automatically.
\- Use uppercase feature values such as OCR, LIVENESS, FACE_MATCH, AML, QUESTIONNAIRE, EMAIL_VERIFICATION, PHONE_VERIFICATION, or PROOF_OF_ADDRESS.
\- Configure each feature with the fields from /management-api/workflows/feature-configs.
\- For an OCR feature, omit config.documents_allowed or send an empty object to allow every supported document type. Send config.documents_allowed only to restrict the allowed documents.
\- Put dependency features first. For example, put OCR before FACE_MATCH, NFC, DATABASE_VALIDATION, or user AML checks that depend on document data.
\- For a QUESTIONNAIRE feature, first create the questionnaire with POST /v3/questionnaires/ and use the returned questionnaire_id as config.questionnaire_uuid.
\- Store the workflow uuid returned by the response. Use it as workflow_id when creating sessions and as settings_uuid when updating this workflow.

Example KYC request body:
\{
"workflow_label": "Standard KYC",
"features": [
\{
  "feature": "OCR",
  "config": {
    "documents_allowed": {
      "USA": {
        "DL": {
          "enabled": 1,
          "sides": 2
        }
      }
    },
    "duplicated_user_action": "REVIEW"
  }
},
\{
  "feature": "LIVENESS",
  "config": {
    "face_liveness_method": "PASSIVE"
  }
},
\{
  "feature": "FACE_MATCH"
}
]
}

Example questionnaire workflow body:
\{
"workflow_label": "Source of Funds",
"features": [
\{
  "feature": "QUESTIONNAIRE",
  "config": {
    "questionnaire_uuid": "11111111-2222-3333-4444-555555555555",
    "review_questionnaire_manually": true
  }
}
]
}

Build the API call, handle validation errors, and return the workflow uuid from the response.`

\</pre>



      
      

Einfügen in

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](#verzweigungen-und-knotenbasierte-workflows-graph)**, das unten dokumentiert ist. Es bildet die Grundlage für den visuellen Builder in der Konsole und die Workflow-Tools von [Didit MCP](https://docs.didit.me/de/integration/mcp/overview.md).Alle `config`-Felder, die von den einzelnen Funktionen akzeptiert werden, finden Sie unter [Workflow-Funktionskonfigurationen](https://docs.didit.me/de/management-api/workflows/feature-configs.md).## Basis-KYC-Workflow```json theme={null}
{
  "workflow_label": "Standard KYC",
  "features": [
    {
      "feature": "OCR",
      "config": {
        "documents_allowed": {
          "USA": {
            "DL": {
              "enabled": 1,
              "sides": 2
            }
          }
        },
        "duplicated_user_action": "REVIEW"
      }
    },
    {
      "feature": "LIVENESS",
      "config": {
        "face_liveness_method": "PASSIVE"
      }
    },
    {
      "feature": "FACE_MATCH"
    }
  ]
}
```## Fragebogen-WorkflowErstellen Sie zuerst den Fragebogen mit `POST /v3/questionnaires/`. Verwenden Sie danach die zurückgegebene `questionnaire_id` als `questionnaire_uuid`.```json theme={null}
{
  "workflow_label": "Source of Funds",
  "features": [
    {
      "feature": "QUESTIONNAIRE",
      "config": {
        "questionnaire_uuid": "11111111-2222-3333-4444-555555555555",
        "review_questionnaire_manually": true
      }
    }
  ]
}
```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 FunktionskonfigurationJedes Element in `features[]` hat folgende Struktur:```json theme={null}
{
  "feature": "OCR",
  "label": "ID Verification",
  "config": {}
}
```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](https://docs.didit.me/de/management-api/workflows/feature-configs.md).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-EinstellungenSie 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.| Feld | Typ | Beschreibung |
| - | - | - |
| `is_white_label_enabled` | Boolean | Aktiviert die White-Label-Anpassung für Sitzungen, die mit diesem Workflow erstellt werden. Standard `false`. |
| `is_desktop_allowed` | Boolean | Erlaubt, dass der Verifizierungsablauf in Desktop-Browsern ausgeführt wird. Standard `false`. |
| `max_retry_attempts` | Ganzzahl (0–10) | Maximale Anzahl an Wiederholungsversuchen nach einer abgelehnten Verifizierung. `0` sperrt den Benutzer nach der ersten Ablehnung. Standard `3`. |
| `retry_window_days` | Ganzzahl (1–365) oder `null` | Gleitendes Zeitfenster in Tagen, mit dem Wiederholungsversuche gezählt werden (`null` = Limit für die gesamte Zeit). Standard `7`. |
| `session_expiration_time` | Ganzzahl (3600–2419200) | Sekunden, nach denen eine nicht abgeschlossene Sitzung abläuft. Minimum 1 Stunde, Maximum 4 Wochen. Standard `604800` (7 Tage). |
| `response_attributes` | Objekt oder `null` | Begrenzt die Felder, die für jede Funktion zurückgegeben werden, zum Beispiel `{"id_verifications": ["full_name", "document_number"], "face_matches": null}`. `null` oder ein fehlender Schlüssel gibt alle Felder zurück. Eine leere Liste gibt nur `status`, `warnings`, `node_id`, `is_nfc_skipped` und `skip_reason` zurück; alle anderen Felder werden als `null` zurückgegeben. |```json theme={null}
{
  "workflow_label": "Standard KYC",
  "is_white_label_enabled": true,
  "is_desktop_allowed": true,
  "max_retry_attempts": 5,
  "retry_window_days": 14,
  "session_expiration_time": 86400,
  "features": [
    { "feature": "OCR" },
    { "feature": "LIVENESS" },
    { "feature": "FACE_MATCH" }
  ]
}
```## 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.> [!NOTE]
>
> Der einfachste Weg, einen Graph-Workflow zu erstellen, ist das **[Didit MCP](https://docs.didit.me/de/integration/mcp/overview.md)**: 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-StrukturEin 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).| Knotentyp | Struktur |
| - | - |
| `feature` | `{ "node_type": "feature", "feature": "OCR", "config": {…}, "next": "<id>", "branches": [] }` |
| `branch` | `{ "node_type": "branch", "branches": [ { "id", "logic": "and"\|"or", "rules": [<rule>], "goto": "<id>" } ], "next": "<fallback id>" }` |
| `status` (Endknoten) | `{ "node_type": "status", "session_status": "Approved"\|"Declined"\|"In Review"\|"Determine" }` |
| `action` | `{ "node_type": "action", "actions": [ { "type": "add_tag"\|"add_review"\|… } ], "next": "<id>" }` |
| `webhook` | `{ "node_type": "webhook", "config": { "url", "method" }, "branches": [], "next": "<id>" }` |`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.> [!WARNING]
>
> **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 OperatorenJede Regel vergleicht ein **Feld** mit einem **Wert** über einen **Operator**:```json theme={null}
{ "field": "kyc.extra_fields.profession", "operator": "fuzzy_match", "value": "Software Engineer", "score": 80 }
```- **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 wurdeVerwenden 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](https://docs.didit.me/de/core-technology/nfc-verification/warnings-nfc-verification.md#gründe-für-das-überspringen). 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.> [!NOTE]
>
> 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:```json theme={null}
{
  "start_node": "ocr",
  "nodes": {
    "ocr": {
      "node_type": "feature",
      "feature": "OCR",
      "next": "nfc"
    },
    "nfc": {
      "node_type": "feature",
      "feature": "NFC",
      "config": { "allow_nfc_skip": false },
      "next": "route_nfc"
    },
    "route_nfc": {
      "node_type": "branch",
      "branches": [
        {
          "id": "user_skipped",
          "logic": "and",
          "rules": [
            { "field": "nfc.skip_reason", "operator": "equals", "value": "USER_SKIPPED" }
          ],
          "goto": "manual_review"
        },
        {
          "id": "nfc_unavailable",
          "logic": "and",
          "rules": [
            {
              "field": "nfc.skip_reason",
              "operator": "in",
              "value": [
                "DOCUMENT_WITHOUT_CHIP",
                "CHIP_CERTIFICATE_UNAVAILABLE",
                "DEVICE_WITHOUT_NFC",
                "INTEGRATION_WITHOUT_NFC_ACCESS",
                "MRZ_KEY_UNAVAILABLE",
                "JPKI_UNAVAILABLE"
              ]
            }
          ],
          "goto": "manual_review"
        },
        {
          "id": "else",
          "logic": "and",
          "rules": [],
          "goto": "approved"
        }
      ]
    },
    "manual_review": { "node_type": "status", "session_status": "In Review" },
    "approved": { "node_type": "status", "session_status": "Approved" }
  }
}
```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:```json theme={null}
{
  "node_type": "feature",
  "feature": "DOCUMENT_AI",
  "label": "Proof of Funds",
  "config": {
    "document_ai_documents": [
      {
        "document_key": "proof_of_funds",
        "title": "Proof of Funds",
        "description": "Upload a recent bank statement.",
        "fields": [
          {
            "key": "account_holder",
            "name": "Account holder",
            "instruction": "The full name of the account holder as printed on the statement.",
            "type": "text",
            "required": true,
            "is_full_name": true
          },
          {
            "key": "closing_balance",
            "name": "Closing balance",
            "instruction": "The closing balance amount.",
            "type": "number",
            "required": true
          }
        ]
      }
    ],
    "document_ai_missing_required_fields_action": "REVIEW",
    "document_ai_name_mismatch_action": "REVIEW"
  },
  "next": "final_decision"
}
```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](https://docs.didit.me/de/management-api/workflows/feature-configs.md#document-ai).### Endpoints und Entwurfs-LebenszyklusDie Bearbeitung von Graphen erfolgt pro Anwendung über die Konsolen- bzw. Management-Endpoints (Benutzer-Bearer + `read:workflows`/`write:workflows`). Ein Graph kann nur in einer **Entwurfs**version bearbeitet werden, daher lautet der Lebenszyklus **Entwurf erstellen → Graph festlegen → veröffentlichen**:| Methode | Pfad | Zweck |
| - | - | - |
| `GET` | `…/verification-settings/{settings_uuid}/workflow-graph/` | Aktueller Graph + `status`/`is_editable` |
| `POST` | `…/application/{app}/workflow-graph/validate/` (body `{ "graph": … }`) | Trockenlauf-Validierung |
| `GET` | `…/application/{app}/workflow-graph/field-definitions/` | Verzweigbare Felder + gültige Operatoren |
| `POST` | `…/verification-settings/{settings_uuid}/create-draft/` | Bearbeitbarer Entwurf aus einer veröffentlichten Version |
| `PUT` | `…/verification-settings/{settings_uuid}/workflow-graph/` (body `{ "graph": … }`) | Graph speichern |
| `PATCH` | `…/verification-settings/{settings_uuid}/` (body `{ "status": "published" }`) | Entwurf veröffentlichen |#### ValidierungswarnungenDer 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:```json theme={null}
{
  "type": "branch_outcome_contradiction",
  "node_id": "after_ocr",
  "branch_id": "b1",
  "severity": "warning",
  "message": "Branch 1 only matches sessions where ID Verification Status is Approved or In Review, but every path from it ends in the session outcome \"Declined\". Check the condition or the outcome.",
  "params": { "branchNumber": 1, "field": "ID Verification Status", "allowed": "Approved or In Review", "outcome": "Declined" }
}
```| `type` | Bedeutung |
| - | - |
| `branch_outcome_contradiction` | Die Bedingung des Zweigs und das Ergebnis, das jeder Pfad von dort erreicht, widersprechen sich, z. B. wenn `kyc.status NOT EQUALS Declined` in ein `Declined`-Ergebnis führt. Das Ergebnis kann mehrere Schritte weiter unten im Pfad liegen. |
| `branch_condition_unreachable` | Der Zweig kann nie zutreffen, weil jeder Pfad, der diese Verzweigung erreicht, das Statusfeld bereits auf Werte beschränkt, die die Bedingung ausschließt. |
| `else_branch_unreachable` | Der Else-Zweig kann nie ausgeführt werden: Die übrigen Zweige decken bereits jeden Wert ab, den das Feld hier annehmen 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.```json theme={null}
{
  "start_node": "ocr_1",
  "nodes": {
    "ocr_1": { "node_type": "feature", "feature": "OCR", "label": "ID Verification", "next": "after_ocr" },
    "after_ocr": {
      "node_type": "branch",
      "label": "Route after ID verification",
      "branches": [
        { "id": "declined", "logic": "or", "rules": [ { "field": "kyc.status", "operator": "equals", "value": "Declined" } ], "goto": "decline" },
        { "id": "software_engineer", "logic": "and", "rules": [ { "field": "kyc.extra_fields.profession", "operator": "fuzzy_match", "value": "Software Engineer", "score": 80 } ], "goto": "proof_of_funds" },
        { "id": "else", "logic": "and", "rules": [], "goto": "final_decision" }
      ]
    },
    "proof_of_funds": {
      "node_type": "feature",
      "feature": "DOCUMENT_AI",
      "label": "Proof of Funds",
      "config": {
        "document_ai_documents": [
          { "document_key": "proof_of_funds", "title": "Proof of Funds", "description": "Upload a recent bank statement.",
            "fields": [
              { "key": "account_holder", "name": "Account holder", "type": "text", "required": true },
              { "key": "closing_balance", "name": "Closing balance", "type": "number", "required": true }
            ] }
        ],
        "document_ai_missing_required_fields_action": "REVIEW"
      },
      "next": "final_decision"
    },
    "final_decision": { "node_type": "status", "session_status": "Determine", "label": "Final decision" },
    "decline": { "node_type": "status", "session_status": "Declined", "label": "Declined" }
  }
}
```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](https://docs.didit.me/de/integration/mcp/tools.md).


## OpenAPI

````yaml de/openapi-25.json POST /v3/workflows/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/workflows/:
    post:
      tags:
        - Workflows
      summary: Workflow erstellen
      description: >-
        Erstellen Sie einen einfachen Workflow. Senden Sie `features` in der
        Ausführungsreihenfolge (Reihenfolgeregeln gelten); Standardwert ist
        `published` v1. Der Body akzeptiert NUR die in `SimpleWorkflowRequest`
        aufgeführten Felder – jeder andere Schlüssel (einschließlich
        `workflow_type`) wird mit 400 abgelehnt. Nicht idempotent – jeder Aufruf
        erstellt einen neuen Workflow. Maximal 50 Workflows pro Anwendung.
      operationId: create_workflow
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimpleWorkflowRequest'
            examples:
              Simple KYC:
                summary: >-
                  Linearer Workflow für Ausweisverifizierung, Liveness-Erkennung
                  und Gesichtsabgleich
                value:
                  workflow_label: Standard KYC
                  features:
                    - feature: OCR
                      config:
                        duplicated_user_action: review
                    - feature: LIVENESS
                      config:
                        face_liveness_method: passive
                    - feature: FACE_MATCH
                      config:
                        face_match_score_decline_threshold: 40
                        face_match_score_review_threshold: 60
              KYC + AML:
                summary: AML nach Ausweisverifizierung ausführen
                value:
                  workflow_label: KYC with AML
                  features:
                    - feature: OCR
                    - feature: AML
                      config:
                        aml_score_review_threshold: 70
                        aml_score_approve_threshold: 30
              Questionnaire workflow:
                summary: >-
                  Einen mit POST /v3/questionnaires/ erstellten Fragebogen
                  ausführen
                value:
                  workflow_label: Source of Funds
                  features:
                    - feature: QUESTIONNAIRE
                      config:
                        questionnaire_uuid: 11111111-2222-3333-4444-555555555555
                        review_questionnaire_manually: true
      responses:
        '201':
          description: >-
            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.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowDetail'
              examples:
                Created (abbreviated):
                  summary: Wichtigste Felder des vollständigen Konfigurationsobjekts
                  value:
                    uuid: c3d4e5f6-7890-12cd-ef34-333333333333
                    workflow_id: c3d4e5f6-7890-12cd-ef34-333333333333
                    workflow_label: Standard KYC
                    workflow_type: null
                    is_default: false
                    is_archived: false
                    total_price: 0.15
                    min_price: 0.15
                    max_price: 0.15
                    features: OCR + LIVENESS + FACE_MATCH
                    is_simple_workflow: false
                    is_editable: false
                    workflow_url: https://verify.didit.me/u/w9TkPOx8RWG3UAz5ZRQGVQ
                    workflow_graph:
                      start_node: ocr
                      nodes: ... one node per feature plus a final status node ...
                    max_retry_attempts: 3
                    retry_window_days: 7
                    session_expiration_time: 604800
                    version: 1
                    status: published
                    published_at: '2026-05-17T10:30:00Z'
                    created_at: '2026-05-17T10:30:00Z'
                    updated_at: '2026-05-17T10:30:00Z'
        '400':
          description: >-
            Validierungsfehler. Häufige Ursachen: ein Schlüssel auf oberster
            Ebene außerhalb der akzeptierten Whitelist (z. B. `workflow_type`),
            ein unbekannter `feature`-Wert, eine Funktion vor ihrer Abhängigkeit
            platziert (z. B. `FACE_MATCH` vor `OCR`), eine passive Funktion
            (`AML`, `IP_ANALYSIS`, `DATABASE_VALIDATION`, `KYB_KEY_PEOPLE`) als
            erster Schritt verwendet, eine `QUESTIONNAIRE`-Funktion, deren
            `config.questionnaire_uuid` für diese Anwendung nicht existiert,
            eine `SIGNATURE`-Funktion, die ohne zu unterzeichnendes Dokument
            live gehen würde, eine `SIGNATURE`-Funktion mit `signature_level:
            "aes"`, während Advanced (AES) nicht verfügbar ist
            (`aes_not_available`, siehe `signature_availability` im Workflow)
            oder ein Schwellenwert außerhalb des gültigen Bereichs. Der Body ist
            ein DRF-Validierungsfehlerobjekt — Schlüssel sind Feldnamen, Werte
            sind Arrays mit lesbaren Meldungen.
          content:
            application/json:
              examples:
                Advanced (AES) not available:
                  value:
                    features:
                      signature_level:
                        - >-
                          Node 'signature': Advanced (AES) is not available yet
                          (aes_not_available).
                Signature step with no document:
                  value:
                    features:
                      non_field_errors:
                        - >-
                          Node 'signature': Add a document to sign, or let each
                          session bring its own.
                Missing feature:
                  value:
                    features:
                      - At least one feature is required.
                Unknown top-level field:
                  value:
                    workflow_type:
                      - >-
                        The v3 workflow API only accepts `workflow_label`,
                        `is_default`, `status`, `features`,
                        `is_white_label_enabled`, `is_desktop_allowed`,
                        `max_retry_attempts`, `retry_window_days`,
                        `session_expiration_time`, `face_liveness_max_attempts`,
                        `face_match_max_attempts`.
                Unknown feature:
                  value:
                    features:
                      - >-
                        Invalid feature 'FOO'. Allowed values: AGE_ESTIMATION,
                        AML, DATABASE_VALIDATION, EMAIL_VERIFICATION,
                        FACE_MATCH, IP_ANALYSIS, KYB_DOCUMENTS, KYB_KEY_PEOPLE,
                        KYB_REGISTRY, LIVENESS, NFC, OCR, PHONE_VERIFICATION,
                        PROOF_OF_ADDRESS, QUESTIONNAIRE.
                Ordering:
                  value:
                    features:
                      - 'Feature ''FACE_MATCH'' must appear after one of: OCR.'
                Questionnaire not found:
                  value:
                    features: >-
                      Questionnaire '11111111-2222-3333-4444-555555555555' was
                      not found for this application. Create the questionnaire
                      first, then use its questionnaire_id.
        '403':
          description: >-
            Der API-Schlüssel fehlt, ist fehlerhaft formatiert, abgelaufen oder
            auf eine andere Anwendung beschränkt. Erneuern Sie ihn über die
            [Auth API](/de/auth-api/get-credentials) und versuchen Sie es
            erneut.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: You do not have permission to perform this action.
        '415':
          description: >-
            Nicht unterstützter Medientyp. Setzen Sie `Content-Type:
            application/json` und senden Sie einen JSON-Body.
        '429':
          description: >-
            Rate-Limit überschritten. Wiederholen Sie die Anfrage mit
            exponentiellem Backoff.
        '500':
          description: >-
            Unerwarteter Serverfehler beim Erstellen des Workflows. Kann sicher
            wiederholt werden.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/workflows/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "workflow_label": "Standard KYC",
                "features": [
                  {"feature": "OCR"},
                  {"feature": "LIVENESS", "config": {"face_liveness_method": "passive"}},
                  {"feature": "FACE_MATCH", "config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60}}
                ]
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.workflows.create(
                workflow_label="Standard KYC",
                features=[{
                    "feature": "OCR",
                    "config": {"duplicated_user_action": "review"},
                }, {
                    "feature": "LIVENESS",
                    "config": {"face_liveness_method": "passive"},
                }, {
                    "feature": "FACE_MATCH",
                    "config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60},
                }],
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.workflows.create({
              workflow_label: "Standard KYC",
              features: [{
                feature: "OCR",
                config: { duplicated_user_action: "review" },
              }, {
                feature: "LIVENESS",
                config: { face_liveness_method: "passive" },
              }, {
                feature: "FACE_MATCH",
                config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
              }],
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Create(ctx, didit.SimpleWorkflowRequest{\n\tWorkflowLabel: didit.String(\"Standard KYC\"),\n\tFeatures: []didit.SimpleWorkflowFeature{{\n\t\tFeature: \"OCR\",\n\t\tConfig:  didit.Some(map[string]any{\"duplicated_user_action\": \"review\"}),\n\t}, {\n\t\tFeature: \"LIVENESS\",\n\t\tConfig:  didit.Some(map[string]any{\"face_liveness_method\": \"passive\"}),\n\t}, {\n\t\tFeature: \"FACE_MATCH\",\n\t\tConfig:  didit.Some(map[string]any{\"face_match_score_decline_threshold\": 40, \"face_match_score_review_threshold\": 60}),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.SimpleWorkflowFeature;

            import me.didit.types.SimpleWorkflowRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.workflows().create(SimpleWorkflowRequest.builder()
                    .workflowLabel("Standard KYC")
                    .features(List.of(
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("OCR"))
                                    .config(Map.of("duplicated_user_action", "review"))
                                    .build(),
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("LIVENESS"))
                                    .config(Map.of("face_liveness_method", "passive"))
                                    .build(),
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("FACE_MATCH"))
                                    .config(Map.of("face_match_score_decline_threshold", 40, "face_match_score_review_threshold", 60))
                                    .build()))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->workflows->create([
                'workflow_label' => 'Standard KYC',
                'features' => [[
                    'feature' => 'OCR',
                    'config' => ['duplicated_user_action' => 'review'],
                ], [
                    'feature' => 'LIVENESS',
                    'config' => ['face_liveness_method' => 'passive'],
                ], [
                    'feature' => 'FACE_MATCH',
                    'config' => ['face_match_score_decline_threshold' => 40, 'face_match_score_review_threshold' => 60],
                ]],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.workflows.create(
              workflow_label: "Standard KYC",
              features: [{
                feature: "OCR",
                config: { duplicated_user_action: "review" },
              }, {
                feature: "LIVENESS",
                config: { face_liveness_method: "passive" },
              }, {
                feature: "FACE_MATCH",
                config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
              }]
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Workflows.CreateAsync(new
            SimpleWorkflowRequest

            {
                WorkflowLabel = "Standard KYC",
                Features = new SimpleWorkflowFeature[]
                {
                    new()
                    {
                        Feature = "OCR",
                        Config = new Dictionary<string, object> { ["duplicated_user_action"] = "review" },
                    },
                    new()
                    {
                        Feature = "LIVENESS",
                        Config = new Dictionary<string, object> { ["face_liveness_method"] = "passive" },
                    },
                    new()
                    {
                        Feature = "FACE_MATCH",
                        Config = new Dictionary<string, object> { ["face_match_score_decline_threshold"] = 40, ["face_match_score_review_threshold"] = 60 },
                    },
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SimpleWorkflowRequest:
      type: object
      description: >-
        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.
      required:
        - features
      properties:
        workflow_label:
          type: string
          maxLength: 50
          default: ID Verification
          description: >-
            Anzeigename für den Workflow (max. 50 Zeichen). Standardmäßig `"ID
            Verification"`, wenn weggelassen – immer angeben, damit Workflows
            unterscheidbar bleiben.
          example: Standard KYC
        is_default:
          type: boolean
          description: Legen Sie diesen Workflow als Standard für neue Sitzungen fest.
        status:
          type: string
          enum:
            - draft
            - published
          description: >-
            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.
        features:
          type: array
          minItems: 1
          description: >-
            Verifizierungsfunktionen in Ausführungsreihenfolge. Die API
            verknüpft jedes Element mit dem nächsten und fügt automatisch einen
            abschließenden Statusknoten hinzu.
          items:
            $ref: '#/components/schemas/SimpleWorkflowFeature'
        is_white_label_enabled:
          type: boolean
          description: >-
            White-Label-Anpassung für Sitzungen aktivieren, die mit diesem
            Workflow erstellt wurden.
          default: false
        is_desktop_allowed:
          type: boolean
          description: >-
            Ermöglicht die Ausführung des Verifizierungs-Workflows in
            Desktop-Browsern.
          default: false
        max_retry_attempts:
          type: integer
          minimum: 0
          maximum: 10
          default: 3
          description: >-
            Maximale Anzahl an Wiederholungsversuchen, die nach einer
            abgelehnten Verifizierung zulässig sind. `0` blockiert den Benutzer
            nach der ersten Ablehnung.
        retry_window_days:
          type: integer
          minimum: 1
          maximum: 365
          nullable: true
          default: 7
          description: >-
            Gleitendes Zeitfenster in Tagen zur Zählung der
            Wiederholungsversuche. `null` erzwingt ein Limit für den gesamten
            Zeitraum.
        face_liveness_max_attempts:
          type: integer
          minimum: 1
          maximum: 3
          default: 3
          description: >-
            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.
        face_match_max_attempts:
          type: integer
          minimum: 1
          maximum: 3
          default: 3
          description: >-
            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.
        session_expiration_time:
          type: integer
          minimum: 3600
          maximum: 2419200
          default: 604800
          description: >-
            Sekunden, bis eine nicht abgeschlossene Sitzung abläuft. Mindestens
            1 Stunde (3600), maximal 4 Wochen (2419200).
    WorkflowDetail:
      type: object
      description: >-
        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`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Versionsspezifische Kennung (`settings_uuid`). Jede Version eines
            Workflows hat ihre eigene.
        workflow_id:
          type: string
          format: uuid
          description: >-
            Stabiler Identifikator, der von jeder Version des Workflows geteilt
            wird. Damit erstellte Sitzungen verwenden die neueste
            veröffentlichte Version.
        workflow_label:
          type: string
          description: Anzeigename des Workflows.
        workflow_type:
          type: string
          nullable: true
          enum:
            - kyc
            - kyb
            - adaptive_age_verification
            - biometric_authentication
            - address_verification
            - questionnaire_verification
            - email_verification
            - phone_verification
            - null
          description: >-
            Workflow-Vorlage. `null` für Graph-Workflows, die ohne Vorlage
            erstellt wurden.
        is_default:
          type: boolean
          description: Gibt an, ob dies der Standard-Workflow der Anwendung ist.
        is_archived:
          type: boolean
          description: Archivierte Workflows können keine neuen Sitzungen starten.
        version:
          type: integer
          description: Versionsnummer innerhalb des Workflows.
        status:
          type: string
          enum:
            - draft
            - published
          description: >-
            Entwurfsversionen können bearbeitet werden; veröffentlichte
            Versionen sind unveränderlich und werden für neue Sitzungen
            verwendet.
        published_at:
          type: string
          format: date-time
          nullable: true
          description: Wann diese Version veröffentlicht wurde. `null` für Entwürfe.
        is_simple_workflow:
          type: boolean
          description: >-
            `true`, wenn der Workflow keinen benutzerdefinierten
            `workflow_graph` hat.
        is_editable:
          type: boolean
          description: '`true` nur für `draft`-Versionen.'
        workflow_url:
          type: string
          format: uri
          description: Öffentliche URL, die eine Sitzung mit diesem Workflow startet.
        workflow_graph:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            Graphstruktur des Workflows (Knoten und Kanten). `null` für einfache
            Workflows.
        features:
          type: string
          description: >-
            Aktivierte Funktionen, verbunden mit `" + "`, zum Beispiel `"OCR +
            LIVENESS"`.
        total_price:
          type: number
          nullable: true
          description: Preis pro Sitzung; bei Graph-Workflows der teuerste Pfad.
        min_price:
          type: number
          nullable: true
          description: Preis des günstigsten Pfads durch den Workflow.
        max_price:
          type: number
          nullable: true
          description: Preis des teuersten Pfads durch den Workflow.
        special_add_on_prices:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            Organisationsspezifische Zusatzpreise oder `null`, wenn keine
            festgelegt sind.
        max_retry_attempts:
          type: integer
          description: >-
            Zulässige Wiederholungsversuche nach einer abgelehnten
            Verifizierung.
        retry_window_days:
          type: integer
          nullable: true
          description: Tage, während derer Wiederholungsversuche zulässig sind.
        session_expiration_time:
          type: integer
          description: Sekunden, bis eine nicht abgeschlossene Sitzung abläuft.
        questionnaire:
          type: object
          nullable: true
          additionalProperties: true
          description: Der an den Workflow angehängte Fragebogen oder `null`.
        kyb_role_settings:
          type: array
          items:
            type: object
            additionalProperties: true
          description: Verifizierungseinstellungen pro Rolle für KYB-Schlüsselpersonen.
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        signature_availability:
          type: object
          description: >-
            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.
          properties:
            simple:
              type: boolean
              description: Simple ist immer verfügbar.
            aes:
              type: boolean
              description: >-
                Gibt an, ob Advanced (AES) jetzt signieren kann. Solange dies
                `false` ist, wird das Speichern eines neuen Schritts mit
                `signature_level: "aes"` mit `aes_not_available` abgelehnt.
            qes:
              type: boolean
              description: >-
                Gibt an, ob Qualifiziert (QES) jetzt signieren kann. Es ist
                `false`, bis ein qualifizierter Anbieter angebunden ist.
        is_bank_verification_enabled:
          type: boolean
          description: >-
            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:
          type: object
          additionalProperties: true
          description: >-
            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](/de/management-api/workflows/feature-configs#bank-verifizierung).
          example: {}
        is_geolocation_enabled:
          type: boolean
          description: >-
            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:
          type: object
          additionalProperties: true
          description: >-
            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.
          example: {}
      additionalProperties: true
    SimpleWorkflowFeature:
      type: object
      required:
        - feature
      properties:
        feature:
          type: string
          description: >-
            Auszuführende Funktion. Verwenden Sie die hier gezeigten Werte in
            Großbuchstaben.
          enum:
            - OCR
            - NFC
            - LIVENESS
            - FACE_MATCH
            - PROOF_OF_ADDRESS
            - QUESTIONNAIRE
            - DOCUMENT_AI
            - PHONE_VERIFICATION
            - EMAIL_VERIFICATION
            - DATABASE_VALIDATION
            - AML
            - IP_ANALYSIS
            - AGE_ESTIMATION
            - KYB_REGISTRY
            - KYB_DOCUMENTS
            - KYB_KEY_PEOPLE
            - SIGNATURE
        config:
          type: object
          description: >-
            Funktionsspezifische Einstellungen. Geben Sie für `QUESTIONNAIRE`
            `questionnaire_uuid` mit der `questionnaire_id` an, die vom Endpoint
            zum Erstellen von Fragebögen zurückgegeben wird. Für `SIGNATURE`
            benötigt ein Workflow, der live geht, ein zu unterzeichnendes
            Dokument: Setzen Sie `signature_documents_source` auf `session` oder
            `both`, damit jede Sitzung eigene Dokumente bereitstellen kann, oder
            senden Sie `status: "draft"` und fügen Sie die Dokumente vor der
            Veröffentlichung hinzu. `signature_level: "aes"` wird mit
            `aes_not_available` abgelehnt, solange `signature_availability.aes`
            im Workflow `false` ist. Für `OCR` wählt `methods` aus, welche
            Methoden der Ausweisverifizierung jedes Land nutzen darf
            (Dokumentenerfassung, dokumentenloser Abgleich mit einer staatlichen
            oder anderen maßgeblichen Quelle und digitale Identitäts-Wallets);
            wird es weggelassen, gilt für jedes Land ausschließlich die
            Dokumentenerfassung. Für `SIGNATURE` siehe
            [E-Signatur-Einstellungen](/de/management-api/workflows/feature-configs#e-signatur):
            `signature_level` akzeptiert derzeit `simple` (Standardwert, keine
            Ausweisverifizierung, E-Mail oder Telefon erforderlich) und `aes`.
            Workflow-Dokumente und deren Felder werden in der Konsole verwaltet;
            senden Sie Dokumente und Felder über die API daher pro Sitzung mit
            `signature_documents_source: "session"`.
          additionalProperties: true
        label:
          type: string
          description: Optionales internes Label für diesen Workflow-Knoten.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        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.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.